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