1 MySQL双主双从原理
为了分担单台数据库服务器的压力,采用了一主一从模式,对数据进行了读取操作的分离;
但是如果 master 发生故障时,整个数据库将不可用。
为了进一步提高数据库的高可用,采用双主双从架构,两台主库,分别将对方作为自己的master,自己作为对方的 slave 来进行复制。
2 环境准备
2.1 环境清理
停止之前创建的docker容器:
docker stop 容器ID
并将其卸载:
docker rm 容器ID
2.2 环境规划
准备4台服务器或者安装到4个容器中:
编号 | 角色 | IP地址 | 端口 | 服务器名 |
---|---|---|---|---|
1 | master1 | 192.168.137.3 | 3366 | |
2 | slave1 | 192.168.137.3 | 3377 | |
3 | master2 | 192.168.137.3 | 3388 | |
4 | slave2 | 192.168.137.3 | 3399 |
3 环境搭建
3.1 创建docker容器
分别创建规划的四个容器
docker run -d -p 3366:3306 -e MYSQL_ROOT_PASSWORD=123456 --name=master1 mysql:5.7
docker run -d -p 3377:3306 -e MYSQL_ROOT_PASSWORD=123456 --name=slave1 mysql:5.7
docker run -d -p 3388:3306 -e MYSQL_ROOT_PASSWORD=123456 --name=master2 mysql:5.7
docker run -d -p 3399:3306 -e MYSQL_ROOT_PASSWORD=123456 --name=slave2 mysql:5.7
四个容器创建完成,并处于启动状态
3.2 修改mysql数据库配置
进入到mysql容器,因要对mysql配置文件进行修改,而容器中缺少vim编辑器,首先需要在容器中进行安装。
分别进入到四个容器中
docker exec -it master1 /bin/bash
在容器里安装vim
yum install vim -y
3.2.1 开启master服务器的binlog日志
在master1 master2 容器中修改配置,开启binlog日志;其中 server-id 的值 master1 中设置1,master2 中设置2,也可以设置成其它不能相同的值即可。
server-id=1
log-bin=mysql_bin
3.2.2 开启slave服务器的relaylog日志
- relaylog日志
在这种集群设置中,需要使用relaylog日志:
relaylog日志也可以称为中继日志。
master主节点的binlog传到slave从节点后,被写进relay log里,从节点的slave sql线程从relaylog里读取日志,然后应用到slave从节点本地。从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致。
- 配置
在slave1 slave2 容器中修改配置,开启relaylog日志;其中 server-id 的值 slave1 中设置3,slave2 中设置4,也可以设置成其它不能相同的值即可。
server-id=3
relay-log=mysql-relay
3.3 重启所有容器
通过 docker 指令重新启动所有容器,使之前修改的 mysql 配置生效。
docker restart $(docker ps -aq)
3.4 配置master节点
3.4.1 分别进入到两个master容器
docker exec -it master1 /bin/bash
docker exec -it master2 /bin/bash
3.4.2 进入mysql命令行
mysql -uroot -p123456
3.4.3 创建用于从库同步的用户,并分配所有权限
GRANT replication SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY '123456';
3.4.4 查看master节点binlog状态
show master status;
master1节点
master2节点
3.5 配置slave节点
3.5.1 进入到slave容器
docker exec -it slave1 /bin/bash
docker exec -it slave2 /bin/bash
3.5.2 进入mysql命令行
mysql -uroot -p123456
3.5.3 执行到master节点的同步命令
slave1节点
change master to master_host='192.168.137.3',master_port=3366,master_user='slave_user',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=443;
slave2节点
change master to master_host='192.168.137.3',master_port=3388,master_user='slave_user',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=443;
注意:
这里的master_host可以使用物理机的IP和端口,也可以使用容器中被随机分配的IP地址。
3.5.4 开启同步
start slave;
3.5.5 查看从库的状态
show slave status G;
slave1
slave2
3.6 配置master节点互为主从
3.6.1 master1节点配置
进入master1容器
docker exec -it master1 /bin/bash
进入msql命令行
mysql -uroot -p123456
执行到master2的同步指令
change master to master_host='192.168.137.3',master_port=3388,master_user='slave_user',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=443;
启动同步
start slave;
查看同步状态
show slave status G;
3.6.2 master2节点配置
进入master2容器
docker exec -it master2 /bin/bash
进入msql命令行
mysql -uroot -p123456
执行到master2的同步指令
change master to master_host='192.168.137.3',master_port=3366,master_user='slave_user',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=443;
启动同步
start slave;
查看同步状态
show slave status G;
3.7 修改mycat配置
修改mycat配置文件 schema.xml。
增加一个 writeHost 节点,并修改 host 属性为唯一值。
重新启动mycat
mycat restart
双主双从的读写分离架构,创建完成。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!