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中看到直观的东八区时间,即使是跟踪字段的记录文件中也是东八区时间,便于直观根据时间检查数据。

猜你喜欢

转载自blog.csdn.net/u011144425/article/details/78631030