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的官网:Jdbc input plugin

 

posted @ 2018-05-04 08:48  仅此而已-远方  阅读(10084)  评论(2编辑  收藏  举报