1. 程式人生 > >elasticsearch mysql增量同步時區問題解決

elasticsearch mysql增量同步時區問題解決

問題描述:logstash在同步mysql資料到elasticsearch上時,跟蹤的column是時間變數,因為mysql
用的時區是東八區時間,而經過logstash到es上全部會轉成是零時區時間,記錄的:sql_last_value
時間也可能會產生時間差,造成時間對不上,無法正常增量同步。

分析
1、在同步資料時要實現增量同步,會需要配置

use_column_value => true 
tracking_column => utc_upt_date
record_last_run => true
last_run_metadata_path => "...\station-test.txt"
clean_run => false

跟蹤的欄位值會被記錄在txt文件裡,因為es中時間格式是零時區時間,在記錄跟蹤時間時會自動+8:00轉換成東八區時間,
這樣我們再拿原資料庫時間和加8小時後時間比較就會產生錯誤。

所以綜上,我的解決辦法是,在同步mysql資料時,對原本要跟蹤的時間列加一個輔助列,記錄該時間的UTC(零時區)時間,

MySQL 時區(timezone)轉換函式
convert_tz(dt,from_tz,to_tz)
convert_tz(upt_date, '+08:00', '+00:00')

然後將跟蹤欄位改為新加的輔助列(即原時間的零時區時間),這樣,es中既會有原時間,也會有相應的utc時間,而被記錄在txt的跟蹤欄位又會被加8:00 轉換成東八區時間,在進行比較增量時,用資料庫中真實時間與:sql_last_value進行比較即可。

這樣做的好處是,既保證資料庫中資料的真實,也可以在es中看到直觀的東八區時間,即使是跟蹤欄位的記錄檔案中也是東八區時間,便於直觀根據時間檢查資料。