一、整体部署结构
1.目前canal测试已支持mysql 5.7.13/5.6.10及以下的版本,mariadb 5.5.35和10.0.7(理论上可支持以下版本), jdk建议使用1.6.25以上的版本,稳定可靠。
2.canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能,配置binlog模式为row
[mysqld]
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
针对已有的账户可通过grants查询权限:
show grants for 'canal'
二、canal HA模式配置
机器准备
a. 运行canal的机器两台(一主一从)
b. zookeeper集群(三个实例)
c. mysql(需要监听的数据库主库)
按照部署和配置,在单台机器上各自完成配置
a. 修改canal.properties,加上zookeeper配置
canal.id= #保证唯一id
canal.port= #端口
canal.zkServers= #zookeeper集群地址(需要告诉开发人员)
canal.instance.filter.query.dcl = true #过滤掉dcl语句
canal.instance.filter.query.ddl = true #过滤掉ddl语句
canal.destinations= example #canal实例名称(需要告诉开发人员)
canal.auto.scan = false #禁用自动扫描instance实例目录
canal.instance.global.spring.xml = classpath:spring/default-instance.xml #instance实例配置文件
b. 创建example目录(和canal实例名称保持一致,如果已经存在就不需要创建了),并修改instance.properties
canal.instance.mysql.slaveId = 1234 #另外一台机器改成1235,保证slaveId不重复即可
canal.instance.master.address = #mysql主的地址
canal.instance.dbUsername = canal #数据库名称
canal.instance.dbPassword = canal #数据库密码
canal.instance.defaultDatabaseName = #监控的默认数据库(开发人员提供)
canal.instance.connectionCharset = UTF-8
canal.instance.filter.regex = #需要监听的数据的表(开发人员提供),mysql 数据解析关注的表,Perl正则表达式,多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
常见例子:
所有表:.* or .*\\..*
canal schema下所有表: canal\\..*
canal下的以canal打头的表:canal\\.canal.*
canal schema下的一张表:canal.test1
多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔)
注意: 两台机器上的instance目录的名字需要保证完全一致,HA模式是依赖于instance name进行管理,同时必须都选择default-instance.xml配置
启动两台机器的canal
sh bin/startup.sh
启动后,你可以查看logs/example/example.log,只会看到一台机器上出现了启动成功的日志。
比如我这里启动成功的
2013-03-19 18:18:20.590 [main] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [canal.properties]
2013-03-19 18:18:20.596 [main] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [example/instance.properties]
2013-03-19 18:18:20.831 [main] INFO c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-example
2013-03-19 18:18:20.845 [main] INFO c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start successful...
查看一下zookeeper中的节点信息,也可以知道当前工作的节点
[zk: localhost:2181(CONNECTED) 15] get /otter/canal/destinations/example/running
{"active":true,"address":"10.20.144.51:11111","cid":1}
三.canal高可用实现方式的分析
1.服务端高可用
Canal服务端目前是一主一从两个实例,基于zookeeper集群实现高可用,具体逻辑:
首先最先启动连接到zookeeper集群的canal服务端实例作为主,会在zookeeper上建立/otter/canal/destinations/canal实例名/running节点,并且保存数据{"active":true,"address":"192.168.4.181:10001","cid":1}来标识主canal的信息;
主canal服务端如果挂了,会触发此节点删除事件,从canal服务端会去抢占建立runnging节点成为主canal服务端;
2. 客户端高可用
Canal客户端目前是一主一备两个实例,基于zookeeper集群实现高可用,具体逻辑:
首先最先启动连接到zookeeper集群的canal客户端实例作为主,会在zookeeper上建立/otter/canal/destinations/canal服务端实例名/1001/running节点;
主canal客户端如果挂了,会触发此节点删除事件,从canal客户端会去抢占建立runnging节点成为主canal客户端。