logstash-jdbc-input与mysql数据库同步
大多数情况下我们的数据都存放在了数据库中,但是elasticsearch它有自己的索引库,那么如果我们在做搜索的是时候就需要将数据库中的数据同步到elasticsearch中,在这里我们使用logstash的logstash-jdbc-input的插件进行与数据库的同步,对于logstash与数据库同步,我们可以设置elasticsearch与数据库同步的时间,使用这种方式进行同步还是很方便的。
1、下载并安装logstash
注意下载的版本要和你的elasticsearch的版本号一致,我的版本elasticsearch6.2.2
logstash下载地址:https://www.elastic.co/downloads/logstash
下载后之后,直接解压就好
(elasticsearch的环境搭建可参考http://www.cnblogs.com/xuwenjin/p/8745624.html)
2、配置logstash
对于logstash5.x以上版本,它自身已经集成了这个插件,不需要我们去单独安装,直接使用即可。我这里说一下与mysql进行同步的简单配置
在logstash文件目录下,新建一个文件夹(命名随意)。如:mysql
2.1 先把一个jdbc驱动放到这个文件夹下,用来连接mysql数据库
使用maven项目的,可在pom文件中,加入以下依赖,然后将jar包拷贝出来就行
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency>
2.2 创建一个 .conf 的配置文件(命名随意),用来将es与数据库关联。如mysql.conf
input { jdbc { # mysql 数据库链接,shop为数据库名 jdbc_connection_string => "jdbc:mysql://dev.yonyouccs.com:3001/test" # 用户名和密码 jdbc_user => "root" jdbc_password => "root" # 驱动 jdbc_driver_library => "D:/software/logstash-6.2.2/logstash-6.2.2/mysqletc/mysql-connector-java-5.1.40.jar" # 驱动类名 jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_paging_enabled => "true" jdbc_page_size => "50000" # 执行的sql 文件路径+名称 statement_filepath => "D:/software/logstash-6.2.2/logstash-6.2.2/mysql/jdbc.sql" # 设置监听间隔 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新 schedule => "* * * * *" } } filter { json { source => "message" remove_field => ["message"] } } output { elasticsearch { # ES的IP地址及端口 hosts => ["localhost:9200"] # 索引名称 index => "synces" # 需要关联的数据库中有有一个id字段,对应类型中的id document_id => "%{id}" # 索引名称 document_type => "xwjUser" } stdout { # JSON格式输出 codec => json_lines } }
2.3 创建一个sql文件,我这里命名为jdbc.sql和上边的配置文件一致
SELECT id, last_name lastName, age, email FROM xwj_user
注意:sql不能有结束符,不然运行的时候会报错(至于原因,后面会讲到)
3、启动logstash
在logstash的bin目录下,使用cmd执行命令:logstash -f ../mysql/mysql.conf
会看到如下启动信息:
可以看到在同步的过程中,执行了我们的脚本,并且是将其包起来的,所以sql脚本不能有结束符。
还会将同步的数据以json字符串的方式打印出来(默认将字段名称全部转为小写了)
4、通过elasticsearch-head查看数据
可以看到数据已经全部同步到elasticsearch了。不过在该索引下,默认增加@version、@timestamp两个字段
5、踩过的坑
1、logstash的配置文件一定得是UTF-8,不能是GBK,不然会报错
2、logstash启动报无法找到主类解决方案,可参考https://www.cnblogs.com/sbj-dawn/p/8549369.html
6、其它
1、新增或更新数据库数据,我们会发现logstash会根据设定的时间(这里我设置的每分钟,是最小频率)自动将最新数据同步到es。
2、目前logstash只支持数据增量,表的增量,即不能同步已物理删除的数据和表。这个问题的解决方案可参考https://blog.csdn.net/laoyang360/article/details/51747266
关于logstash的更多用法,可参考elastic的官网: