logstash-input-jdbc 同步原理及相关问题解读

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 前言:基于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"}

1

2:logstash-input-jdbc 只支持基于时间同步吗?

验证表名:同步更新除了支持根据时间同步外,还支持根据某自增列(如:自增ID)字段的变化进行同步。


上次举例只是举了同步时间变化的例子,设定条件:


[root@5b9dbaaa148a logstash_jdbc_test]# cat jdbc.sql_bak


select

       *

from

       cc

where   cc.modified_at > :sql_last_value

1

2

3

4

5

6

7

实际进一步研究发现,在配置文件中有use_column_value字段决定,是否需要记录某个column 的值,如果 record_last_run 为真,可以自定义我们需要 track 的 column 名称,此时该参数就要为 true. 否则默认 track 的是 timestamp 的值.


举例:以下即是设定以id的变化作为同步条件的。


[root@5b9dbaaa148a logstash_jdbc_test]# cat jdbc_xm.sql

select

       *

from

       cc

where   cc.id >= :sql_last_value

1

2

3

4

5

6

我们可以指定文件,来记录上次执行到的 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

1

2

3

已全局代码搜索,没有触发器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的时刻值,是无法进行同步的。


  如:

1

[elasticsearch@5b9dbaaa148a run_metadata.d]$ cat my_info


--- 2016-06-29 02:19:00.182000000 Z

1

2

3

(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的记录,即完成物理删除操。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
druid Java 数据库连接
SpringBoot原理分析 | Spring Data整合:JDBC、Druid、Mybatis
SpringBoot原理分析 | Spring Data整合:JDBC、Druid、Mybatis
136 0
|
SQL Java 数据库连接
联表查询 && 索引 && 事务 && JDBC使用 &&CPU工作原理 && 线程概念 && Thread类的用法
联表查询 && 索引 && 事务 && JDBC使用 &&CPU工作原理 && 线程概念 && Thread类的用法
160 0
|
5月前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
68 0
|
6月前
|
SQL Java 关系型数据库
Java与数据库连接技术JDBC关键核心之PreparedStatement以及SQL注入演示解决和原理
Java与数据库连接技术JDBC关键核心之PreparedStatement以及SQL注入演示解决和原理
41 0
|
存储 Java 数据库连接
云数据仓库ADB不管是jdbc写入或者dts同步,均会存在丢数据的情况?
云数据仓库ADB不知道是不是磁盘出问题了不管是jdbc写入或者dts同步,均会存在丢数据的情况?
87 2
|
7月前
|
Java 数据库连接 数据库
Flink全托管,holo 库同步到另一个库,报错failed to get user from ak 亲,请问是哪种权限缺失?Flink 配置中使用的是holo. jdbc 的user和password 。
Flink全托管,holo 库同步到另一个库,报错failed to get user from ak 亲,请问是哪种权限缺失?Flink 配置中使用的是holo. jdbc 的user和password 。
70 1
|
SQL Oracle Java
JDBC 的原理 | 学习笔记
快速学习 JDBC 的原理
156 0
JDBC 的原理 | 学习笔记
|
存储 SQL Oracle
浅谈JDBC基本原理
浅谈JDBC基本原理
|
SQL 前端开发 druid
【2021软件创新实验室暑假集训】JDBC(原理、使用以及实现简单的数据库连接池)
【2021软件创新实验室暑假集训】JDBC(原理、使用以及实现简单的数据库连接池)
【2021软件创新实验室暑假集训】JDBC(原理、使用以及实现简单的数据库连接池)
|
druid Java 关系型数据库
springboot2原理实战(16)--jdbc数据源和事务
springboot2原理实战(16)--jdbc数据源和事务
254 0
springboot2原理实战(16)--jdbc数据源和事务