前言
昨天写了一篇关于mysql主从复制的文章,今天我们来讲讲主主复制。
前期准备,需要安装好docker、docker-compose的运行环境。
docker运行mysql容器,如何实现主从复制?-CSDN博客
一、运行mysql容器
1、创建mysql目录,执行如下命令。
mkdir -p /docker/mysql-mm
cd /docker/mysql-mm
2、编写yaml文件,执行如下命令。version替换成自己的compose版本;数据库密码重新设定新密码。如果需要多台从机则自行添加相应内容。
version: '2.2.2'
services:
mysql-mm-1:
image: mysql:8.0
container_name: mysql-mm-1
command: --server-id=1 --log-bin=mysql-bin --binlog-do-db=mydb --binlog-ignore-db=mysql --sync-binlog=1 --log-slave-updates=1 --auto-increment-increment=2 --auto-increment-offset=1
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456.
networks:
- dbnet
mysql-mm-2:
image: mysql:8.0
container_name: mysql-mm-2
command: --server-id=2 --log-bin=mysql-bin --binlog-do-db=mydb --binlog-ignore-db=mysql --sync-binlog=1 --log-slave-updates=1 --auto-increment-increment=2 --auto-increment-offset=2
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456.
networks:
- dbnet
networks:
dbnet:
name: dbnet
driver: bridge
3、启动服务,执行如下命令。
docker-compose up -d
4、检查服务是否正常启动,执行如下命令。
docker-compose ps -a
正常启动会返回如下内容。
5、至此mysql容器已正常运行,接下来进行mysql主机配置。
二、配置mysql
1、新开两个窗口,分别进入mysql容器,执行如下命令。
# 进入主机1容器
docker exec -ti mysql-mm-1 bash
# 进入主机2容器
docker exec -ti mysql-mm-2 bash
2、登录mysql,两个容器都需要执行如下命令,输入第一步的时候配置的密码。
mysql -uroot -p
3、给两个mysql服务器创建账号用于复制,执行如下SQL,需要替换成自己的账号密码。
# 创建账号&密码
CREATE USER 'repl_ayzen'@'%' IDENTIFIED BY 'repl_123456.';
# 给用户授权
GRANT REPLICATION SLAVE ON *.* TO 'repl_ayzen'@'%';
# 刷新权限
FLUSH PRIVILEGES;
4、分别在主机1、主机2查看服务器的二进制日志状态,执行如下SQL。
SHOW MASTER STATUS;
正常会返回如下内容,需要记住File、Position,用于配置从机的时候使用。
上图为mysql-mm-1的二进制日志状态。
上图为mysql-mm-2的二进制日志状态。
5、配置主机1复制,执行如下SQL,填写的是主机2的二进制日志信息。
CHANGE MASTER TO
MASTER_HOST='mysql-mm-2',
MASTER_USER='repl_ayzen',
MASTER_PASSWORD='repl_123456.',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=2010;
6、启动主机1的复制,执行如下SQL。
start slave;
7、检查主机1的复制状态,执行如下SQL。
show slave status\G;
正常会返回如下内容。
查看 Master_Log_File 和 Read_Master_Log_Pos 的值是否为刚刚配置的值。
查看 Slave_IO_Running
和 Slave_SQL_Running
的值是否都为 Yes
。如果是,那么主机1正在正常地从主机2复制数据。
8、同样的方式配置主机2复制,执行如下SQL,填写的是主机1的二进制日志信息。
CHANGE MASTER TO
MASTER_HOST='mysql-mm-1',
MASTER_USER='repl_ayzen',
MASTER_PASSWORD='repl_123456.',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=2000;
9、同样的方式开启复制,查看状态,执行如下SQL。
start slave;
show slave status\G;
正常会返回如下内容。
查看 Master_Log_File 和 Read_Master_Log_Pos 的值是否为刚刚配置的值。
查看 Slave_IO_Running
和 Slave_SQL_Running
的值是否都为 Yes
。如果是,那么主机2正在正常地从主机1复制数据。
10、至此,双主机的配置也已经完成,接下来就是进行测试验证。
三、测试验证
1、在主机1上创建数据库,执行如下SQL,然后在主机2上检查是否有同步。
create database mydb;
2、在主机2上创建用户表users,执行如下SQL,然后在主机1上检查是否有同步。
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
age INT NOT NULL
);
3、在主机1上给users表插入数据,执行如下SQL,然后在主机2上检查是否有同步。
insert into users(name,age) values('ayzen',18);
4、在主机2上修改users表数据,执行如下SQL,然后在主机1上检查是否有同步。
update users set age=20 where id=1 limit 1;
5、在主机1上删除users表数据,执行如下SQL,然后在主机2上检查是否有同步。
delete from users where id=1 limit 1;
6、小结,mysql双主复制的配置已完成并且验证OK。
总结
使用docker运行mysql容器并且配置双主复制,简单来说就三个步骤。
1、安装运行mysql容器;
2、配置两台mysql主机,创建账号,获取状态,启动服务器复制;
3、双主数据库的测试验证;
本人能力有限,还有许多不足之处还望多多指教,谢谢。