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

8次阅读

共计 736 个字符,预计需要花费 2 分钟才能阅读完成。

技术背景
我们现在的同步, 是依靠 Logstash 的 input-jdbc-plugin 插件来实现的自动增量更新, 这个的方案貌似只能 增量 添加数据而不能修改或者删除数据. 其实不然, 我们根据 input-jdbc-plugin 这个插件的一些配置, 是可以实现我们要的效果的.
方案原理:
用一个更新时间的字段来作为每次 Logstash 增量更新的 tracking column, 这样 Logstash 每次增量更新就会根据上一次的最后的更新时间来作为标记. 索引的 document id 必须是 主键, 这样在每次增量更新的时候, 才不会只是增加数据, 之前 ID 相同的数据就会被覆盖, 从而达到 update 的效果. 删除是建立在上面更新的原理之上, 就是再加一个删除标记的字段, 也就是数据只能软删除, 不能直接删除.
以上就是这个方案的实现原理, 缺点就是要多加一个更新时间的字段, 并且数据不能直接删除, 只能软删除, 所以这个方案有一定的局限性, 但是对于大部分操作, 应该都是可以妥协的.
实施细节:
第一步: 数据表设计
你的表, 必须要有一个 update_time 或同样意思的字段, 表明这条数据修改的时间如果有删除操作的话, 是不可以直接删除数据的, 必须是软删除, 就是还得有一个 delete_time 或者 is_delete 或相同意思的字段
第二步: 配置 logstash

input 和 output
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}”

}
}

正文完
 0