早期,阿里巴巴 B2B 公司由于存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于 trigger 的方式获取增量变动,不过从 2010 年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变动进行同步,由此衍生出了增量订阅 & 消费的业务,今后开启了一段新纪元。mysql
ps. 目前内部版本已经支持 mysql 和 oracle 部分版本的日志解析,当前的 canal 开源版本支持 5.7 及如下的版本 (阿里内部 mysql 5.7.13, 5.6.10, mysql 5.5.18 和 5.1.40/48)git
基于日志增量订阅 & 消费支持的业务:github
项目地址:https://github.com/alibaba/canal ,目前版本为 1.1.1。spring
下载解压到部署目录,相关配置更改: 修改配置文件 conf/canal.propertiessql
# zk的配置地址 canal.zkServers=192.168.123.123:2181 #关闭netty canal.withoutNetty = true # tcp, kafka, RocketMQ canal.serverMode = kafka #须要同步的表名 canal.destinations=student,student_extend canal.instance.global.spring.xml = classpath:spring/default-instance.xml
参照 conf/example/目录复制出 conf/student/ ,每一个destinations定义的表对应一个目录 修改 conf/student/instance.properties文件数据库
# 数据库配置 canal.instance.master.address=192.168.123.123:3306 canal.instance.dbUsername=canal canal.instance.dbPassword=canal # 是否开启密码加密解析,使用druid加密,如果密码属于加密的,能够开启,并修改canal.instance.pwdPublicKey canal.instance.enableDruid=false canal.instance.filter.regex=dbname.tablename
# kafka地址 servers: 192.168.1.1:9092,192.168.1.2:9092,192.168.1.3:9092 # 重试次数 retries: 3 # 队列定义 canalDestinations: - canalDestination: student topic: dada-db-dadaabc-student partitionsNum: 3 partitionHash: dadaabc.student: id - canalDestination: student_extend topic: dada-db-dadaabc-student-extend partitionsNum: 3 partitionHash: dadaabc.student: id
修改日志路径 logback.xmlbash
略oracle
进入bin目录,执行 startup.sh 便可tcp
1.若是使用阿里云RDS,因为18小时删除机制,超过18小时恢复须要配置oss相关设置,参见: https://github.com/alibaba/canal/wiki/aliyun-RDS-QuickStart分布式
2.分布式主备须要引用同一个zookeeper配置。
3.若是开启了ROW模式binlog,但消息类型仍然是QUERY,参考下图:
则须要确认mysql设置:binlog-rows-query-log-events设置为OFF,这个问题查了很久。