Elasticsearch集羣實時同步數據庫數據(mysql)

幫助文檔:
jdbc輸入插件
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html
實時同步
https://www.elastic.co/cn/blog/logstash-jdbc-input-plugin#
https://segmentfault.com/a/1190000014387486
輸出插件:
https://www.elastic.co/guide/en/logstash/current/output-plugins.html#output-plugins

實現低延遲的檢索到ES中的數據或者進行其他數據分析處理。

logstash mysql 準實時同步到 elasticsearch
mysql 作爲成熟穩定的數據持久化解決方案,廣泛地應用在各種領域,但是在數據分析方面稍有不足,而 elasticsearch 作爲數據分析領域的佼佼者,剛好可以彌補這項不足,而我們要做的只需要將 mysql 中的數據同步到 elasticsearch 中即可,而 logstash 剛好就可以支持,所有你需要做的只是寫一個配置文件而已.

安裝logstash:
這裏我用的es集羣式6.0.1所以logstash也是6.0.1

wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.1.zip
unzip logstash-6.2.3.zip && cd logstash-6.0.1

安裝jdbc和elasticsearch插件

bin/logstash-plugin install logstash-input-jdbc
bin/logstash-plugin install logstash-output-elasticsearch

獲取 jdbc mysql 驅動
地址:https://dev.mysql.com/downloads/connector/j/3.1.html

wget https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-5.1.46.zip
unzip mysql-connector-java-5.1.46.zip

編輯配置文件:
在logstash的config目錄下
使用 logstash-input-jdbc 插件讀取 mysql 的數據,這個插件的工作原理比較簡單,就是定時執行一個 sql,然後將 sql 執行的結果寫入到流中,增量獲取的方式沒有通過 binlog 方式同步,而是用一個遞增字段作爲條件去查詢,每次都記錄當前查詢的位置,由於遞增的特性,只需要查詢比當前大的記錄即可獲取這段時間內的全部增量,一般的遞增字段有兩種,AUTO_INCREMENT 的主鍵 id 和 ON UPDATE CURRENT_TIMESTAMP 的 update_time 字段,id 字段只適用於那種只有插入沒有更新的表,update_time 更加通用一些,建議在 mysql 表設計的時候都增加一個 update_time 字段

input {
  jdbc {
    jdbc_driver_library => "/usr/local/mysql-connector-java-5.1.48/mysql-connector-java-5.1.48-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://192.168.2.16:3306/user?useSSL=false"
    jdbc_user => "root"
    jdbc_password => "Zksw@2019"
    schedule => "* * * * *"
    statement => "SELECT * FROM contacts"
    #statement => "SELECT * FROM table WHERE update_time >= :sql_last_value"
    jdbc_validate_connection => true
    #use_column_value => true
    #tracking_column_type => "timestamp"
    #tracking_column => "t_user"
    #last_run_metadata_path => "syncpoint_table"
  }
}
output {
       #stdout { codec => json_lines }
       elasticsearch {
                hosts => "0.0.0.0:9200"
                document_type => "contact"
                #user => "elasticsearch"
                #password => "123456"
                index => "contacts"
                document_id => "%{uid}"
        }
}

字段解釋:
jdbc_driver_library: jdbc mysql 驅動的路徑。
jdbc_driver_class: 驅動類的名字,mysql 填 com.mysql.jdbc.Driver 就好了
jdbc_connection_string: mysql 地址
jdbc_user: mysql 用戶
jdbc_password: mysql 密碼
schedule: 執行 sql 時機,類似 crontab 的調度
statement: 要執行的 sql,以 “:” 開頭是定義的變量,可以通過 parameters 來設置變量,這裏的 sql_last_value 是內置的變量,表示上一次 sql 執行中 update_time 的值。
use_column_value: 使用遞增列的值
tracking_column_type: 遞增字段的類型,numeric 表示數值類型, timestamp 表示時間戳類型
tracking_column: 遞增字段的名稱,這裏使用 update_time 這一列,這列的類型是 timestamp
last_run_metadata_path: 同步點文件,這個文件記錄了上次的同步點,重啓時會讀取這個文件,這個文件可以手動修改
jdbc_validate_connection:連接池配置。使用前驗證連接。
OUPUT:
hosts: es 集羣地址
user: es 用戶名
password: es 密碼
index: 導入到 es 中的 index 名。
document_id: 導入到 es 中的文檔(更新的主鍵id) id,這個需要設置成主鍵,否則同一條記錄更新後在 es 中會出現兩條記錄,%{id} 表示引用 mysql 表中 id 字段的值
document_type:類型事件,被用於設置輸出文檔的tpye類型。默認log

創建的數據庫叫user,表叫做contacts:

create table contacts (
    uid serial,
    email VARCHAR(80) not null,
    first_name VARCHAR(80) NOT NULL,
    last_name VARCHAR(80) NOT NULL
);
INSERT INTO contacts(email, first_name, last_name) VALUES('[email protected]', 'Jim', 'Smith');
INSERT INTO contacts(email, first_name, last_name) VALUES(null, 'John', 'Smith');
INSERT INTO contacts(email, first_name, last_name) VALUES('[email protected]', 'Carol', 'Smith');
INSERT INTO contacts(email, first_name, last_name) VALUES('[email protected]', 'Sam', null);

運行:
注意不要使用root用戶去運行。

../bin/logstash -f ./sync_table.cfg

在這裏插入圖片描述
es查看:
在這裏插入圖片描述
測試更新和插入,看es是否實時同步數據庫:

UPDATE contacts SET last_name = 'Smith' WHERE email = '[email protected]';
UPDATE contacts SET email = '[email protected]' WHERE uid = 3;
INSERT INTO contacts(email, first_name, last_name) VALUES('[email protected]', 'New', 'Smith');

多表同步:
一個 logstash 實例可以藉助 pipelines 機制同步多個表,只需要寫多個配置文件就可以了,假設我們有兩個表 table1 和 table2,對應兩個配置文件 sync_table1.cfg 和 sync_table2.cfg

在 config/pipelines.yml 中配置
- pipeline.id: table1
  path.config: "config/sync_table1.cfg"
- pipeline.id: table2
  path.config: "config/sync_table2.cfg"
直接 bin/logstash 啓動即可

@timestamp 字段
默認情況下 @timestamp 字段是 logstash-input-jdbc 添加的字段,默認是當前時間,這個字段在數據分析的時候非常有用,但是有時候我們希望使用數據中的某些字段來指定這個字段,這個時候可以使用 filter.date, 這個插件是專門用來設置 @timestamp 這個字段的
比如我有我希望用字段 timeslice 來表示 @timestamp,timeslice 是一個字符串,格式爲 %Y%m%d%H%M

filter {
  date {
    match => [ "timeslice", "yyyyMMddHHmm" ]
    timezone => "Asia/Shanghai"
  }
}

把這一段配置加到 sync_table.cfg 中,現在 @timestamp 和 timeslice 一致了

在kibana中搜索數據:
將部分數據遷移到Elasticsearch的一個重要功能是能夠使用Kibana生成具有洞察力的出色可視化效果。
安裝幫助文檔:https://www.elastic.co/guide/cn/kibana/current/targz.html#targz-configuring
配置幫助文檔:https://www.elastic.co/guide/cn/kibana/current/settings.html
kibana幫助文檔:https://www.elastic.co/guide/cn/kibana/current/createvis.html
下載並安裝:

wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.1-linux-x86_64.tar.gz
sha1sum kibana-6.0.1-linux-x86_64.tar.gz
tar -zxf kibana-6.0.1-linux-x86_64.tar.gz 
cd kibana-6.0.1-linux-x86_64/

下載darwin包
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.1-darwin-x86_64.tar.gz
tar -zxf kibana/kibana-6.0.1-darwin-x86_64.tar.gz
cd kibana/kibana-6.0.1-darwin-x86_64/

從命令行啓動kibana

./bin/kibana

默認 Kibana 在前臺啓動,打印日誌到標準輸出 (stdout),可以通過 Ctrl-C 命令終止運行。

.tar.gz 文件目錄
.tar.gz 整個包是獨立的。默認情況下,所有的文件和目錄都在 $KIBANA_HOME — 解壓包時創建的目錄下。這樣非常方便,因爲您不需要創建任何目錄來使用 Kibana,卸載 Kibana 就是簡單地刪除 $KIBANA_HOME 目錄。但還是建議修改一下配置文件和數據目錄,這樣就不會刪除重要數據。

home
Kibana home 目錄或 $KIBANA_HOME 。
解壓包時創建的目錄
bin
二進制腳本,包括 kibana 啓動 Kibana 服務和 kibana-plugin 安裝插件。
$KIBANA_HOME\bin
config
配置文件,包括 kibana.yml 。
$KIBANA_HOME\config
data
Kibana 和其插件寫入磁盤的數據文件位置。
$KIBANA_HOME\data
optimize
編譯過的源碼。某些管理操作(如,插件安裝)導致運行時重新編譯源碼。
$KIBANA_HOME\optimize
plugins
插件文件位置。每一個插件都有一個單獨的二級目錄。
$KIBANA_HOME\plugins

配置kibana配置文件:
Kibana 默認情況下從 $KIBANA_HOME/config/kibana.yml 加載配置文件。
在這裏插入圖片描述
server.port: 5601 kibana 打開的端口
server.host: “0.0.0.0” kibana 偵聽的地址
elasticsearch.url: “http://192.168.10.181:9200” 和 elasticsearch 建立聯繫
kibana.index: “.kibana” 在 elasticsearch 中添加.kibana 索引

瀏覽器登陸:http://ip地址:5621
第一次登錄需要添加一個 elasticsearch 索引
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章