ElasticSearch学习之路-使用logstash-jdbc-input与mysql数据同步

大多数情况下我们的数据都存放在了数据库中,但是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值