Bootstrap

Cannal实现MySQL主从同步环境搭建

大家好,我是袁庭新。

在多数情况下,客户端往往会优先获取缓存中的数据。然而,当缓存数据与数据库中的实际数据存在显著不一致时,可能会导致严重的后果。因此,确保数据库与缓存数据之间的一致性变得至关重要,这一过程被称为缓存与数据库的同步。

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主从同步的环境搭建完成。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;