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

前言:

大多数情况下我们的数据都存放在了数据库中,但是elasticsearch他有自己的索引库,那么如果我们在做搜索的是时候就需要将数据库中的数据同步到elasticsearch中,在这里我们使用logstash的logstash-jdbc-input的插件进行与数据库的同步,对于logstash与数据库同步,我们可以设置elasticsearch与数据库同步的时间,使用这种方式进行同步还是很方便的。

一、安装logstash

1.1下载logstash

注意下载的版本要和你的elasticsearch的版本号一致,我的版本elasticsearch5.5.2

Logstash下载:https://www.elastic.co/downloads/logstash

ElasticSearch学习:logstash安装并使用logstash-jdbc-input与mysql数据库同步_第1张图片

1..2安装logstash

1.2.1如果你是windows系统,直接解压就可以

ElasticSearch学习:logstash安装并使用logstash-jdbc-input与mysql数据库同步_第2张图片

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,回车,然后看看会返回什么结果!

ElasticSearch学习:logstash安装并使用logstash-jdbc-input与mysql数据库同步_第3张图片

1.3.2linux系统启动,进入bin目录

./logstash -e 'input { stdin { } } output { stdout {} }'
同上,输入hello word,显示一下内容说明安装成功 ElasticSearch学习:logstash安装并使用logstash-jdbc-input与mysql数据库同步_第4张图片

二、配置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

ElasticSearch学习:logstash安装并使用logstash-jdbc-input与mysql数据库同步_第5张图片

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

ElasticSearch学习:logstash安装并使用logstash-jdbc-input与mysql数据库同步_第6张图片


原因:在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






你可能感兴趣的:(elasticsearch)