步骤1:安装canal
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz tar zvfx canal.deployer-1.1.4.tar.gz
步骤2:配置my.cnf,创建canal用户并重启mysql
[mysqld] log-bin=mysql-bin # 开启Binlog binlog-format=ROW # 设置Binlog格式为ROW server_id=1 # 配置一个ServerID
创建一个canal账户
CREATE USER canal IDENTIFIED BY 'canal123456';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;
重启一下 MySQL,确保所有的配置生效。
systemctl start mysqld
重启后检查一下当前的 Binlog 文件和位置
步骤3:配置canal
编辑instance.properties
vim /usr/local/software/canal/conf/example/instance.properties
canal.instance.gtidon=false
# position info
canal.instance.master.address=127.0.0.1:3306 canal.instance.master.journal.name=mysql-bin.000001 canal.instance.master.position=777 canal.instance.master.timestamp= canal.instance.master.gtid= # username/password canal.instance.dbUsername=canal canal.instance.dbPassword=xxxxxxx canal.instance.connectionCharset = UTF-8 canal.instance.defaultDatabaseName=test # table regex canal.instance.filter.regex=.*\\..
步骤4:启动canal
Canal 服务启动后,会开启一个端口(11111)等待客户端连接,客户端连接上 Canal 服务之后,可以从 Canal 服务拉取数据,每拉取一批数据,进行业务处理之后,给 Canal 服务返回处理成功的响应。
如果发生客户端程序宕机或者处理失败等异常情况,Canal 服务没收到处理成功的响应,下次客户端来拉取的还是同一批数据,这样就可以保证顺序并且不会丢数据。
步骤5:本地环境搭建并测试
本地需要安装redis,以及编写同步代码,代码可以参考:https://github.com/liyue2008/canal-to-redis-example
然后启动工程,canal将连接到canal服务端,canal服务端能够将从指定的binlog位置同步数据下来解析。
这里解释下原理:
- Canal 模拟 MySQL 主从复制的交互协议,把自己伪装成一个 MySQL 的从节点,向 MySQL 主节点发送 dump 请求,
MySQL 收到请求后,就会开始推送 Binlog 给 Canal,Canal 解析 Binlog 字节流之后,转换为便于读取的结构化数据,
供下游程序订阅使用.
- 客户端连接上 Canal 服务之后,可以从 Canal 服务拉取数据,每拉取一批数据,正确写入 Redis 之后,给 Canal 服务
返回处理成功的响应。
- 如果发生客户端程序宕机或者处理失败等异常情况,Canal 服务没收到处理成功的响应,下次客户端来拉取的还是同一
批数据,这样就可以保证顺序并且不会丢数据。
更新数据库的一条记录,canal客户端将从服务端拉取到更新后的数据出来解析。
然后在redis查询get canal:
这样就完成了基于binlog的canal到redis的同步!