logstash同步MySQL8.0数据到elasticsearch

一、首先下载安装logstash

下载地址:https://www.elastic.co/cn/downloads/logstash
下载后解压即可

二、测试安装是否成功

进入logstash文件夹下的 /bin 目录下,执行logstash ‐e ‘input { stdin { } } output { stdout {} }’ 命令,出现以下结果即为安装成功
在这里插入图片描述

三、logstash-input-jdbc同步多个表

1、在logstash安装的目录下新建一个mysql文件夹,在文件夹下新建一个mysql.conf文件
mysql.conf 文件内容如下:

input {
    jdbc {
      jdbc_connection_string => "jdbc:mysql://192.168.162.1:3306/jiaoli_community?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"
      jdbc_user => "root"
      jdbc_password => "root"
      jdbc_driver_library => "/usr/local/logstash-5.6.12/mysql/mysql-connector-java-8.0.15.jar"
      jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"
      statement => "select id,title,gmt_modified from tb_question"
      schedule => "* * * * *"
      type => "question"
    }
    jdbc {
      jdbc_connection_string => "jdbc:mysql://192.168.162.1:3306/jiaoli_community?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"
      jdbc_user => "root"
      jdbc_password => "root"
      jdbc_driver_library => "/usr/local/logstash-5.6.12/mysql/mysql-connector-java-8.0.15.jar"
      jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"
    #  parameters => {"number" => "200"}  这个我们可以向sql语句传递参数
      statement => "select id,title,gmt_modified from tb_article"
      schedule => "* * * * *"
      type => "article"
    }
}

filter {
    json {
        source => "message"
        remove_field => ["message"]
    }
}

output {
    if[type] == "question" {
        elasticsearch {
            hosts => ["192.168.155.129:9200"]
            index => "index_question"
            document_id => "%{id}"
        }
    }
    if[type] == "article" {
        elasticsearch {
            hosts => ["192.168.155.129:9200"]
            index => "index_article"
            document_id => "%{id}"
        }
    }
    stdout {
        codec => json_lines
    }
}

注意: SQL语句那里我们也可以使用引入SQL文件的方式进行同步:

只需要将statement => “select id,title,gmt_modified from tb_article” 这句改成 statement_filepath => “D:/software/logstash-6.2.2/logstash-6.2.2/mysql/jdbc.sql”,

四、注意细节事项

1、数据库里面有一张表,字段如“学生id”被定义为student_id,“班级名”被定义为class_name等,而在项目中实体类属性一般都是驼峰命名法,如上两个属性在Java实体类中被定为studentId、className;假如你用logstash-input-jdbc将mysql数据同步到elasticsearch后,如果你的sql没有对字段起别名,那么elasticsearch中存储的字段就是mysql中的格式,此时恰好你用的是spring-data-elasticsearch的List list = elasticsearchTemplate.queryForList(searchQuery,User.class);你会发现映射不上,所以在使用插件同步时,在jdbc.sql中对字段起别名以跟JavaBean属性对应:

select student_id as studentId, class_name as className, modify_time as modifyTime from user where modify_time > :sql_last_value;
同步完以后,通过head插件查看同步的数据,数据没错,但是字段都是小写,例如studentId变成了studentid,className变成了classname;这不行啊,我起别名就是想和实体类对应,结果全变成小写了还是不行,原来jdbc.conf文件中还有一个属性是

lowercase_column_names => “false”
2、 另一个问题是logstash-input-jdbc插件支持自定义同步条件,可根据主键记录来同步:首先要打开这两个属性

use_column_value => “true”
tracking_column => “studentId” //studentId为表的主键
然后就可以写sql通过主键来同步:
select student_id as studentId, class_name as className,modify_time as modifyTime from user where student_id > :sql_last_value;
通过主键来同步后,我发现新增可以同步,但是修改(即更新)无法同步,因为logstash-input-jdbc插件其实是通过jdbc.conf文件中的schedule => “* * * * *” 这个属性来定时去执行jdbc.sql中的sql语句来发现数据是否变化以达到同步效果,如果修改一条记录,因为你sql中where后面是以id变化为条件的,但是你现在只是修改其他属性,id并没有变,不会触发同步,我是这么理解的,如有错误,欢迎指正。而以时间作为同步条件就可以实现更新同步,因为你修改了一条记录,肯定会更新表中修改时间的时间戳(我这里是modify_time的值),如果你的表里没有一个时间的字段,那你可能必须得加一下了。
你可能想用主键作为elasticsearch文档的id,由于你给主键起了别名,所以在jdbc.conf中也必须这样写:

output{
elasticsearch{
hosts => “127.0.0.1:9200”
user => “elastic” //这里因为使用x-pack作为安全管理,所以要配置user和password;
password => “changeme”
index => “my_index”
document_id=>"%{studentId}" //主键起了别名,这里也要使用别名
}
stdout{
codec=>json_lines
}
}
3、 最后一个问题是logstash-input-jdbc插件使用的是UTC时间,比我们晚8个小时,你可以在sql语句中使用date_add函数将时间加上8个小时或者使用convert_tz转换时区函数再和mysql时间比较。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值