大家好,我是袁庭新。
在多数情况下,客户端往往会优先获取缓存中的数据。然而,当缓存数据与数据库中的实际数据存在显著不一致时,可能会导致严重的后果。因此,确保数据库与缓存数据之间的一致性变得至关重要,这一过程被称为缓存与数据库的同步。
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这个库的操作权限。
mysql">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中,输入以下命令。
mysql">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主从同步的环境搭建完成。