1. 程式人生 > >ElasticSearch學習:logstash安裝並使用logstash-jdbc-input與mysql資料庫同步

ElasticSearch學習:logstash安裝並使用logstash-jdbc-input與mysql資料庫同步

前言:

大多數情況下我們的資料都存放在了資料庫中,但是elasticsearch他有自己的索引庫,那麼如果我們在做搜尋的是時候就需要將資料庫中的資料同步到elasticsearch中,在這裡我們使用logstash的logstash-jdbc-input的外掛進行與資料庫的同步,對於logstash與資料庫同步,我們可以設定elasticsearch與資料庫同步的時間,使用這種方式進行同步還是很方便的。

一、安裝logstash

1.1下載logstash

注意下載的版本要和你的elasticsearch的版本號一致,我的版本elasticsearch5.5.2


1..2安裝logstash

1.2.1如果你是windows系統,直接解壓就可以


1.2.2linux系統,以cenos7舉例,進行解壓

tar –zxvf logstash-5-5-2
1.3啟動

1.3.1windows系統進行啟動,輸入命令

bin/logstash -e 'input { stdin { } } output { stdout {codec=>rubydebug} }'
然後你會發現終端在等待你的輸入。沒問題,敲入 Hello World,回車,然後看看會返回什麼結果!



1.3.2linux系統啟動,進入bin目錄

./logstash -e 'input { stdin { } } output { stdout {} }'
同上,輸入hello word,顯示一下內容說明安裝成功

二、配置logstash-jdbc-input

這裡先宣告一下:

對於logstash5.x版本他自身已經集成了這個外掛,不需要我們去單獨安裝,直接使用即可,我這裡說一下與mysql進行同步的簡單配置

2.1在logstash檔案目錄下建立一個資料夾,命名隨意,我這裡是mysqletc


2.1.1首先建立一個mysql.conf的檔案

input {
    stdin {
    }
    jdbc {
      # mysql 資料庫連結,shop為資料庫名
      jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/esshop"
      # 使用者名稱和密碼
      jdbc_user => "root"
      jdbc_password => "root"
      # 驅動
      jdbc_driver_library => "D:/elasticsearch/logstash-5.5.2/mysqletc/mysql-connector-java-5.0.8.jar"
      # 驅動類名
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"
      # 執行的sql 檔案路徑+名稱
      statement_filepath => "D:/elasticsearch/logstash-5.5.2/mysqletc/shop.sql"
      # 設定監聽間隔  各欄位含義(由左至右)分、時、天、月、年,全部為*預設含義為每分鐘都更新
      schedule => "* * * * *"
      # 索引型別
      type => "content"
    }
}

filter {
    json {
        source => "message"
        remove_field => ["message"]
    }
}

output {
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "cmscontent"
        document_id => "%{id}"
    }
    stdout {
        codec => json_lines
    }
}

2.1.2建立一個sql檔案,我這裡命名為shop.sql和上邊的配置檔案一致

SELECT
	*
FROM
	content
2.1.3最後需要把一個jdbc驅動放到這個資料夾下,用來連線mysql資料庫(一定不要忘記)

2.2啟動logstash

啟動命令

./logstash -f ../mysqletc/mysql.conf

啟動完成後,稍等片刻,我們就可以看到同步的資料了

GET /_search  

logstash會一直進行與資料庫的資訊進行同步

三、問題:

1.時間格式問題:

如果我們在同步mysql資料庫中,涉及到時間的欄位,格式設定成datetime,我們建立的index時間mapping設定為type:date,format:yyyy-MM-dd HH:mm:ss;那麼直接進行同步,就會同步失敗。如圖:


原因:在mysql直接取出來的時間欄位,他是帶有時區的時間格式,與es建立mapping中的yyyy-MM-dd HH:mm:ss不符合,所有導致同步失敗。

解決方案:在同步過程中,將時間進行處理,我這裡通過sql語句將時間進行格式化,在同步到es中
date_format(created,'%Y-%m-%d %H:%i:%s' ) as created

2.資料同步問題:

當然這個同步對於新增或更新資料還是很友好的,對於刪除資料就會有影響。

通過查資料對我來說以下方案比較合適:

在原有的mysql資料庫表中,新增一個欄位status, 預設值為ok,如果要刪除資料,實則用update操作,status改為deleted. 

這樣,就能同步到es中。es中以status狀態值區分該行資料是否存在。deleted代表已刪除,ok代表正常。