zoukankan      html  css  js  c++  java
  • ElasticStack系列之十一 & 同步 mysql 数据的实践与思考

    问题

      1. jdbc-input-plugin 只能实现数据库的追加,对于 elasticsearch 增量写入,但经常 jdbc 源一端的数据库可能会做数据库删除或者更新操作。这样一来数据库与搜索引擎的数据库就出现了不对称的情况。当然你如果有开发团队可以写程序在删除或者更新的时候同步对搜索引擎操作。如果你没有这个能力,可以尝试我下面要说的方法。

      2. 当然网上后续又出现了 go-mysql-elasticsearch 项目,同步 binlog 的方式实现,这种方式是可以解决 1 中的问题,但是由于 ElasticSearch 版本的升级迭代以及纷繁复杂的映射类型,导致该项目无法及时的满足我们应用场景,故一定程度上还是需要我们自己来开发一套新的流程来完全满足我们的需要。

    解决办法

      在数据库中增加一个更新时间字段以及是否删除标志位,例如:

      我这里有一个数据表 article , mtime 字段定义了 ON UPDATE CURRENT_TIMESTAMP 所以每次更新 mtime 的时间都会变化,status 字段用于表征是否删除,默认为没有删除,具体如下:

      

      其中对 mtime 对应的 mysql 创建语句为:

      `mtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间'

      logstash 增加 mtime 的查询规则

      

      至此,可以分出两种解决方案:

      第一种:直接通过应用程序定时的读取 mysql 表,通过 mtime 和 status 字段来确定 ElasticSearch 是 更新(新增) 还是 删除,之后拼接对应的 bulkRequest 请求直接发送给 ElasticSearch 服务端。

      第二种:通过 logstash 来代替我们自己编写的应用程序,定时的扫描 mysql 表数据,再将数据同步到 ElasticSearch 服务端。

      

  • 相关阅读:
    linux环境下MongoDB的部署及应用
    Memcache,Redis,MongoDB三种非关系型数据库的对比
    什么是事务
    umount卸载目录的时候,提示正忙
    Maven私服Nexus3.x环境部署应用
    执行yum提示error: rpmdb: BDB0113 Thread/process 9060/139773561796608 failed: BDB1507 Thread died in Berkeley DB library
    vim 常用
    nginx的部署和配置
    linux系统异常关机导致报文件系统只读Read-only file system的解决方法
    js拖拽
  • 原文地址:https://www.cnblogs.com/liang1101/p/7642365.html
Copyright © 2011-2022 走看看