先了解https://github.com/alibaba/canal
一、准备工作
1.对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
修改的配置文件后,记得重启mysql
用命令行或用navicat然后使用mysql库执行show variables like '%log_bin%';
验证一下
2.授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant
CREATE USER canal IDENTIFIED BY 'abc123456';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
3.创建好配置和日志相关目录
mkdir -p /root/canalserver/logs
下载镜像docker pull canal/canal-server:latest
暂时先运行容器docker run --name canalserver01 -d canal/canal-server:latest
进入容器docker exec -it canalserver01 bash
通过 ls和cd等命令找到配置文件,然后exit;退回到宿主机
从容器中拷贝出配置文件到刚才新建的/root/canalserver目录里:
docker cp canalserver01:/home/admin/canal-server/conf/canal.properties /root/canalserver
docker cp canalserver01:/home/admin/canal-server/conf/example/instance.properties /root/canalserver
输入cd /root/canalserver
目录,通过ls就可以看到了
停止并删除刚才的容器docker stop canalserver01
然后docker rm canalserver01
4.编辑instance.properties文件
#配置mysql的地址和端口
canal.instance.master.address=192.168.3.113:3306
#配置前面创建的专用于canal的mysql账号和密码
canal.instance.dbUsername=canal
canal.instance.dbPassword=abc123456
#配置消息队列路由key
canal.mq.topic=my_canal_routingkey
5.编辑canal.properties文件,目前1.1.5canal的RabbitMQ配置还不支持端口,只能使用默认端口 5672
canal.serverMode=rabbitMQ
rabbitmq.host=192.168.3.113
rabbitmq.virtual.host=my_rabbitmq_host
rabbitmq.exchange=my_canal_exchange
rabbitmq.username=admin
rabbitmq.password=abc123456
6.通过rabbitmq的web工具做相关配置
记得启动rabbitmq,最新版canal 1.1.5 也支持了 RabbitMQ
登录http://192.168.3.113:15672
在Exchanges里面新增一个my_canal_exchange
(这个名字在上面的配置文件中的一致,否则会在logs/example.log中看到报错说没有my_canal_exchange这个交换机)
在Queues里面新增一个my_canal_queue
队列,并绑定到my_canal_exchange这个交换机和my_canal_routingkey
添加完后一写记得重启rabbitmq服务
二、运行和验证canal-server容器
1.启动canal容器
docker run --name canalserver01 \
-p 11111:11111 \
-v /root/canalserver/canal.properties:/home/admin/canal-server/conf/canal.properties \
-v /root/canalserver/logs:/home/admin/canal-server/logs \
-v /root/canalserver/instance.properties:/home/admin/canal-server/conf/example/instance.properties \
-d canal/canal-server:latest
-p表示将宿主机端口左11111映射到容器内端口右11111
-v冒号左边是宿主机路径,右边是容器内路径
记得开放端口firewall-cmd --zone=public --add-port=11111/tcp --permanent
2.验证
打开navicat工具,把我UserDb库的UserInfo表的某个值修改一下,然后刷新rabbitmq Web管理页面就可以看到my_canal_queue有一条消息了。
3.也可通过docker-compose部署canal
version: '3'
services:
canal:
image: canal/canal-server:latest
container_name: canalserver01
restart: always
ports:
- 11111:11111
volumes:
- /root/canalserver/canal.properties:/home/admin/canal-server/conf/canal.properties
- /root/canalserver/logs:/home/admin/canal-server/logs
- /root/canalserver/instance.properties:/home/admin/canal-server/conf/example/instance.properties
三、使用C#客户端CanalSharp访问canal服务端
新建一个.net core3.1的控制应用程序,然后通过Nuget安装CanalSharp
依赖包
记得把配置改回tcp canal.serverMode = tcp
然后重启canalserver服务· 直接复制官方github上提供的示例代码,
注意SimpleCanalOptions第三个参数虽是字符串,但只能填正整数`

class Program
{
static async System.Threading.Tasks.Task Main(string[] args)
{
// 初始化日志
var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddFilter("Microsoft", LogLevel.Debug)
.AddFilter("System", LogLevel.Information)
.AddConsole();
});
var logger = loggerFactory.CreateLogger<SimpleCanalConnection>();
// 创建连接
var conn = new SimpleCanalConnection(new SimpleCanalOptions("192.168.3.149", 11111, "1"), logger);
// 连接到 Canal Server
await conn.ConnectAsync();
// 订阅
await conn.SubscribeAsync();
// 获取数据
var msg = await conn.GetAsync(1024);
Console.Read();
}
}
然后断点调试一切OK。