如何實現 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}"
    ...
  }
}
相關文章
相關標籤/搜索