Binlog同步工具Canal部署使用

∥☆過路亽.° 提交于 2019-12-06 14:10:15

Canal介绍

早期,阿里巴巴 B2B 公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于 trigger 的方式获取增量变更,不过从 2010 年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅 & 消费的业务,从此开启了一段新纪元。

ps. 目前内部版本已经支持 mysql 和 oracle 部分版本的日志解析,当前的 canal 开源版本支持 5.7 及以下的版本 (阿里内部 mysql 5.7.13, 5.6.10, mysql 5.5.18 和 5.1.40/48)

基于日志增量订阅 & 消费支持的业务:

  • 数据库镜像
  • 数据库实时备份
  • 多级索引 (卖家和买家各自分库索引)
  • search build
  • 业务 cache 刷新
  • 价格变化等重要业务消息

前期准备

  • mysql的binlog模式需要是ROW,查看binlog格式命令:show variables like 'binlog_format';
  • 订阅binlog账号需要开启下面3个权限:SELECT, REPLICATION SLAVE, REPLICATION CLIENT,查看权限命令:show grants for 'canal'

Canal部署

项目地址:https://github.com/alibaba/canal ,目前版本为 1.1.1。

修改配置文件conf/canal.properties

下载解压到部署目录,相关配置更改: 修改配置文件 conf/canal.properties

# 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

根据destinations定义,在conf下创建对应目录配置

参照 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

修改mq.yml

# 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.xml

启动

进入bin目录,执行 startup.sh 即可

注意事项

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,这个问题查了好久。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!