技術背景
我們現在的同步, 是依靠 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}"
...
}
}