题记
来自Elasticsearch中文社区的问题——
MySQL中表无唯一递增字段,也无唯一递增时间字段,该怎么使用logstash实现 MySQL 实时增量导数据到es中?
logstash和kafka_connector都仅支持基于自增id或者时间戳更新的方式 增量 同步数据。
回到问题本身:如果库表里没有相关字段,该如何处理呢?
本文给出相关探讨和解决方案。
1、 binlog认知
1.1 啥是 binlog?
binlog是Mysql sever层维护的一种 二进制日志 ,与innodb引擎中的redo/undo log是完全不同的日志; 其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句,并以"事务"的形式保存在磁盘中。
作用主要有:
1)复制:达到master-slave数据一致的目的。
2)数据恢复:通过mysqlbinlog工具恢复数据。
3) 增量备份 。
1.2 阿里的Canal实现了增量Mysql同步
一图胜千言,canal是用 java 开发的基于 数据库 增量日志解析、提供增量数据订阅&消费的中间件。
目前,canal主要支持了MySQL的binlog解析,解析完成后才利用canal client 用来处理获得的相关数据。目的: 增量数据订阅&消费 。
综上,使用binlog可以突破logstash或者kafka-connector没有自增id或者没有时间戳字段的限制,实现增量同步。
2、基于binlog的同步方式
1)基于kafka Connect的Debezium 开源工程,地址:. https://debezium.io/
2)不依赖第三方的独立应用: Maxwell开源项目, 地址:http://maxwells-daemon.io/
由于已经部署过conluent(kafka的企业版本,自带zookeeper、kafka、ksql、kafka-connector等),本文仅针对Debezium展开。
3、Debezium介绍
Debezium是捕获数据实时动态变化的开源的分布式同步平台。能实时捕获到数据源(Mysql、Mongo、PostgreSql)的:新增(inserts)、更新(updates)、删除(deletes)操作,实时同步到Kafka,稳定性强且速度非常快。
特点:
1)简单。无需修改应用程序。可对外提供服务。
2)稳定。持续跟踪每一行的每一处变动。
3)快速。构建于kaf