两台服务器上使用 Docker 部署 MySQL 5.7 实现主从复制的详细步骤

环境准备(主从服务器通用操作)

1. 系统更新与基础工具安装

bash

# 可选:更新系统软件包
yum update -y

# 安装必要工具
yum install -y net-tools vim curl wget bash-completion telnet

2. 防火墙与 SELinux 配置

bash

# 关闭并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld

# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux(需重启生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

3. YUM 源配置(CentOS 7)

bash

# 备份默认源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
# 配置阿里云源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 刷新缓存
yum clean all && yum makecache fast

4. 时间同步设置

bash

# 安装时间同步工具
yum install -y ntpdate
# 同步阿里云时间服务器
ntpdate ntp.aliyun.com
# 设置每小时自动同步
echo "0 */1 * * * /usr/sbin/ntpdate ntp.aliyun.com >/dev/null 2>&1" >> /etc/crontab
# 重启定时服务
systemctl restart crond

5. Docker 镜像加速配置

bash

# 创建Docker配置目录
mkdir -p /etc/docker

# 配置镜像加速器
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.m.daocloud.io"
  ]
}
EOF

# 重启Docker服务
systemctl daemon-reload
systemctl restart docker

6. Docker 安装

bash

# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker
yum install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
systemctl start docker
systemctl enable docker

7. 网络连通性验证

bash

# 主服务器测试与从服务器连接
ping 192.168.238.134 -c 4

# 从服务器测试与主服务器连接
ping 192.168.238.133 -c 4

# MySQL启动后测试3306端口连通性
# 主服务器测试从服务器
telnet 192.168.238.134 3306
# 从服务器测试主服务器
telnet 192.168.238.133 3306

一、主服务器配置(192.168.238.133)

1. 主机名设置

bash

# 临时修改
hostname mysql-master
# 永久生效
hostnamectl set-hostname mysql-master

2. 静态 IP 配置

bash

# 编辑网卡配置(注意实际网卡名称可能不同)
vi /etc/sysconfig/network-scripts/ifcfg-ens33

# 修改以下参数
BOOTPROTO=static
IPADDR=192.168.238.133
NETMASK=255.255.255.0
GATEWAY=192.168.238.1
DNS1=114.114.114.114
DNS2=8.8.8.8
ONBOOT=yes

# 重启网络
systemctl restart network

3. 配置 hosts 文件

bash

cat >> /etc/hosts << EOF
192.168.238.133 mysql-master
192.168.238.134 mysql-slave
EOF

4. 拉取 MySQL 镜像

bash

docker pull mysql:5.7

5. 创建数据和配置目录

bash

mkdir -p /docker/mysql/master/data
# 设置权限(MySQL容器内用户ID为999)
chown -R 999:999 /docker/mysql/master
chmod -R 755 /docker/mysql/master

6. 启动主库容器(使用 host 网络模式)

bash

# 检查端口占用
netstat -tulpn | grep 3306

# 停止并删除可能存在的旧容器
docker stop mysql-master 2>/dev/null || true
docker rm mysql-master 2>/dev/null || true

# 启动容器(使用host网络模式解决Docker网络问题)
docker run -d \
  --name mysql-master \
  --network host \
  -v /docker/mysql/master/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=root123 \
  --restart=always \
  mysql:5.7 \
  --server-id=10 \
  --log-bin=mysql-bin \
  --binlog_format=ROW \
  --expire_logs_days=7 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci \
  --bind-address=0.0.0.0

# 等待容器完全启动
sleep 30

7. 验证主库状态

bash

# 查看容器运行状态
docker ps | grep mysql-master

# 查看日志
docker logs mysql-master

# 测试MySQL连接
docker exec mysql-master mysql -uroot -proot123 -e "SELECT 1;"

8. 进入 MySQL 终端

bash

docker exec -it mysql-master mysql -uroot -proot123

9. 创建同步用户

sql

-- 删除可能存在的旧用户
DROP USER IF EXISTS 'slave'@'192.168.238.134';

-- 创建同步用户
CREATE USER 'slave'@'192.168.238.134' IDENTIFIED BY 'Slave@123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'192.168.238.134';

-- 刷新权限
FLUSH PRIVILEGES;

10. 锁定表并查看主库状态

sql

-- 锁定表(防止配置期间数据写入)
FLUSH TABLES WITH READ LOCK;

-- 记录File和Position值(配置从库必需)
SHOW MASTER STATUS;

示例输出(需记录):

plaintext

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     1434 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

11. 导出主库数据

在新的终端窗口中执行:

bash

# 导出数据(包含master-data信息)
docker exec mysql-master mysqldump -uroot -proot123 --all-databases --master-data --single-transaction > /tmp/master_data.sql

# 验证导出文件
ls -lh /tmp/master_data.sql

# 复制到从服务器
scp /tmp/master_data.sql root@192.168.238.134:/tmp/

12. 解锁主库表

回到 MySQL 终端:

sql

UNLOCK TABLES;
exit;

二、从服务器配置(192.168.238.134)

1. 主机名设置

bash

# 临时修改
hostname mysql-slave
# 永久生效
hostnamectl set-hostname mysql-slave

2. 静态 IP 配置

bash

# 编辑网卡配置
vi /etc/sysconfig/network-scripts/ifcfg-ens33

# 修改以下参数
BOOTPROTO=static
IPADDR=192.168.238.134
NETMASK=255.255.255.0
GATEWAY=192.168.238.1
DNS1=114.114.114.114
DNS2=8.8.8.8
ONBOOT=yes

# 重启网络
systemctl restart network

3. 配置 hosts 文件

bash

cat >> /etc/hosts << EOF
192.168.238.133 mysql-master
192.168.238.134 mysql-slave
EOF

4. 拉取 MySQL 镜像

bash

docker pull mysql:5.7

5. 创建数据和配置目录

bash

mkdir -p /docker/mysql/slave/data
# 设置权限
chown -R 999:999 /docker/mysql/slave
chmod -R 755 /docker/mysql/slave

6. 启动从库容器(使用 host 网络模式)

bash

# 检查端口占用
netstat -tulpn | grep 3306

# 停止并删除可能存在的旧容器
docker stop mysql-slave 2>/dev/null || true
docker rm mysql-slave 2>/dev/null || true

# 启动容器
docker run -d \
  --name mysql-slave \
  --network host \
  -v /docker/mysql/slave/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=root123 \
  --restart=always \
  mysql:5.7 \
  --server-id=100 \
  --log-bin=mysql-bin \
  --binlog_format=ROW \
  --expire_logs_days=7 \
  --relay-log=relaylog \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci \
  --bind-address=0.0.0.0

# 等待容器完全启动
sleep 30

7. 验证从库状态

bash

# 查看容器状态
docker ps | grep mysql-slave

# 查看日志
docker logs mysql-slave

# 测试MySQL连接
docker exec mysql-slave mysql -uroot -proot123 -e "SELECT 1;"

8. 测试主从服务器连接

bash

# 测试网络连通性
ping 192.168.238.133

# 测试MySQL端口连接
telnet 192.168.238.133 3306

# 测试复制用户连接
mysql -h 192.168.238.133 -uslave -pSlave@123456 -e "SELECT 1;"

9. 停止现有复制并导入主库数据

bash

# 进入MySQL停止可能运行的复制进程
docker exec -it mysql-slave mysql -uroot -proot123 -e "STOP SLAVE; RESET SLAVE ALL;"

# 导入数据
docker exec -i mysql-slave mysql -uroot -proot123 < /tmp/master_data.sql

# 清理临时文件
rm -f /tmp/master_data.sql

10. 配置主从同步

bash

# 进入从库MySQL终端
docker exec -it mysql-slave mysql -uroot -proot123

sql

-- 配置同步参数(替换为SHOW MASTER STATUS中的实际值)
CHANGE MASTER TO 
MASTER_HOST='192.168.238.133',
MASTER_USER='slave',
MASTER_PASSWORD='Slave@123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000003',  -- 主库的File值
MASTER_LOG_POS=1434;                 -- 主库的Position值

11. 启动同步并查看状态

sql

-- 启动同步
START SLAVE;

-- 查看同步状态
SHOW SLAVE STATUS\G

三、验证主从同步状态

在从服务器执行SHOW SLAVE STATUS\G,确认以下关键参数:

plaintext

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

常见问题排查

  • Slave_IO_Running: Connecting - 检查网络连接、防火墙、用户认证信息
  • Slave_SQL_Running: No - 检查错误日志,通常是 SQL 执行冲突或数据不一致
  • 连接超时 - 使用 host 网络模式并确保bind-address=0.0.0.0

快速诊断命令

bash

# 检查网络连通性
ping 192.168.238.133
telnet 192.168.238.133 3306

# 检查容器状态
docker ps
docker logs mysql-slave

# 检查复制用户权限(在主服务器)
docker exec mysql-master mysql -uroot -proot123 -e "SHOW GRANTS FOR 'slave'@'192.168.238.134';"

四、测试主从复制

主服务器操作:

sql

-- 创建测试库和表
CREATE DATABASE test_replication;
USE test_replication;
CREATE TABLE test_table (id INT, name VARCHAR(20));
INSERT INTO test_table VALUES (1, '主库测试数据');
INSERT INTO test_table VALUES (2, '第二条测试数据');

-- 验证数据
SELECT * FROM test_table;

从服务器操作:

sql

-- 验证同步结果
SHOW DATABASES;  -- 应显示test_replication
USE test_replication;
SELECT * FROM test_table;  -- 应显示主库插入的数据

五、常用监控和维护命令

SQL 命令

sql

-- 查看主库状态
SHOW MASTER STATUS;

-- 查看从库状态
SHOW SLAVE STATUS\G

-- 停止从库复制
STOP SLAVE;

-- 启动从库复制
START SLAVE;

-- 重置从库复制(谨慎使用)
RESET SLAVE ALL;

Bash 命令

bash

# 查看容器日志
docker logs mysql-master
docker logs mysql-slave

# 检查容器资源使用
docker stats mysql-master mysql-slave

六、重要注意事项

数据一致性

  • 配置主从复制前必须通过数据导出导入保证主从数据一致
  • 使用FLUSH TABLES WITH READ LOCKmysqldump --master-data确保数据一致性

网络配置

  • 使用--network host模式避免 Docker 网络问题
  • 确保主从服务器之间 3306 端口可通
  • 使用--bind-address=0.0.0.0确保 MySQL 监听所有接口

安全考虑

  • 使用强密码(如Slave@123456
  • 限制复制用户的权限范围
  • 定期更换密码

备份与监控

  • 定期备份主库二进制日志
  • 监控复制延迟和状态
  • 设置告警机制及时发现复制中断

故障处理

  • 如遇网络问题,优先使用 host 网络模式
  • 复制错误时检查错误日志和复制状态
  • 数据不一致时可重置从库并重新同步
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值