前言:
大多数情况下我们的数据都存放在了数据库中,但是elasticsearch他有自己的索引库,那么如果我们在做搜索的是时候就需要将数据库中的数据同步到elasticsearch中,在这里我们使用logstash的logstash-jdbc-input的插件进行与数据库的同步,对于logstash与数据库同步,我们可以设置elasticsearch与数据库同步的时间,使用这种方式进行同步还是很方便的。
一、安装logstash
1.1下载logstash
注意下载的版本要和你的elasticsearch的版本号一致,我的版本elasticsearch5.5.2
Logstash下载:https://www.elastic.co/downloads/logstash
1..2安装logstash
1.2.1如果你是windows系统,直接解压就可以
1.2.2linux系统,以cenos7举例,进行解压
tar –zxvf logstash-5-5-2
1.3启动
1.3.1windows系统进行启动,输入命令
bin/logstash -e 'input { stdin { } } output { stdout {codec=>rubydebug} }'
然后你会发现终端在等待你的输入。没问题,敲入 Hello World,回车,然后看看会返回什么结果!
1.3.2linux系统启动,进入bin目录
./logstash -e 'input { stdin { } } output { stdout {} }'
同上,输入hello word,显示一下内容说明安装成功
二、配置logstash-jdbc-input
这里先声明一下:
对于logstash2.x版本是没有集成logstash-jdbc-input插件的需要我们自己去安装,如果你是2.x版本可以参考:http://blog.csdn.net/yeyuma/article/details/50240595 这位老铁的文章;
对于logstash5.x版本他自身已经集成了这个插件,不需要我们去单独安装,直接使用即可,我这里说一下与mysql进行同步的简单配置
2.1在logstash文件目录下创建一个文件夹,命名随意,我这里是mysqletc
2.1.1首先创建一个mysql.conf的文件
input {
stdin {
}
jdbc {
# mysql 数据库链接,shop为数据库名
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/esshop"
# 用户名和密码
jdbc_user => "root"
jdbc_password => "root"
# 驱动
jdbc_driver_library => "D:/elasticsearch/logstash-5.5.2/mysqletc/mysql-connector-java-5.0.8.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
# 执行的sql 文件路径+名称
statement_filepath => "D:/elasticsearch/logstash-5.5.2/mysqletc/shop.sql"
# 设置监听间隔 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
# 索引类型
type => "content"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "cmscontent"
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}
2.1.2创建一个sql文件,我这里命名为shop.sql和上边的配置文件一致
SELECT
*
FROM
content
2.1.3最后需要把一个jdbc驱动放到这个文件夹下,用来连接mysql数据库(一定不要忘记)
2.2启动logstash
启动命令
./logstash -f ../mysqletc/mysql.conf
启动完成后,稍等片刻,我们就可以看到同步的数据了
GET /_search
logstash会一直进行与数据库的信息进行同步
三、问题:
1.时间格式问题:
如果我们在同步mysql数据库中,涉及到时间的字段,格式设置成datetime,我们创建的index时间mapping设置为type:date,format:yyyy-MM-dd HH:mm:ss;那么直接进行同步,就会同步失败。如图:
date_format(created,'%Y-%m-%d %H:%i:%s' ) as created
2.数据同步问题:
当然这个同步对于新增或更新数据还是很友好的,对于删除数据就会有影响。通过查资料对我来说以下方案比较合适:
在原有的mysql数据库表中,新增一个字段status, 默认值为ok,如果要删除数据,实则用update操作,status改为deleted.
这样,就能同步到es中。es中以status状态值区分该行数据是否存在。deleted代表已删除,ok代表正常。
如果这种方案不适合你,你可以参考这位大牛的博客:http://blog.csdn.net/laoyang360/article/details/51747266