使用docker-compose快速实现mysql的主从复制

440 阅读4分钟

使用docker-compose快速实现mysql的主从复制

条件

  1. 确保已经正确安装并启动了 Docker。确保 docker-compose 命令可用。
  2. 创建一个目录,用于存放 MySQL 配置文件和数据文件。
  3. 在该目录下创建一个名为 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 镜像,并创建了两个服务 masterslavemaster 服务将在本机的 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”数据库,设置中继日志的索引文件,并选择表作为复制元数据的存储库。

快速开始

  1. 打开终端,进入该目录,并运行以下命令启动主从容器:
docker-compose up -d
  1. 等待一段时间,容器将启动并运行 MySQL 服务。你可以使用以下命令检查容器是否正在运行:
docker ps
  1. 进入 master 容器内部,运行以下命令登录到 MySQL 控制台:
docker exec -it <master_container_id> mysql -uroot -p
  1. 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';

现在我们换回去,不然等会会报错

  1. 继续在 master 控制台中,运行以下命令获取二进制日志文件名和位置:
SHOW MASTER STATUS;

记住FilePosition的值

image-20230515173944471

SHOW MASTER STATUS

记下输出中的 FilePosition 值,稍后将在从服务器上使用。

  1. 进入 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;
  1. slave 控制台中,运行以下命令检查从服务器的状态,确保复制正在运行:
SHOW SLAVE STATUS;

image-20230515174919738

主要是看这两个是不是yes,如果不是可以看Slave_IO_State或者直接进容器看

image-20230515175007419

好啦,不出意外已经实现主从集群啦😘

感谢

如果你觉得我的文章对你有帮忙,欢迎点赞,关注,有问题可以在评论区直接提出来,感谢大家的阅读!🥰🥰🥰🥰🥰🥰