在CentOS或Ubuntu服务器上部署MySQL主从复制的实操指南?

MySQL主从复制部署实操指南

一、环境准备

1.1 系统要求

  • CentOS 7/8Ubuntu 18.04/20.04/22.04
  • MySQL 5.7 或 8.0 版本
  • 至少两台服务器(主库和从库)
  • 网络互通,防火墙开放3306端口

1.2 服务器规划示例

角色 IP地址 主机名
主库 192.168.1.10 mysql-master
从库 192.168.1.11 mysql-slave

二、MySQL安装(CentOS)

2.1 安装MySQL 8.0

# 添加MySQL YUM仓库
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm

# 安装MySQL
sudo yum install -y mysql-community-server

# 启动服务
sudo systemctl start mysqld
sudo systemctl enable mysqld

2.2 获取初始密码

sudo grep 'temporary password' /var/log/mysqld.log

三、MySQL安装(Ubuntu)

3.1 安装MySQL 8.0

# 更新包列表
sudo apt update

# 安装MySQL
sudo apt install -y mysql-server

# 启动服务
sudo systemctl start mysql
sudo systemctl enable mysql

3.2 安全配置

sudo mysql_secure_installation

四、主库配置

4.1 修改主库配置文件

# CentOS
sudo vi /etc/my.cnf

# Ubuntu
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

添加以下配置:

[mysqld]
# 服务器ID,主库必须唯一
server-id = 1

# 启用二进制日志
log-bin = mysql-bin

# 需要复制的数据库(可选)
# binlog-do-db = mydb

# 不需要复制的数据库(可选)
# binlog-ignore-db = mysql
# binlog-ignore-db = information_schema
# binlog-ignore-db = performance_schema

# 二进制日志格式(推荐ROW)
binlog_format = ROW

# 自动清理过期日志(可选)
expire_logs_days = 7
max_binlog_size = 100M

4.2 重启MySQL服务

# CentOS
sudo systemctl restart mysqld

# Ubuntu
sudo systemctl restart mysql

4.3 创建复制用户

-- 登录MySQL
mysql -u root -p

-- 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'Repl@123456';

-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

-- 刷新权限
FLUSH PRIVILEGES;

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

记录输出中的 FilePosition 值:

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

五、从库配置

5.1 修改从库配置文件

# CentOS
sudo vi /etc/my.cnf

# Ubuntu
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

添加以下配置:

[mysqld]
# 服务器ID,从库必须唯一且不同于主库
server-id = 2

# 启用中继日志
relay-log = mysql-relay-bin

# 可选:设置只读(确保从库不会写入)
read_only = 1

# 可选:记录从库的二进制日志(用于级联复制)
# log-bin = mysql-bin
# log-slave-updates = 1

5.2 重启MySQL服务

# CentOS
sudo systemctl restart mysqld

# Ubuntu
sudo systemctl restart mysql

5.3 配置复制链路

-- 登录MySQL
mysql -u root -p

-- 停止从库复制
STOP SLAVE;

-- 配置主库信息(使用主库的IP和前面记录的File、Position)
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;

-- 启动从库复制
START SLAVE;

-- 查看从库状态
SHOW SLAVE STATUSG

六、验证复制状态

6.1 检查从库状态

SHOW SLAVE STATUSG

关键指标检查:

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes
  • Seconds_Behind_Master: 0(或很小的数字)
  • Last_IO_Error: 空
  • Last_SQL_Error: 空

6.2 测试数据同步

在主库创建测试数据:

-- 在主库执行
CREATE DATABASE test_replication;
USE test_replication;
CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO test_table VALUES (1, 'test_data');

在从库验证:

-- 在从库执行
SELECT * FROM test_replication.test_table;

七、常用维护命令

7.1 主库操作

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

-- 查看所有二进制日志
SHOW BINARY LOGS;

-- 刷新日志
FLUSH LOGS;

-- 清理过期日志
PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';

7.2 从库操作

-- 停止复制
STOP SLAVE;

-- 启动复制
START SLAVE;

-- 重置复制
RESET SLAVE ALL;

-- 跳过错误(谨慎使用)
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;

-- 查看复制进程
SHOW PROCESSLIST;

八、故障排查

8.1 常见问题及解决

问题1:Slave_IO_Running = Connecting

# 检查网络连通性
ping 192.168.1.10

# 检查防火墙
sudo firewall-cmd --list-all  # CentOS
sudo ufw status              # Ubuntu

# 检查MySQL用户权限

问题2:Slave_SQL_Running = No

-- 查看具体错误
SHOW SLAVE STATUSG

-- 常见解决方法
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;

问题3:数据不一致

# 使用工具检查
sudo apt install percona-toolkit  # Ubuntu
sudo yum install percona-toolkit  # CentOS

# 检查数据一致性
pt-table-checksum h=192.168.1.10,u=root,p=password

九、安全建议

  1. 网络隔离:主从服务器应在同一安全网络
  2. 强密码策略:复制用户使用复杂密码
  3. 权限最小化:只授予必要的复制权限
  4. SSL加密:考虑启用SSL加密复制流量
  5. 定期监控:设置监控告警
  6. 备份策略:定期备份二进制日志

十、自动化脚本示例

10.1 一键部署脚本(主库)

#!/bin/bash
# master_setup.sh

MASTER_IP="192.168.1.10"
SLAVE_IP="192.168.1.11"
REPL_USER="repl"
REPL_PASSWORD="Repl@123456"

# 配置主库
cat >> /etc/my.cnf << EOF
[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=ROW
expire_logs_days=7
EOF

systemctl restart mysqld

# 创建复制用户
mysql -u root -p << EOF
CREATE USER '${REPL_USER}'@'${SLAVE_IP}' IDENTIFIED BY '${REPL_PASSWORD}';
GRANT REPLICATION SLAVE ON *.* TO '${REPL_USER}'@'${SLAVE_IP}';
FLUSH PRIVILEGES;
EOF

echo "主库配置完成!"

注意事项

  1. 版本兼容性:主从MySQL版本尽量保持一致
  2. 数据一致性:部署前确保主库已有数据通过备份恢复到从库
  3. 时间同步:确保主从服务器时间同步
  4. 监控告警:建议部署监控系统(如Prometheus+Granafa)
  5. 定期维护:定期检查复制状态和日志文件

这个指南涵盖了MySQL主从复制部署的主要步骤。实际部署时,请根据具体环境调整配置参数。

云服务器