两台互通的服务器使用Docker部署一主两从MySQL8.0.35

文章目录

1. 使用Docker Overlay网络(需Swarm模式)

首先,在两台服务器上创建一个 Docker 网络,确保容器可以通过该网络相互通信。

在服务器1(172.25.0.19)上:
bash 复制代码
# 在服务器1初始化Swarm
docker swarm init --advertise-addr 172.25.0.19

# 执行后会输出类似以下内容:
Swarm initialized: current node (hw0h813f85fgoonyifc5lsvpx) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5jq69qtjwv9iod6hep02389p6lll2sa3grcp9xatnre15iwj33-7sr5tb2e9m28hbcztpe0qf5r3 172.25.0.19:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
在服务器2(172.25.0.20)上:
bash 复制代码
# 在服务器2加入Swarm
docker swarm join --token SWMTKN-1-5jq69qtjwv9iod6hep02389p6lll2sa3grcp9xatnre15iwj33-7sr5tb2e9m28hbcztpe0qf5r3 172.25.0.19:2377

# 加入成功后,会显示:
This node joined a swarm as a worker.
创建 overlay 网络(172.25.0.19):

在 Swarm 初始化后,需要在 Swarm 管理节点(即服务器1)上创建可附加的 overlay 网络,使用 --attachable 参数:

bash 复制代码
# 创建overlay网络
docker network create -d overlay --attachable mysql-cluster

2. 部署主节点

在服务器1上部署 MySQL 主节点,并对外暴露端口。

bash 复制代码
docker run -d \
  --name mysql-master \
  --network mysql-cluster \
  -e MYSQL_ROOT_PASSWORD='8th3xY]:NA' \
  -e MYSQL_DATABASE=test \
  -e MYSQL_USER=replication \
  -e MYSQL_PASSWORD='@2X0wZY/rq' \
  -p 3307:3306 \
  mysql:8.0.35 \
  --server-id=1 \
  --log-bin=mysql-bin \
  --bind-address=0.0.0.0  # 允许所有IP连接

3. 部署从节点1

在服务器1上部署 MySQL 从节点1,不对外暴露端口。

bash 复制代码
docker run -d \
  --name mysql-slave1 \
  --network mysql-cluster \
  -e MYSQL_ROOT_PASSWORD='8th3xY]:NA' \
  -e MYSQL_DATABASE=test \
  -e MYSQL_USER=replication \
  -e MYSQL_PASSWORD='@2X0wZY/rq' \
  mysql:8.0.35 \
  --server-id=2 \
  --log-bin=mysql-bin

4. 部署从节点2

在服务器2上部署 MySQL 从节点2,不对外暴露端口。

bash 复制代码
docker run -d \
  --name mysql-slave2 \
  --network mysql-cluster \
  -e MYSQL_ROOT_PASSWORD='8th3xY]:NA' \
  -e MYSQL_DATABASE=test \
  -e MYSQL_USER=replication \
  -e MYSQL_PASSWORD='@2X0wZY/rq' \
  mysql:8.0.35 \
  --server-id=3 \
  --log-bin=mysql-bin

5. 配置主从复制

在主节点上配置从节点1和从节点2的复制。

进入主节点容器:
ini 复制代码
docker exec -it mysql-master mysql -uroot -p'8th3xY]:NA'
在主节点上授权复制用户:
mysql 复制代码
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
FLUSH PRIVILEGES;

在主库上修改复制用户的认证插件为 mysql_native_password(5.7版本则不用执行此步骤):

mysql 复制代码
ALTER USER 'replication'@'%' IDENTIFIED WITH mysql_native_password BY '@2X0wZY/rq';
FLUSH PRIVILEGES;
查看主节点状态:
mysql 复制代码
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     1007 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

记录 FilePosition 的值,稍后会在从节点上使用。

进入从节点1容器:
bash 复制代码
docker exec -it mysql-slave1 mysql -uroot -p'8th3xY]:NA'
在从节点1上配置复制:
msyql 复制代码
CHANGE MASTER TO
  MASTER_HOST='mysql-master',
  MASTER_USER='replication',
  MASTER_PASSWORD='@2X0wZY/rq',
  MASTER_LOG_FILE='mysql-bin.000003',
  MASTER_LOG_POS=1007;
START SLAVE;
进入从节点2容器:
bash 复制代码
docker exec -it mysql-slave2 mysql -uroot -p'8th3xY]:NA'
在从节点2上配置复制:
mysql 复制代码
CHANGE MASTER TO
  MASTER_HOST='mysql-master',
  MASTER_USER='replication',
  MASTER_PASSWORD='@2X0wZY/rq',
  MASTER_LOG_FILE='mysql-bin.000003',
  MASTER_LOG_POS=1007;
START SLAVE;

6. 验证复制状态

在从节点1和从节点2上执行以下命令,查看复制状态:

mysql 复制代码
SHOW SLAVE STATUS\G

确保 Slave_IO_RunningSlave_SQL_Running 都为 Yes

例如:

mysql 复制代码
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: mysql-master
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 1007
               Relay_Log_File: acd704f632bf-relay-bin.000002
                Relay_Log_Pos: 326
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1007
              Relay_Log_Space: 543
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: dc75461f-f3e7-11ef-844a-02420a000202
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set, 1 warning (0.00 sec)
相关推荐
小猿姐21 小时前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
云技纵横1 天前
Gap Lock 死锁实战:5 秒在本地复现 MySQL 间隙锁死锁
后端·mysql
无响应de神1 天前
三、用户与权限管理
数据库·mysql
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz2 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn862 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker