使用docker-compose快速实现mysql的主从复制
使用docker-compose快速实现mysql的主从复制
条件
- 确保已经正确安装并启动了 Docker。确保
docker-compose
命令可用。 - 创建一个目录,用于存放 MySQL 配置文件和数据文件。
- 在该目录下创建一个名为
docker-compose.yml
的文件,并添加以下内容:
version: '3'
services:
master:
image: mysql:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_ROOT_HOST: '%'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: gopan
MYSQL_REQUIRE_SECURE_TRANSPORT: '1'
MYSQL_SERVER_ID: 1
ports:
- "3306:3306"
volumes:
- ./data/master:/var/lib/mysql
command: --server-id=1 --log-bin --binlog-do-db=gopan
slave:
image: mysql:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_ROOT_HOST: '%'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: gopan
MYSQL_REQUIRE_SECURE_TRANSPORT: '1'
MYSQL_SERVER_ID: 2
ports:
- "3307:3306"
volumes:
- ./data/slave:/var/lib/mysql
command: --server-id=2 --log-bin --binlog-do-db=gopan --relay-log --relay-log-index=slave-relay-bin.index --relay-log-info-repository=TABLE
上述配置文件使用了 mysql:latest
镜像,并创建了两个服务 master
和 slave
。master
服务将在本机的 3306 端口上运行,slave
服务将在本机的 3307 端口上运行。你可以根据需要修改端口号和密码。
==现在讲一下command里面的内容:==
command: --server-id=2 --log-bin --binlog-do-db=gopan --relay-log --relay-log-index=slave-relay-bin.index --relay-log-info-repository=TABLE
--server-id=2
此标志将 MySQL 服务器的服务器 ID 设置为 2。参与复制的每个服务器都应具有唯一的服务器 ID。
--log-bin
此标志在服务器上启用二进制日志记录,这会在二进制日志文件中记录对数据库的更改。
--binlog-do-db=gopan
此标志指定只有对“gopan”数据库所做的更改才应包含在二进制日志中。
--relay-log
此标志启用中继日志记录。中继日志用于复制方案,其中主服务器的二进制日志中的更改将应用于从属服务器。中继日志存储从主数据库接收的事件,然后再应用于从属数据库。
--relay-log-index=slave-relay-bin.index
此标志指定中继日志的索引文件的名称。“slave-relay-bin.index”文件跟踪中继日志文件。
--relay-log-info-repository=TABLE
此标志指定存储复制元数据的存储库。在这种情况下,元数据存储在表中。复制元数据包括复制坐标和中继日志位置等信息。
总体而言,此扩展命令使用服务器 ID 2 配置 MySQL 服务器,启用二进制日志记录和中继日志记录,指定要包含在二进制日志中的“gopan”数据库,设置中继日志的索引文件,并选择表作为复制元数据的存储库。
快速开始
- 打开终端,进入该目录,并运行以下命令启动主从容器:
docker-compose up -d
- 等待一段时间,容器将启动并运行 MySQL 服务。你可以使用以下命令检查容器是否正在运行:
docker ps
- 进入
master
容器内部,运行以下命令登录到 MySQL 控制台:
docker exec -it <master_container_id> mysql -uroot -p
- 在
master
控制台中,创建一个用于复制的用户并授予相应权限。运行以下命令:
CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
==注意,这里有一个很坑的点!==针对于mysql8.0
SELECT plugin FROM `user` where user = 'repl';
显示的是caching_sha2_password
在MySQL 8.0中,caching_sha2_password
是默认的身份验证插件,而不是mysql_native_password
ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
现在我们换回去,不然等会会报错
- 继续在
master
控制台中,运行以下命令获取二进制日志文件名和位置:
SHOW MASTER STATUS;
记住File
和Position
的值
SHOW MASTER STATUS
记下输出中的 File
和 Position
值,稍后将在从服务器上使用。
- 进入
slave
容器内部,运行以下命令登录到 MySQL 控制台:
docker exec -it <slave_container_id> mysql -uroot -p
输入:
CHANGE MASTER TO
MASTER_HOST='192.168.208.6',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='eea288daeb29-bin.000003',
MASTER_LOG_POS=157;
START SLAVE;
请替换 <MASTER_HOST>
、和 <MASTER_PORT
分别为主服务器容器的 IP 地址和端口、ip地址可以docker inspect <容器ID>
查出来,MASTER_LOG_FILE
,MASTER_LOG_POS
就是我们刚刚查出来的那两个
==注意==:如果上面你打错了,在重新修改会报错:[HY000][3021] This operation cannot be performed with a running replica io thread; run STOP REPLICA IO_THREAD FOR CHANNEL '' first.
是因为在设置主从复制时,从服务器的复制 I/O 线程正在运行,需要先停止该线程才能执行操作。
STOP SLAVE IO_THREAD;
- 在
slave
控制台中,运行以下命令检查从服务器的状态,确保复制正在运行:
SHOW SLAVE STATUS;
主要是看这两个是不是yes,如果不是可以看Slave_IO_State或者直接进容器看
好啦,不出意外已经实现主从集群啦😘
感谢
如果你觉得我的文章对你有帮忙,欢迎点赞,关注,有问题可以在评论区直接提出来,感谢大家的阅读!🥰🥰🥰🥰🥰🥰
转载自:https://juejin.cn/post/7233324859932098616