使用中间件logstash监控数据库同步到es

1.关于下载(linux版本)要和es版本保持一致,避免bug

https://www.elastic.co/cn/downloads/logstash

因为logstash要连数据库 我们要准备 mysql-connector-java-8.0.13.jar 驱动

2.Logstash是一个开源数据收集引擎,具有实时管道功能。Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地

同步方式: 

  1.  主键的新增方式

  2.   update_time方式( 这里使用update_time方式,需要数据库有这种更新字段)

比较:

使用 logstash-input-jdbc 插件读取 mysql 的数据,这个插件的工作原理比较简单,就是定时执行一个 sql,然后将 sql 执行的结果写入到流中,增量获取的方式没有通过 binlog 方式同步,而是用一个递增字段作为条件去查询,每次都记录当前查询的位置,由于递增的特性,只需要查询比当前大的记录即可获取这段时间内的全部增量,一般的递增字段有两种,AUTO_INCREMENT 的主键 id 和 ON UPDATE CURRENT_TIMESTAMP 的 update_time 字段,id 字段只适用于那种只有插入没有更新的表,update_time 更加通用一些,建议在 mysql 表设计的时候都增加一个 update_time 字段。

下面进一步详细说配置:

cd /usr/local/logstash-7.15.1/config/mysql.conf

input {
  jdbc{
    jdbc_driver_library => "/usr/local/logstash-7.15.1/bin/mysql-connector-java-5.1.46/mysql-connector-java-5.1.46.jar"
     # 8.0以上版本:一定要把serverTimezone=UTC天加上  
    jdbc_driver_class => "com.mysql.jdbc.Driver"   
    jdbc_connection_string => "jdbc:mysql://localhost:3306/nsbd?characterEncoding=utf8&useSSL=false&rewriteBatchedStatements=true&serverTimezone=UTC"
    jdbc_user => "root"
    jdbc_password => "root"
    #schedule: 执行 sql 时机,类似 crontab 的调度schedule: 执行 sql 时机,类似 crontab 的调度
    #https://cron.qqe2.com/ 这个网站执行通配符
     schedule => "*/5 * * * * *"  
    #这里使用update_time方式,需要数据库有这种更新字段
    statement => "SELECT * FROM user WHERE update_time >= :sql_last_value"
    #使用递增列的值
    use_column_value => true
    #递增字段的类型,numeric 表示数值类型, timestamp 表示时间戳类型
    tracking_column_type => "timestamp"
    #递增字段的名称,这里使用 update_time 这一列,这列的类型是 timestamp
    tracking_column => "update_time"
    #同步点文件,这个文件记录了上次的同步点,重启时会读取这个文件,这个文件可以手动修改
    last_run_metadata_path => "syncpoint_table"
  }
}
output {
    elasticsearch {
        # ES的IP地址及端口
        hosts => ["192.168.126.128:9200"]
        # 索引名称 可自定义
        index => "user"
        # 需要关联的数据库中有有一个id字段,对应类型中的id
        document_id => "%{id}"
        document_type => "user"
    }
    stdout {
        # JSON格式输出
        codec => json_lines
    }
}

报错:

 Could not fetch all the sources {:exception=>LogStash::ConfigLoadingError, :message=>"The following config files contains non-ascii characters but are not UTF-8 encoded

 编码问题,转换一下编码utf8 ,我使用文本转换的 

配置ok! 然后启动一下 

cd  /usr/local/logstash-7.15.1/bin/

执行 有点慢 看打印的日志

 ./logstash  -f ../config/mysql.conf

现在打开es head 查询就同步过来了啊

文档删除

不知道你是否已经发现,如果一个文档从 MySQL 中删除,该操作并不会同步到 ElasticSearch 中。列举一些可供我们考虑的方案,如下:

MySQL 中的记录可通过包含 is_deleted 字段用以表明该条记录是否有效。一旦发生更新,is_deleted 也会同步更新到 ElasticSearch 中。如果通过这种方式,在执行 MySQL 或 ElasticSearch 查询时,我们需要重写查询语句来过滤掉 is_deleted 为 true 的记录。同时,需要一些后台进程将 MySQL 和 ElasticSearch 中的这些文档删除。

另一个可选方案,应用系统负责 MySQL 和 ElasticSearch 中数据的删除,即应用系统在删除 MySQL 中数据的同时,也要负责将 ElasticSearch 中相应的文档删除。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值