logstash-input-jdbc 同步原理及相关问题解读
来源:互联网 发布:js math.pow 编辑:程序博客网 时间:2024/06/14 22:08
http://blog.csdn.net/laoyang360/article/details/51793301
前言:
基于logstash-input-jdbc较其他插件的稳定性、易用性、版本和ES同步更新的特点,以下研究主要针对 logstash-input-jdbc 展开。
针对logstash-input-jdbc常见的几个疑难问题,部分问题也在git和stackoverflow进行了激烈讨论,以下统一给出验证和解答。
1、logstash-input-jdbc 的同步原理是什么?
(1)、对于全量同步依据
配置文件jdbc.sql的sql语句的进行同步。
(2)、对于增量实时同步依据
1)设定的定时策略。
如最小更新间隔每分钟更新一次设定:schedule => “* * * * *”,目前最小更新间隔为1分钟,验证发现,不支持60s以内的秒级更新。
2)设定的sql语句。
如jdbc.sql, 决定同步哪些内容及同步更新的条件。
{"id":10,"name":"10test","@version":"1","@timestamp":"2016-06-29T03:18:00.177Z","type":"132c_type"}
2:logstash-input-jdbc 只支持基于时间同步吗?
验证表名:同步更新除了支持根据时间同步外,还支持根据某自增列(如:自增ID)字段的变化进行同步。
上次举例只是举了同步时间变化的例子,设定条件:
[root@5b9dbaaa148a logstash_jdbc_test]# cat jdbc.sql_bakselect *from ccwhere cc.modified_at > :sql_last_value
实际进一步研究发现,在配置文件中有use_column_value字段决定,是否需要记录某个column 的值,如果 record_last_run 为真,可以自定义我们需要 track 的 column 名称,此时该参数就要为 true. 否则默认 track 的是 timestamp 的值.
举例:以下即是设定以id的变化作为同步条件的。
[root@5b9dbaaa148a logstash_jdbc_test]# cat jdbc_xm.sqlselect *from ccwhere cc.id >= :sql_last_value
我们可以指定文件,来记录上次执行到的 tracking_column 字段的值 比如上次数据库有 12 条记录,查询完后该文件中就会有数字 12 这样的记录,下次执行 SQL 查询可以从 13 条处开始.
我们只需要在 SQL 语句中 WHERE MY_ID > :last_sql_value 即可. 其中 :last_sql_value 取得就是该文件中的值(12).
last_run_metadata_path => “/etc/logstash/run_metadata.d/my_info”
如:
[root@5b9 run_metadata.d]# cat /etc/logstash/run_metadata.d/my_info--- 12
已全局代码搜索,没有触发器trigger相关处理操作。
3:mysql和ES分别存储在两台服务器,且时间不一致,能否实现同步?
(1). 设定对于以时间作为判定条件的增量同步,可以以设定的时间为基准点进行同步。
验证发现:
显示的时间戳timestamp为ES上的UTC时间值(不论ES机器是什么时区,都会修改为UTC时间存入ES),显示的modified_at时间值为同步过来的mysql时间值转化为UTC的结果值。
更新的前提是必须满足: cc.modified_at >= :sql_last_value。即如果mysql的时间修改为小于sql_last_value的时刻值,是无法进行同步的。
如:
[elasticsearch@5b9dbaaa148a run_metadata.d]$ cat my_info--- 2016-06-29 02:19:00.182000000 Z
(2). 对于选定某列作为判定条件(如自增ID),两者(mysql和ES)时间不一致,实际是也可以同步更新的。
验证发现:
测试设定的时间是mysql比ES早一天或者晚一天的时刻值,都可以实现同步更新操作。
4:如何支持实时同步mysql的delete操作到ES中?
logstash-input-jdbc插件不支持物理删除的同步更新。详见:
http://stackoverflow.com/questions/35813923/sync-postgresql-data-with-elasticsearch/35823497#35823497
https://github.com/logstash-plugins/logstash-input-jdbc/issues/145
解决方案:
同步删除操作改为同步update更新操作实现。
第一步:进行软件删除,而不是物理删除操作。
先不物理删除记录,而是软件删除,即新增一个 flag 列,标识记录是否已经被删除(默认为false,设置为true或者deleted代表已经被删除,业界通用方法),这样,通过已有的同步机制,相同的标记记录该行数据会同步更新到Elasticsearch。
第二步:ES中检索flag标记为true或者deleted的字段信息。
在ES可以执行简单的term查询操作,检索出已经删除的数据信息。
第三步:定时物理删除。
设置定时事件,间隔一段时间物理删除掉mysql和ES中的flag字段标记为true或deleted的记录,即完成物理删除操。
- logstash-input-jdbc 同步原理及相关问题解读
- logstash-input-jdbc 同步原理及相关问题解读
- elasticSearch数据导入工具logstash-input-jdbc 同步原理及相关问题解读
- Elasticsearch同步mysql(logstash-input-jdbc)和一些查询问题
- Logstash的logstash-input-jdbc插件mysql数据同步ElasticSearch及词库
- ElasticSearch5+logstash的logstash-input-jdbc实现mysql数据同步
- ElasticSearch5+logstash的logstash-input-jdbc实现mysql数据同步
- logstash-input-jdbc实现oracle 与elasticsearch实时同步详解
- elasticsearch与数据库同步工具Logstash-input-jdbc
- logstash-input-jdbc实现mysql 与elasticsearch实时同步
- logstash-input-jdbc实现ElasticSearch与mysql同步
- ElasticSearch学习:logstash安装并使用logstash-jdbc-input与mysql数据库同步
- logstash安装和logstash-input-jdbc插件
- logstash-input-jdbc实现mysql 与elasticsearch实时同步深入详解
- logstash-input-jdbc实现mysql 与elasticsearch实时同步深入详解
- logstash-input-jdbc实现mysql 与elasticsearch实时同步深入详解
- Elasticsearch系列(九)----使用Logstash-input-jdbc同步数据库中的数据到ES
- logstash-input-jdbc实现mysql 与elasticsearch实时同步深入详解
- HorizontalTabhost
- 关于将微博上视频保存在电脑本地的方法汇总
- BP神经网络的Python简单实现
- CyclicBarrier
- ④设计模式之多例模式
- logstash-input-jdbc 同步原理及相关问题解读
- 版本控制之VSS(一)
- unity时间延迟方法总结(新人勿喷)
- 前端面试之---javascript作用域和闭包
- 五子棋学习(1)
- Leap Motion C++开发笔记(一)下载安装及环境配置
- 【九度OJ】1187:最小年龄的3个职工
- 【DP】51Nod 1052 最大M子段和
- 阅读源码流程