MySQL / MariaDB 主从复制架构实战指南
- MySQL
- 11天前
- 13热度
- 0评论
MySQL 和 MariaDB 主从复制及双主架构配置指南
本文档详细介绍了如何在MySQL和MariaDB中实现主从同步以及构建双主(Master-Master)高可用架构。通过这些步骤,可以确保数据库系统的可靠性和可维护性。
一、环境准备与集群规划
- 节点信息:
- Master (192.168.1.25, 主要进行写操作)
- Slave (192.168.1.28, 进行读和同步操作)
- VIP (192.168.1.100, 用于实现自动故障转移)
二、MySQL 和 MariaDB 配置
1. Master 节点配置
编辑MariaDB服务的配置文件,启用二进制日志并设置唯一的server-id:
# nano /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id = 25 # 使用IP尾数或递增数字以确保唯一性
log_bin = mysql-bin
binlog_ignore_db = mysql # 忽略mysql系统库的同步,减少日志量2. 创建复制用户
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'rhel-efserver-bak' IDENTIFIED BY 'Ins@1234';3. 记录Master状态
在完成配置后,需要记录下当前的File和Position值:
SHOW MASTER STATUS;4. Slave 节点配置
同样地,在Slave节点中编辑MariaDB配置文件设置唯一的server-id并启用二进制日志:
[mysqld]
server-id = 28 # Slave的唯一ID,建议使用IP尾数或递增数字以确保唯一性
log_bin = mysql-bin
binlog_ignore_db = mysql # 忽略mysql系统库的同步,减少日志量5. 配置并启动复制
指定Master节点的连接信息,并执行以下SQL命令来启动同步进程:
CHANGE MASTER TO
MASTER_HOST='rhel-efserver',
MASTER_USER='repl',
MASTER_PASSWORD='Ins@1234',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=655;
START SLAVE;6. 验证复制状态
SHOW SLAVE STATUS\G;重点关注Slave_IO_Running和Slave_SQL_Running是否为Yes,此外还要确保Seconds_Behind_Master的值为0。
三、MySQL 主从同步配置
对于MySQL版本(8.x及以上),主从复制步骤与MariaDB相似,但需注意用户认证机制的变化。具体操作如下:
1. 全量数据导出
mysqldump -uroot -p --single-transaction --all-databases > /var/lib/mysql/efab.sql2. 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'Ins@1234';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;在生产环境中,建议使用mysql_native_password认证插件以兼容旧客户端。
3. 数据导入
将全量备份文件从主库复制到从库并执行导入操作:
# 在从库上执行
mysql -uroot < /var/lib/mysql/efab.sql四、双主(Master-Master)架构配置
实现真正的高可用性,可以构建互为主从的双主架构。以下为具体步骤:
1. 架构示意
简化的网络图如下所示:
VIP (192.168.1.100)
│
┌──────────┴──────────┐
▼ ▼
Master A Master B
│ .25 │ .28
└─────┬─────┘ └─────┬─────┘
│ │
read_only=0 read_only=1
2. Master A 和 Master B 配置
在两个节点上分别配置互为主从的设置,确保每个节点都可以处理读写操作。
[mysqld]
server-id = 25 # 唯一ID, 可以是IP尾数或递增数字
log-bin = mysql-bin
# 其他核心复制参数配置通过以上步骤,可以构建一个具备自动故障转移能力的高可用数据库集群。
三、配置节点间的互为主从关系
在两台MySQL服务器上分别创建复制用户,并指定对方为Master启动复制。
创建复制用户
首先,在主库(例如192.168.1.25)上执行以下SQL语句来创建一个用于复制的用户。
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';接下来,备库(例如192.168.1.28)上也执行同样的SQL语句来创建复制用户。确保密码在两个节点中保持一致且安全。
指定对方为Master并启动复制
在主节点和备节点之间互相指定对方作为自己的Master,然后启动MySQL复制服务。
-- 在 192.168.1.28 上执行:指定 1.25 为 Master 并开始复制
CHANGE MASTER TO
MASTER_HOST='192.168.1.25',
MASTER_USER='repl',
MASTER_PASSWORD='password';
START SLAVE;
-- 在 192.168.1.25 上执行:指定 1.28 为 Master 并开始复制
CHANGE MASTER TO
MASTER_HOST='192.168.1.28',
MASTER_USER='repl',
MASTER_PASSWORD='password';
START SLAVE;完成上述步骤后,两个节点之间就建立了互为主从的关系。
四、Keepalived 自动故障转移
为了确保高可用性,双主架构需要配合Keepalived来实现自动的VIP漂移。Keepalived可以监控MySQL的状态,并在检测到Master节点故障时快速切换到备用节点。
故障切换脚本
首先编写一个脚本来处理当节点变为Master状态时的操作。
#!/bin/bash
MYSQL_USER="root"
MYSQL_PASS="password"
MAX_DELAY=5
# 检查MySQL服务是否存活并等待数据同步完成(针对双主架构恢复后的数据补齐)
RETRY=0
while [ $RETRY -lt 10 ]; do
DELAY=$($MYSQL_CONN"SHOW SLAVE STATUS\G" | grep "Seconds_Behind_Master" | awk '{print $2}')
if [[ "$DELAY" == "NULL" ]] || [[ -z "$DELAY" ]]; then
echo"$(date) [WARN]: Slave 状态异常或未连接,请检查主从复制状态。"
break
elif [ "$DELAY" -le $MAX_DELAY ]; then
$MYSQL_CONN"SET GLOBAL read_only = 0; SET GLOBAL super_read_only = 0;"
echo"$(date) [INFO]: 数据同步完成 (延迟: ${DELAY}s),准备开启读写模式。"
break
else
sleep 2
let RETRY++
fi
done当节点降为Backup状态时,需要执行另一个脚本来确保只读权限。
#!/bin/bash
MYSQL_USER="root"
MYSQL_PASS="password"
# 开启只读模式并关闭写操作
$MYSQL_CONN"SET GLOBAL read_only = 1;"
echo"$(date) [INFO]: 已切换为只读模式。"Keepalived配置
在主节点和备节点上分别编辑Keepalived配置文件,以确保自动故障转移可以在检测到MySQL服务异常时正常运行。
vrrp_instance VI_1 {
state MASTER # 主节点初始状态
interface eth2 # 请确认网卡名称正确(如 ens33, eth0 等)
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass password
}
virtual_ipaddress {
192.168.1.100 # 虚拟IP (VIP)
}
track_script {
check_mysql
}
notify_master "/path/to/switch_to_master.sh"
notify_backup "/path/to/switch_to_slave.sh"
}五、用户管理与认证
在生产环境中,MySQL 8.x 默认使用 caching_sha2_password 认证方式。如果应用驱动不兼容,需要手动切换到 mysql_native_password。
ALTER USER 'username'@'hostname' IDENTIFIED WITH mysql_native_password BY 'password';
CREATE USER 'new_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT ALL PRIVILEGES ON database.* TO 'user'@'%';通过上述命令可以确保新用户使用的是 mysql_native_password 插件,同时也能检查和验证用户的认证方式。
六、总结
本文介绍了从MySQL/MariaDB复制架构的基础配置到生产级高可用部署的全过程。每个方案都有各自的适用场景及优缺点:
| 方案 | 适用场景 | 优势 | 不足 |
|---|---|---|---|
| MariaDB 主从 | 读写分离、报表查询 | 配置简单,上手快 | 手动故障切换 |
| MySQL 主从 | 数据备份、读扩展 | 支持GTID | 手动故障切换 |
| 双主 + Keepalived | 生产级高可用 | 自动故障转移,零停机 | 架构复杂度较高 |
在生产部署中,请务必考虑网络架构和监控策略。此外,建议每季度进行一次手动故障切换演练以验证预案的有效性,并定期使用Percona Toolkit等工具检查主备数据一致性。
总之,在选择高可用方案时要考虑业务的实际需求,而不是盲目追求复杂的配置。