利用logstash將mysql多表數據增量同步到es

同步原理:

第一次發送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最后一次同步時間計算

現在商品表也同步數據了

那如何證明,能夠多表同步呢,很簡單,我們修改兩個表的數據,看是否都能查詢的到,如下圖,就可以證明商品表和用戶表,都是根據各自表的最后時間進行同步的數據的

注意:有數據才會創建索引哦

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。