同步原理:
第一次發送sql請求查詢,修改時間參數值是為系統最開始的時間(1970年),可以查詢的
到所有大于1970年的數據,并且會將最后一條數據的update_time時間記錄下來,
作為下一次定時查詢的條件
一、啟動es + kibana
如何安裝,以及如何運行,這里就不做描述,沒有裝過的,可以參考我的這篇文章
http://www.lxweimin.com/p/f52d9c843bd8
二、安裝mysql
查詢mysql版本
docker search mysql
通過docker下載MySQL5.7版本
如何安裝docker,不是本文重點,這里不做多描述
docker pull mysql:5.7 (這里選擇的是第一個mysql鏡像, :5.7選擇的5.7版本)
docker pull mysql # 拉取最新版mysql鏡像
運行mysql
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
賬號:root
密碼:123456
通過工具連接mysql
新建數據庫
DROP DATABASE IF EXISTS `test`;
CREATE DATABASE `test` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE test;
#商品表
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `goods` VALUES (1, '黎明電腦', '2020-07-01 00:40:19');
INSERT INTO `goods` VALUES (2, '黎明手機', '2020-07-01 00:40:32');
#用戶表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES (1, '黎明1', '2020-07-01 00:40:01');
INSERT INTO `user` VALUES (2, '黎明2', '2020-07-01 00:40:09');
現在已經啟動了3臺容器了
三、下載logstash源碼包
官方地址
https://www.elastic.co/cn/downloads/logstash
國內加速下載網址
https://www.newbe.pro/Mirrors/Mirrors-Logstash/
下載地址
wget https://mirrors.huaweicloud.com/logstash/6.7.2/logstash-6.7.2.zip
下載zip命令解壓
yum -y install zip
解壓
unzip logstash-6.7.2.zip
四、下載mysql驅動
可能會有人疑問?為什么要下載mysql驅動
因為logstash需要連接mysql,并查詢表數據,才確定是否同步數據
如下,是maven倉庫,所有版本mysql驅動連接
https://mvnrepository.com/artifact/mysql/mysql-connector-java
我的數據庫是5.7版本,我這里下載5.1.47的驅動了,當然如果你們的數據庫是8.0以上的版本,那么就下相應的版本就行
現在兩種下載方式
1.下載到本地,然后通過ftp工具上傳到服務器
2.在服務器上下載,右擊復制鏈接地址,通過wget命令下載即可
五、進入logstash目錄,安裝同步插件
安裝會有點慢,大概2分鐘左右吧
bin/logstash-plugin install logstash-input-jdbc
bin/logstash-plugin install logstash-output-elasticsearch
六、添加Mysql與ES同步配置
進入logstash/config目錄下,新建 user.conf文件
vim user.conf
添加內容
input {
jdbc {
jdbc_driver_library => "/usr/local/software/my/mysql-connector-java-5.1.47.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://192.168.137.11:3306/test"
jdbc_user => "root"
jdbc_password => "123456"
schedule => "* * * * *"
statement => "SELECT * FROM user WHERE update_time >= :sql_last_value"
use_column_value => true
tracking_column_type => "timestamp"
tracking_column => "update_time"
last_run_metadata_path => "syncpoint_table"
}
}
output {
elasticsearch {
# ES的IP地址及端口
hosts => ["192.168.137.11:9200"]
# 索引名稱 可自定義
index => "user"
# 需要關聯的數據庫中有有一個id字段,對應類型中的id
document_id => "%{id}"
document_type => "user"
}
stdout {
# JSON格式輸出
codec => json_lines
}
}
進入bin目錄啟動
./logstash -f ../config/user.conf
可以看到下圖,如我標記的地方,logstash在第一次進行同步數據,會先從1970年開始,進行一次同步數據
之后每隔一分鐘,會以最后的update_time作為條件,查詢是否同步數據,如果查詢的結果update_time時間大于所記錄的update_time時間,則會繼續同步數據,接下來在記錄最后一次同步的update_time時間,依次類推
然后我們通過kibana,查詢一下我們的索引結果
七、多表同步
到此,我們的單表同步已經完成,接下來我們開始實現多表同步
規則如下:
一個表,一個配置
多個表,多個配置
需要同步多少表,就需要加多少配置
當然配置的內容都差不多,改的地方是查詢的表名,和es的索引以及類型的名稱
添加第二張表的配置,配置就是上面的配置,稍微改動即可
進入logstash/config目錄,修改配置文件
vim pipelines.yml
編輯文件
直接到最后,添加配置
- pipeline.id: table1
path.config: "/usr/local/software/my/logstash-6.7.2/config/user.conf"
- pipeline.id: table2
path.config: "/usr/local/software/my/logstash-6.7.2/config/goods.conf"
啟動方式稍有改變
進入bin目錄
./logstash
這里goods同步,為什么不是1970年呢,因為之前同步一次過,logstash會幫你記錄,所以就以logstash最后一次同步時間計算
現在商品表也同步數據了
那如何證明,能夠多表同步呢,很簡單,我們修改兩個表的數據,看是否都能查詢的到,如下圖,就可以證明商品表和用戶表,都是根據各自表的最后時間進行同步的數據的
注意:有數據才會創建索引哦