使用logstash同步mysql数据到elasticsearch
安装
由于本人的elasticsearch安装的是7.6.1版本,因此logstash也选择对应版本logstash-7.6.1。
下载logstash-7.6.1.zip(windows版本,根据个人情况选择版本下载),下载地址:https://www.elastic.co/cn/downloads/logstash 。
由于官网下载太慢,此处提供已经下载好的,见百度网盘:https://pan.baidu.com/s/1FQLR-BoDQOQxydpJqV9tXQ 提取码:m5vr

另外还需要准备mysql-connector-java.jar,版本根据mysql服务使用情况决定,我是用的是5.1.17版本。

配置
在logstash的bin目录下添加mysql_info.conf
input {
stdin {
}
jdbc {
# mysql数据库连接
jdbc_connection_string => "jdbc:mysql://****:3306/litemall?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"
# mysqly用户名和密码
jdbc_user => "root"
jdbc_password => "root"
# 驱动配置
jdbc_driver_library => "E:\utils\ElasticSearch\install\mysql-connector-java-5.1.17.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
#执行的sql语句,注意其中红色部分是用于转换时差的,如果不做转换时间会相差8小时,导致每次增量添加索引会重复8个小时的数据,注:为了防止数据丢失,可以把+08:00提前十分钟,+07:50
statement => "SELECT * FROM test_blog WHERE update_time >= convert_tz(:sql_last_value,'+00:00','+08:00')"
# 设置监听 各字段含义 分 时 天 月 年 ,默认全部为*代表含义:每分钟都更新
schedule => "* * * * *"
}
}
output {
elasticsearch {
#es服务器
hosts => ["localhost:9200"]
#ES索引名称
index => "test_blog"
#自增ID
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}

表结构
说明:其中的update_time和deleted很重要,表设计中必须要有
update_time:用于logstash的增量同步时间标识
deleted:逻辑删除标志,由于logstash是增量同步的,无法感知物理删除动作(除非使用binlog同步,此处不推荐),通过此逻辑删除标志改变物理删除变成逻辑删除(实际就是更新操作)
预先创建并定义索引
此处使用kibina的控制台进行创建,关于kibina的安装自行百度。

启动
进入bin目录执行以下命令:
.\logstash -f .\mysql_info.conf
启动后会执行同步:

查询结果
通过插件head查询索引的数据

或者通过kibina等工具查询结果:

测试
新增
INSERT INTO test_blog(topic,content,create_time,update_time) VALUE('中国房价','很敏感,不讨论。。。',NOW(),NOW())
logstash会同步此数据到es: 

删除(逻辑删)
执行sql:
UPDATE test_blog SET deleted = 1,update_time = NOW() WHERE topic = '中国房价';
logstash同步:

查询结果如下,已经删除,在es的查询的时候可以通过逻辑删除字段来控制查询内容


浙公网安备 33010602011771号