MySql增量数据实时同步
说明
上篇整理了人大金仓增量数据实时同步的技术实现,本篇整理一下MySql增量数据实时同步的实现方案和使用问题汇总。
1、CDC技术简介
上篇博文已经介绍了CDC技术的实现原理,这里对CDC技术进一步补充:
CDC(Change Data Capture)变更数据捕获,是对源数据库的变更数据进行实时识别、抽取以及转化等操作,可以做到高效地监控变化数据。
CDC的实现模式一般分为:
(1)主动查询模式
通常在源数据库表中,记录上次更新的时间戳或者版本号等信息,然后同步不断的查询和上次记录做对比,来判断数据是否变更。
优点:实现简单,不涉及数据库底层特性;
缺点:需对数据表改造,同步实时性不高,需频繁查询对比数据库,不能确保记录所有变更。
(2)事件接收模式
可以通过触发器(Trigger)或日志(如:Transaction log、Binary log、Write-ahead log)来实现。当源数据库表发生变动时,会通过表的触发器或者日志,将操作记录下来,然后通过订阅消费这些事件,对数据库变更记录进行重放。
优点:实时性高,精确捕获;
缺点:部署数据库事件接收组件和解码器,但是一般关系数据库提供了支持,有一定的学习和运维成本。
下面来介绍一下MySql增量数据实时同步的实现:Canal
2、Canal简介
Canal是阿里巴巴开发的 MySQL binlog 增量订阅&消费组件。Canal Server能够解析MySQL Binlog并订阅数据更改,Canal Client可以实现将更改广播到任何地方,提供了可靠的低延迟增量数据管道。更多信息: https://github.com/alibaba/canal
3、Canal Server安装配置
(1)MySql开启binlog
修改mysql的配置文件/mysql/config/mysql.cnf
#开启binlog og-bin=mysql-bin #日志记录方式,设置为ROW模式 binlog-format=ROW #设置当前MySQL的server_id,不要和canal的slaveId 重复 server_id=1
(2)添加数据库用户
输入命令连接到数据库
#进入mysql容器 docker exec -it mysql bash #连接mysql数据库 mysql -uroot -p
输入密码后,输入如下命令创建用户
-- 创建用户canal 密码默认为canal,修改成自己的密码 CREATE USER canal IDENTIFIED BY 'canal'; --*.*表示:授权canal用户所有库 GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; -- 重新加载权限 FLUSH PRIVILEGES;
使用exit命令,退出容器。重启mysql
#重启mysql
docker restart mysql
(3)安装canal
执行如下命令,可拉取canal镜像进行安装
#拉取canal docker docker pull canal/canal-server #运行canal docker docker run --name canal -d canal/canal-server #复制docker文件映射 docker cp canal:/home/admin/canal-server/ /home/dockerdata/ #停止docker docker stop canal #删除docker docker rm canal
修改配置文件/home/dockerdata/can-server/conf/example/instance.properites,如下图所示:
运行如下命令创建容器,挂载出配置文件路径
#运行canal docker docker run --name canal -p 11111:11111 -d -v /home/dockerdata/canal-server/:/home/admin/canal-server/canal/canal-server
至此,canal server部署完成。
4、Canal Client
Canal提供了多语言的客户端源码案例,可根据需要进行下载,下载地址:https://github.com/alibaba/canal
5、使用问题汇总
(1)当canal服务运行一段时间后关闭,Binlog日志清理掉了,导致canal服务重启后,无法解析日志
解决方法:出现此类问题的原因是canal中记录的日志文件不存在了,可以删除掉/canal-server/conf/example/下的meta.dat文件和h2.mv.db文件,重启canal后恢复正常。针对未同步成功的数据,可选择进行全量同步后,再开启canal增量同步。