canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于MySQL数据库增量日志解析,提供增量数据订阅和消费。canal是阿里巴巴旗下的一款开源项目,基于Java开发。
而canal就是把自己伪装成MySQL的一个Slave节点,从而监听master的binary log变化。再把得到的变化信息通知给canal的客户端,进而完成对其它数据库的同步。
1 安装MySQL
后期做数据同步需要用到MySQL的主从功能,所以需要大家在虚拟机中,利用Docker来运行一个MySQL容器。
1.1 准备目录
为了方便后期配置MySQL,我们先准备两个目录,用于挂载容器的数据和配置文件目录。
# 进入/tmp目录
cd /tmp
# 创建文件夹
mkdir mysql
# 进入mysql目录
cd mysql
1.2 运行命令
进入mysql目录后,执行下面的Docker命令:
docker run \
-p 3306:3306 \
--name mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--privileged \
-d \
mysql:5.7.25
1.3 修改配置
在/tmp/mysql/conf目录添加一个my.cnf文件,作为mysql的配置文件:
# 创建文件
touch /tmp/mysql/conf/my.cnf
文件的内容如下:
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
1.4 重启MySQL
配置修改后,必须重启容器。
docker restart mysql
下面我们来开启MySQL的主从同步机制,让canal来模拟Salve。
2 开启MySQL主从
canal是基于MySQL的主从同步功能,因此必须先开启MySQL的主从功能才可以。这里以之前用Docker运行的MySQL为例。
2.1 开启binlog
打开mysql容器挂载的日志文件,我的在/tmp/mysql/conf目录下。
修改my.cnf文件。
vi /tmp/mysql/conf/my.cnf
添加log-bin参数和binlog-do-db参数的配置,代码如下。
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=springboot_data
上述参数的含义是:
● log-bin参数:log-bin参数用于启用二进制日志功能,并指定二进制日志文件的前缀。二进制日志记录了所有对数据库进行更改的SQL语句(例如,INSERT、UPDATE、DELETE等)。
● binlog-do-db参数:用于指定只记录特定数据库的更改到二进制日志中。当配置了binlog-do-db后,MySQL只会将指定数据库的更改写入二进制日志,对于其他数据库的更改则不会记录。这个参数在需要限制二进制日志内容、减少日志量或者在进行部分复制时非常有用。
以上步骤操作完成后,此时my.cnf文件的完整内容见下。
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=springboot_data
2.2 设置用户权限
1.接下来添加一个仅用于数据同步的账户,出于安全考虑,这里仅提供对heima这个库的操作权限。
CREATE USER canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' identified by 'canal';
FLUSH PRIVILEGES;
2.然后重启mysql容器即可。
docker restart mysql
3.测试设置是否成功。在MySQL控制台,或者Navicat中,输入以下命令。
show master status;
4.如果效果如下图所示,则表明配置成功。
3 安装canal
3.1 创建网络
我们需要创建一个网络,将MySQL、Canal、MQ放到同一个Docker网络中。
docker network create yuanxin
让mysql加入这个网络。
docker network connect yuanxin mysql
3.2 安装canal
提前下载好canal的镜像压缩包(如canal.tar),然后可以上传到虚拟机,最后通过命令导入。
docker load -i canal.tar
然后运行命令创建Canal容器:
docker run -p 11111:11111 --name canal \
-e canal.destinations=yuanxin \
-e canal.instance.master.address=mysql:3306 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=canal \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false \
-e canal.instance.filter.regex=springboot_data\\..* \
--network yuanxin \
-d canal/canal-server:v1.1.5
下面是命令的详细解释:
● docker run: Docker的命令,用于运行一个新的容器实例。
● -p 11111:11111: 端口映射参数(canal的默认监听端口)。将容器内的11111端口映射到宿主机的11111端口上,这样就可以通过宿主机的端口访问容器内运行的服务。
● –name canal: 为这个容器实例指定一个名字,这里命名为”canal”。
● -e canal.destinations=yuanxin: 设置环境变量canal.destinations的值为yuanxin。这个变量指定了Canal实例的目标名称,Canal可以支持多个实例同时运行,每个实例都需要一个唯一的名称。
● -e canal.instance.master.address=mysql:3306: 设置环境变量canal.instance.master.address的值为mysql:3306,指定了Canal要连接的MySQL数据库的地址和端口。
● -e canal.instance.dbUsername=canal: 设置环境变量canal.instance.dbUsername的值为canal,指定了连接MySQL数据库的用户名。
● -e canal.instance.dbPassword=canal: 设置环境变量canal.instance.dbPassword的值为canal,指定了连接MySQL数据库的密码。
● -e canal.instance.connectionCharset=UTF-8: 设置环境变量canal.instance.connectionCharset的值为UTF-8,指定了连接MySQL数据库时使用的字符集。
● -e canal.instance.tsdb.enable=true: 设置环境变量canal.instance.tsdb.enable的值为true,启用时间戳数据库,用于记录Canal解析和处理的位置信息。
● -e canal.instance.gtidon=false: 设置环境变量canal.instance.gtidon的值为false,表示不启用全局唯一ID生成器。
● -e canal.instance.filter.regex=springboot_data\\..*: 设置环境变量canal.instance.filter.regex的值为springboot_data\\..*,这是一个正则表达式,用于指定Canal需要监控和同步的数据库和表。这里的意思是监控名为springboot_data的数据库下的所有表。
● –network yuanxin: 指定容器运行的网络模式为yuanxin,这意味着容器将加入名为yuanxin的Docker网络,可以与同一网络内的其他容器进行通信。
● -d canal/canal-server:v1.1.5: 指定容器使用的镜像为canal/canal-server,版本为v1.1.5,并且以守护进程(后台)模式运行容器。
至此,使用canal实现MySQL主从同步的环境搭建完成。
转载作品,原作者:袁庭新,文章来源:https://www.toutiao.com/article/7439632555072176694