开发环境布署:
canal服务端布署:192.168.1.150:11111,路径:/usr/local/canal
主库192.168.1.136:3306,帐号root,密码123456,被同步的数据库是canal_tdb
canal客户端布署:192.168.1.150:8802,路径:/usr/local/canal-client,日志/usr/local/canal-client/logs/stu-out.log
从库192.168.1.36:3306,帐号root,密码123456,mysql数据库安装在docker
服务器帐号密码:
192.168.1.150:22 帐号root 密码 Sm!R18rdl
192.168.1.36:22 帐号root 密码Admin123
1、安装zookeeper3.4.5(canal版本是1.3的话zookeeper必须是这个版本,其他版本可能会有问题)
http://archive.apache.org/dist/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz
2、复制conf的zoo_example.cfg并改名为zoo.cfg,并修改配置如下,创建data和logs文件夹。
dataDir=/usr/local/zookeeper/zookeeper-3.4.5/data #安装目录/data
dataLogDir=/usr/local/zookeeper/zookeeper-3.4.5/logs #安装目录/logs
admin.serverPort=2182 ##修改启动服务的端口添加此参数,不是对client端提供服务的端口2181
3、新建myid文件,输入一个数值作为id,保存在data目录下;
4、到bin目录启动zookeeper;
./zkServer.sh start
5、安装canal1.1.3(mysql8.0及以上的需要用这个版本)
https://github.com/alibaba/canal/releases/download/canal-1.1.3/canal.deployer-1.1.3.tar.gz
6、修改数据库 /etc/my.cfg配置,有则修改无则添加。
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
binlog-rows-query-log-events = 1 ##开启sq模式,binlog显示完整sql
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
7、登录mysql输入以下命令,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; ##刷新
8、修改 canal/conf下的canal.properties配置文件
canal.id = 11110001 #canal的id,暂无意义,不过要和slave_id 的值不一样
canal.ip =192.168.1.150 #服务IP地址,集群必填,单机可不填,不能是127.0.0.1和localhost
canal.port = 11111 #端口
canal.metrics.pull.port = 11112 #默认就好,多个服务端视情况设置
canal.zkServers =127.0.0.1:2181 #zookeeper的地址和端口,可配置集群,用逗号隔开
…
#canal.instance.global.spring.xml = classpath:spring/file-instance.xml #默认单机
canal.instance.global.spring.xml = classpath:spring/default-instance.xml #集群选项(与上二选 一)
9、修改conf下的example/instance.properties
canal.instance.master.address=192.168.1.150:3310 #主库的IP和端口
......
# username/password 从库权限的帐号密码与编码
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
# table regex 白名单过滤
#多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
#常见例子:
#1. 所有表:.* or .*\\..*
#2. canal schema下所有表: canal\\..*
#3. canal下的以canal打头的表:canal\\.canal.*
#4. canal schema下的一张表:canal.test1
#5. 多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔)
#注意:此过滤条件只针对row模式的数据有效(ps. mixed/statement因为不解析sql,所以无法准确提取tableName进行过滤)
canal.instance.filter.regex=message\\..*
# table black regex 黑名单过滤,规则与白名单一致,这里最好过滤mysql表的数据,如下
canal.instance.filter.black.regex=mysql\\..*
# mq config mq的配置
canal.mq.topic=example
# dynamic topic route by schema or table regex
#canal.mq.dynamicTopic=example:.*\\..*
canal.mq.partition=0
# hash partition config
10、回到bin目录下启动canal;
注意事项:
在canal.properties配置文件里canal.destinations的值是对应的一个数据库连接的Instance,必须要在canal的conf目录下创建一个名字一样的文件夹,并在文件夹里复制一个instance.properties文件。
#################################################
######### destinations #############
#################################################
canal.destinations = example,example1 ##添加实例名,逗号隔开
# conf root dir
canal.conf.dir = …/conf
# auto scan instance dir add/remove and start/stop instance
canal.auto.scan = true
canal.auto.scan.interval = 5
11、修改canal客户端的application.yml配置文件:
server:
#客户端端口
port: 8081
#JDBC配置
spring:
datasource:
#JDBC驱动
driver-class-name: com.mysql.cj.jdbc.Driver
#要同步到的数据库地址
url: jdbc:mysql://127.0.0.1:3306/trade?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&generateSimpleParameterMetadata=true&useSSL=false&&serverTimezone=UTC
username: root #帐号
password: 116334 #密码
#cannal配置
cannal1:
client:
#单机配置 格式IP:PORT
address:
#环境共用参数,instance实例名称
destination: example
username:
password:
#集群配置,zookeeper的Ip与端口,格式IP:PORT,中间逗号隔开
zkservers: 192.168.1.150:2181
# 同canal filter,用于过滤database或者table的相关数据不进行同步,用逗号隔开
filter:
12、启动客户端canal-client
修改客户端rabbitmq的配置并启动,详细配置说明见项目目录下配置文件。
13、观察日志文件是否获取到sql,如果获取到sql说明启动成功,如果未获取到,可能是以下原因:
1、 Canal未注册到zookeeper。回到zookeeper的bin目录,输入zkServer.sh –server 127.0.0.1:2181进入zookeeper,然后再输入
get /otter/canal/destinations/example/running查看canal节点信息,要注意确认address必须要与本地地址一致。如果不一致,执行“rm /节点名”命令删除节点,然后查看canal安装目录下的canal.properties配置文件确认IP地址。
2、 Canal连接不上数据库。再次查看配置文件,确认无误后,在对应的Instance实例目录下,如example,删除meta.dat文件,重启canal。