如何實現 Logstash/Elasticsearch 與MySQL自動同步 更新操作 和 刪除操作 ?

CRStudio發表於2019-02-17

技術背景

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

相關文章