创建mysql账户

如果使用的是root用户,则不需要操作这个步骤

grant all privileges on . to ‘jcc’@’%’ identified by ‘jcc’;
flush privileges;

配置mysql (参见canal Quickstart)

启用binlog日志
打开 mysql.cnf 文件

1
2
3
4
[mysqld] 
log-bin=mysql-bin
binlog-format=ROW #选择row模式
server_id=9527 #配置mysql replaction需要定义,不能和canal的slaveId重复

添加slave权限

如果使用的是root用户,则不需要操作这个步骤

1
2
CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, SHOW VIEW, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';FLUSH PRIVILEGES;

创建canal server 服务端

需要提前安装好Docker,如果不会安装,可以参考我之前写的文章 CentOS7 安装 Docker

1
docker run -p 11111:11111 -e canal.auto.scan=false -e canal.instance.master.address=127.0.0.1:3306 -e canal.instance.dbUsername=test -e canal.instance.dbPassword=test -e canal.instance.connectionCharset=UTF-8 -e canal.instance.tsdb.enable=true -e canal.instance.gtidon=false -e canal.instance.filter.regex=.*\\..* -e canal.destinations=test  -d canal/canal-server

需要替换以下参数

  • canal.instance.master.address=127.0.0.1:3306 地址ip更换(尽量用内网)
  • canal.instance.dbUsername=test 数据库账户
  • canal.instance.dbPassword=test 数据库密码
  • canal.destinations=test test为名称 可以修改
  • 11111:11111 服务器端口:docker端口

需要注意的是,所填写的数据库账户必须拥有数据库的操作权限,如果不知道权限如何配置,则建议直接使用root用户

canal 客户端

我们这里使用Go客户端,因为Go语言的特性,可以很好的运行在Docker上

canal-go 文档: withlin/canal-go

开发过程可以参照文档

Docker启动canal客户端

推荐使用Jenkins配置 canal-go
构建成功后执行shell

1
2
docker build -t canal_prod:v1 ${WORKSPACE}
docker service update --image canal_prod:v1 --force --no-resolve-image canal_prod

如果看过我之前的 代码架构文章,可以在Portainer中看到打印在控制台的文字,也可以看到运行状态

FAQ问题解决

Q:如果服务停止了,如何解决
A:链接到canal-server的Docker内部,查看 canal-server - logs 中的日志

Q:如果数据同步失败了如何解决
A:很大可能是由于改变了数据库结构导致的,需要重启客户端和服务端尝试

Q:一开始数据就不同步
A:查看你的数据库账户是否有权限,如无权限则修改服务端启动时附带的数据库账户参数