如何实现 Logstash/Elasticsearch 与MySQL自动同步 更新操做 和 删除操做 ?

技术背景

咱们如今的同步, 是依靠 Logstashinput-jdbc-plugin插件来实现的自动增量更新,这个的方案貌似只能 增量 添加数据而不能修改或者删除数据. 其实否则, 咱们根据input-jdbc-plugin这个插件的一些配置, 是能够实现咱们要的效果的.sql

方案原理:

用一个更新时间的字段来做为每次Logstash增量更新的tracking column, 这样Logstash每次增量更新就会根据上一次的最后的更新时间来做为标记.
索引的document id必须是 主键, 这样在每次增量更新的时候, 才不会只是增长数据, 以前ID相同的数据就会被覆盖, 从而达到update的效果.
删除是创建在上面更新的原理之上, 就是再加一个删除标记的字段, 也就是数据只能软删除, 不能直接删除.elasticsearch

以上就是这个方案的实现原理, 缺点就是要多加一个更新时间的字段, 而且数据不能直接删除, 只能软删除, 因此这个方案有必定的局限性, 可是对于大部分操做, 应该都是能够妥协的.插件

实施细节:

第一步: 数据表设计

你的表, 必需要有一个update_time或一样意思的字段, 代表这条数据修改的时间
若是有删除操做的话, 是不能够直接删除数据的, 必须是软删除,就是还得有一个 delete_time或者is_delete或相赞成思的字段设计

第二步: 配置logstash

input 和outputcode

input {
  jdbc {
    ...
    statement => "SELECT * FROM article WHERE update_time > :sql_last_value ORDER BY id ASC"
    tracking_column => 'update_time'
    ...
  }
}
output {
  elasticsearch {
    ...
    document_id => "%{id}"
    ...
  }
}
相关文章
相关标签/搜索