利用logstash实现ES和MySQL同步
1. ES和MySQL同步方法
-
编程式
- 使用之前的elasticdump,手动变成生成json文件,编写shellscript导入ES。后续的数据新增使用PHP或kava客户端进行编程触发同步。
-
使用插件(没有什么特别好的插件)
- 国人编写的go-mysql-elasticsearch(go开发)
- 官方推荐基于logstash的插件logstash-input-jdbc
-
自己写
- 采用阿里巴巴的一个开源项目canal,可以模拟mysql从服务器。封装了bin-log分析,我们可以自己开发一个客户端可以更好地控制数据同步。
2. logstash-input-jdbc同步方法
-
下载mysql+java驱动包:https://dev.mysql.com/downloads/connector/j/
-
配置文件
input { jdbc { jdbc_driver_library => "mysql-connector-java-5.1.36-bin.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb" jdbc_user => "mysql" parameters => { "favorite_artist" => "Beethoven" } schedule => "* * * * *" statement => "SELECT * from songs where artist = :favorite_artist" } }
- 文档:https://www.elastic.co/guide/en/logstash/master/plugins-inputs-jdbc.html
- 关于 schedule => "* * * * *"
- 类似于Linux的crond的配置
- 从左往右 分 时 日 月 年 (最小单位:分)
- 全部写*表示每分钟都更新
-
- 5 * * * 表示每天5点钟更新
-
- 5 * 1 * 表示一月份每天5点更新
-
准备数据,创建mysql表jt_news
CREATE TABLE `jt_news` ( `news_id` int(11) NOT NULL AUTO_INCREMENT, `news_title` varchar(64) DEFAULT NULL, `news_abstract` varchar(64) DEFAULT NULL, `news_updatetime` datetime DEFAULT NULL, `news_clicknum` int(3) DEFAULT NULL, `news_class` varchar(64) DEFAULT NULL, PRIMARY KEY (`news_id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `jt_news` VALUES (1,'Java开发新闻','Java新闻摘要','2017-09-28 11:14:49',11,'编程语言'),(2,'PHP开发新闻','PHP新闻摘要','2017-09-28 11:15:13',13,'web开发'),(3,'js前后端分离','javascript','2017-09-28 11:15:38',1,'web开发');
-
创建索引(mapping)
PUT jtthink-test { "mappings": { "jt_news": { "properties": { "news_title": { "type": "text", "analyzer": "ik_max_word" }, "news_abstract": { "type": "text", "analyzer": "ik_max_word" }, "news_updatetime": { "type": "date" }, "news_clicknum": { "type": "integer" }, "news_class": { "type": "keyword" } } } } }
-
创建配置文件 mysql.conf
-
在logstash/bin下创建(该目录可变)
-
文件内容
input { jdbc { jdbc_driver_library => "/usr/local/drivers/mysql-connector-java-5.1.44/mysql-connector-java-5.1.44-bin.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/jtthink" jdbc_user => "root" jdbc_password => "shadowolf1995." statement => "SELECT * from jt_news order by news_id desc" tracking_column => "news_updatetime" tracking_column_type => "timestamp" schedule => "* * * * *" } } filter { } output { stdout { codec => rubydebug } elasticsearch { hosts => ["127.0.0.1:9201"] index => "jtthink-test" document_id => "%{news_id}" } }
-
-
启动logstash
./logstash -f mysql.conf
-
使用kibana创建index jtthink-test,查看数据。