您的位置:首页 > 数据库 > MySQL

ElasticSearch学习:logstash安装并使用logstash-jdbc-input与mysql数据库同步

2017-10-23 13:43 676 查看
前言:

大多数情况下我们的数据都存放在了数据库中,但是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版本是没有集成[b]logstash-jdbc-input插件的需要我们自己去安装,如果你是2.x版本可以参考:http://blog.csdn.net/yeyuma/article/details/50240595 这位老铁的文章;[/b]

[b]对于logstash5.x版本他自身已经集成了这个插件,不需要我们去单独安装,直接使用即可,我这里说一下与mysql进行同步的简单配置[/b]

<
bf8d
p>[b]2.1在logstash文件目录下创建一个文件夹,命名随意,我这里是mysqletc[/b]
[b]


[/b]

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;那么直接进行同步,就会同步失败。如图:




原因:在mysql直接取出来的时间字段,他是带有时区的时间格式,与es创建mapping中的yyyy-MM-dd HH:mm:ss不符合,所有导致同步失败。

解决方案:在同步过程中,将时间进行处理,我这里通过sql语句将时间进行格式化,在同步到es中
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: