MySQL 主从复制配置完全指南:从原理到实践
引言
数据库主从复制是现代IT架构的基石,它不仅能实现读写分离、负载均衡,还能提供数据冗余和故障恢复能力。在MySQL 8.4.0环境中,GTID(全局事务标识符)复制已成为标准配置。本文将深入探讨MySQL主从复制的方方面面,并提供实战配置指南。
一、主从复制核心原理
1.1 复制架构图
二进制日志 Binary Log
Relay Log
从库组件
IO线程
中继日志
SQL线程
主库组件
Binary Log Dump线程
二进制日志文件
主库 Master
从库 Slave
SQL线程应用
客户端写入
客户端读取
1.2 复制流程详解
- 二进制日志生成:主库将数据变更写入二进制日志
- 日志传输:从库IO线程连接主库并请求日志
- 中继日志存储:从库将接收的日志写入中继日志
- 日志应用:从库SQL线程读取中继日志并执行SQL
1.3 复制模式对比
| 复制模式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 异步复制 | 性能高,不影响主库 | 数据可能丢失 | 大多数业务场景 |
| 半同步复制 | 保证至少一个从库收到数据 | 性能稍有下降 | 对数据一致性要求较高的场景 |
| 组复制 | 高可用,自动故障转移 | 配置复杂 | 金融、交易系统 |
二、环境规划与准备
2.1 系统要求
bash
# 检查操作系统版本
cat /etc/os-release
# 检查MySQL版本
mysql --version
# 输出:mysql Ver 8.0.33 for Linux on x86_64 (MySQL Community Server - GPL)
# 硬件建议配置
# 主库:4核CPU,16GB内存,SSD硬盘
# 从库:2核CPU,8GB内存,SSD硬盘
2.2 网络规划
yaml
# 网络配置示例
主库:
IP: 192.168.1.100
端口: 3306
主机名: mysql-master
从库1:
IP: 192.168.1.101
端口: 3306
主机名: mysql-slave-01
从库2:
IP: 192.168.1.102
端口: 3306
主机名: mysql-slave-02
2.3 权限规划
sql
-- 创建专用复制用户
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'ReplPass123!';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%';
GRANT SELECT, PROCESS, SHOW VIEW ON *.* TO 'repl'@'192.168.1.%';
-- 验证权限
SHOW GRANTS FOR 'repl'@'192.168.1.%';
三、GTID主从配置详解
3.1 主库配置
ini
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# 基础配置
server-id = 1
port = 3306
bind-address = 0.0.0.0
# GTID配置
gtid_mode = ON
enforce_gtid_consistency = ON
# 二进制日志配置
log_bin = /var/lib/mysql/mysql-bin
log_bin_index = /var/lib/mysql/mysql-bin.index
binlog_format = ROW
expire_logs_days = 7
max_binlog_size = 1G
# 复制优化
binlog_cache_size = 1M
sync_binlog = 1
binlog_checksum = CRC32
# InnoDB优化
innodb_flush_log_at_trx_commit = 1
innodb_support_xa = ON
# 从库连接配置
max_connections = 1000
slave_parallel_workers = 8
3.2 从库配置
ini
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# 基础配置
server-id = 2 # 每个从库必须唯一
port = 3306
bind-address = 0.0.0.0
# GTID配置
gtid_mode = ON
enforce_gtid_consistency = ON
read_only = ON # 从库只读
# 二进制日志配置(可选,用于级联复制)
log_bin = /var/lib/mysql/mysql-bin
log_slave_updates = ON # 将从库接收的更新写入二进制日志
# 中继日志配置
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index
relay_log_recovery = ON
# 复制优化
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 4
slave_preserve_commit_order = ON
slave_skip_errors = OFF
# 安全设置
super_read_only = ON # 即使超级用户也只能读
3.3 配置验证脚本
bash
#!/bin/bash
# verify_config.sh
# 检查配置文件
echo "检查主库配置..."
mysql -h 192.168.1.100 -u root -p -e "
SHOW GLOBAL VARIABLES WHERE Variable_name IN (
'server_id', 'gtid_mode', 'enforce_gtid_consistency',
'log_bin', 'binlog_format', 'binlog_checksum'
);"
echo "检查从库配置..."
mysql -h 192.168.1.101 -u root -p -e "
SHOW GLOBAL VARIABLES WHERE Variable_name IN (
'server_id', 'gtid_mode', 'read_only',
'relay_log', 'log_slave_updates'
);"
四、备份恢复与复制初始化
4.1 全量备份策略
bash
#!/bin/bash
# master_backup.sh
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
# 锁定表,开始备份
mysql -h 192.168.1.100 -u root -p -e "FLUSH TABLES WITH READ LOCK;"
mysql -h 192.168.1.100 -u root -p -e "SHOW MASTER STATUS;" > $BACKUP_DIR/master_status_$DATE.txt
# 使用mysqldump创建逻辑备份
mysqldump -h 192.168.1.100 -u root -p \
--all-databases \
--single-transaction \
--flush-logs \
--master-data=2 \
--set-gtid-purged=ON \
--triggers \
--routines \
--events > $BACKUP_DIR/full_backup_$DATE.sql
# 解锁表
mysql -h 192.168.1.100 -u root -p -e "UNLOCK TABLES;"
# 压缩备份文件
gzip $BACKUP_DIR/full_backup_$DATE.sql
# 保留最近7天备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
4.2 从库数据恢复
bash
#!/bin/bash
# slave_restore.sh
BACKUP_FILE="/backup/mysql/full_backup_20230820.sql.gz"
# 停止从库复制
mysql -h 192.168.1.101 -u root -p -e "STOP REPLICA;"
# 清空从库数据(谨慎操作!)
mysql -h 192.168.1.101 -u root -p -e "RESET REPLICA ALL;"
mysql -h 192.168.1.101 -u root -p -e "RESET BINARY LOGS AND GTIDS;"
# 恢复备份
gunzip -c $BACKUP_FILE | mysql -h 192.168.1.101 -u root -p
# 获取主库GTID状态
MASTER_GTID=$(mysql -h 192.168.1.100 -u root -p -Nse "SELECT @@GLOBAL.GTID_EXECUTED")
# 设置从库GTID
mysql -h 192.168.1.101 -u root -p <<EOF
STOP REPLICA;
SET GLOBAL gtid_purged = '$MASTER_GTID';
EOF
4.3 物理备份方案(XtraBackup)
bash
# 安装Percona XtraBackup(兼容MySQL 8.4)
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
sudo apt update
sudo apt install percona-xtrabackup-80
# 主库物理备份
xtrabackup --backup \
--host=192.168.1.100 \
--user=backup \
--password=BackupPass123 \
--target-dir=/backup/xtrabackup/
# 准备恢复
xtrabackup --prepare --target-dir=/backup/xtrabackup/
# 传输备份到从库
rsync -avz /backup/xtrabackup/ 192.168.1.101:/backup/xtrabackup/
# 从库恢复
systemctl stop mysql
rm -rf /var/lib/mysql/*
xtrabackup --copy-back --target-dir=/backup/xtrabackup/
chown -R mysql:mysql /var/lib/mysql
systemctl start mysql
五、复制配置与管理
5.1 配置复制通道
sql
-- 从库执行
CHANGE REPLICATION SOURCE TO
SOURCE_HOST = '192.168.1.100',
SOURCE_PORT = 3306,
SOURCE_USER = 'repl',
SOURCE_PASSWORD = 'ReplPass123',
SOURCE_AUTO_POSITION = 1, -- GTID自动定位
SOURCE_SSL = 1, -- 启用SSL加密
SOURCE_SSL_CA = '/etc/mysql/ssl/ca.pem',
SOURCE_SSL_CERT = '/etc/mysql/ssl/client-cert.pem',
SOURCE_SSL_KEY = '/etc/mysql/ssl/client-key.pem',
SOURCE_CONNECTION_AUTO_FAILOVER = 1, -- 自动故障转移
SOURCE_RETRY_COUNT = 3,
SOURCE_CONNECT_RETRY = 60;
-- 启动复制
START REPLICA;
-- 查看复制状态
SHOW REPLICA STATUS\G
5.2 多线程复制配置
sql
-- 查看当前并行复制配置
SHOW VARIABLES LIKE 'slave_parallel%';
-- 配置并行复制
STOP REPLICA;
SET GLOBAL slave_parallel_workers = 8;
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';
SET GLOBAL slave_preserve_commit_order = ON;
START REPLICA;
-- 验证并行复制效果
SELECT * FROM performance_schema.replication_applier_status_by_worker;
5.3 过滤规则配置
sql
-- 配置复制过滤(谨慎使用!)
CHANGE REPLICATION FILTER
REPLICATE_DO_DB = (prod_db, report_db),
REPLICATE_IGNORE_DB = (temp_db, test_db),
REPLICATE_DO_TABLE = (prod_db.important_table),
REPLICATE_IGNORE_TABLE = (prod_db.log_table),
REPLICATE_WILD_DO_TABLE = ('backup%.%'),
REPLICATE_WILD_IGNORE_TABLE = ('%.temp_%');
-- 查看过滤规则
SHOW REPLICA STATUS\G | grep -i filter
六、复制监控与维护
6.1 状态监控脚本
bash
#!/bin/bash
# replication_monitor.sh
MASTER="192.168.1.100"
SLAVES=("192.168.1.101" "192.168.1.102")
check_replication() {
local host=$1
local role=$2
echo "检查 $role ($host)..."
STATUS=$(mysql -h $host -u root -p -e "SHOW REPLICA STATUS\G" 2>/dev/null)
if [ $? -eq 0 ]; then
IO_RUNNING=$(echo "$STATUS" | grep "Replica_IO_Running:" | awk '{print $2}')
SQL_RUNNING=$(echo "$STATUS" | grep "Replica_SQL_Running:" | awk '{print $2}')
SECONDS_BEHIND=$(echo "$STATUS" | grep "Seconds_Behind_Source:" | awk '{print $2}')
echo " IO线程状态: $IO_RUNNING"
echo " SQL线程状态: $SQL_RUNNING"
echo " 复制延迟: $SECONDS_BEHIND 秒"
if [ "$IO_RUNNING" = "Yes" ] && [ "$SQL_RUNNING" = "Yes" ]; then
echo " ✅ 状态正常"
else
echo " ❌ 状态异常"
echo "$STATUS" | grep -E "Last_IO_Error|Last_SQL_Error"
fi
else
echo " ❌ 无法连接"
fi
echo ""
}
# 检查主库
check_replication $MASTER "主库"
# 检查从库
for SLAVE in "${SLAVES[@]}"; do
check_replication $SLAVE "从库"
done
6.2 性能监控仪表板
sql
-- 创建监控数据库
CREATE DATABASE replication_monitor;
-- 创建状态记录表
USE replication_monitor;
CREATE TABLE replica_status_history (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
host VARCHAR(50) NOT NULL,
check_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
io_running ENUM('Yes', 'No', 'Connecting'),
sql_running ENUM('Yes', 'No', 'Connecting'),
seconds_behind INT,
gtid_executed TEXT,
last_io_error TEXT,
last_sql_error TEXT,
INDEX idx_check_time (check_time),
INDEX idx_host_time (host, check_time)
);
-- 创建延迟趋势表
CREATE TABLE replication_delay_trend (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
host VARCHAR(50) NOT NULL,
period_start TIMESTAMP,
period_end TIMESTAMP,
avg_delay DECIMAL(10,2),
max_delay INT,
delay_samples INT,
INDEX idx_period (period_start, period_end)
);
-- 创建告警记录表
CREATE TABLE replication_alerts (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
alert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
host VARCHAR(50),
alert_type VARCHAR(50),
alert_message TEXT,
resolved BOOLEAN DEFAULT FALSE,
resolved_time TIMESTAMP NULL,
INDEX idx_alert_time (alert_time),
INDEX idx_resolved (resolved)
);
6.3 自动化维护任务
sql
-- 定期清理旧的中继日志
DELIMITER $$
CREATE EVENT purge_old_relay_logs
ON SCHEDULE EVERY 1 HOUR
DO
BEGIN
-- 获取中继日志列表
SELECT RELAY_LOG_FILE INTO @current_relay_log
FROM performance_schema.replication_connection_status;
-- 清理旧的中继日志
PURGE RELAY LOGS BEFORE NOW() - INTERVAL 2 DAY;
END$$
DELIMITER ;
-- 定期优化表
DELIMITER $$
CREATE EVENT optimize_replication_tables
ON SCHEDULE EVERY 1 DAY
STARTS '2023-08-21 02:00:00'
DO
BEGIN
-- 优化监控表
OPTIMIZE TABLE replication_monitor.replica_status_history;
OPTIMIZE TABLE replication_monitor.replication_delay_trend;
OPTIMIZE TABLE replication_monitor.replication_alerts;
END$$
DELIMITER ;
七、故障处理与恢复
7.1 常见故障处理方案
故障1:复制中断(GTID冲突)
sql
-- 症状:Last_IO_Error: Got fatal error 1236 from source
-- 原因:主库清除了从库需要的二进制日志
-- 解决方案:
-- 1. 重建从库(推荐)
STOP REPLICA;
RESET REPLICA ALL;
RESET BINARY LOGS AND GTIDS;
-- 重新从备份恢复
-- 2. 跳过错误事务(仅用于测试)
STOP REPLICA;
SET GTID_NEXT='缺失的GTID';
BEGIN; COMMIT;
SET GTID_NEXT='AUTOMATIC';
START REPLICA;
故障2:主从不一致
bash
# 使用pt-table-checksum检查数据一致性
pt-table-checksum \
--host=192.168.1.100 \
--user=root \
--password=RootPass123 \
--databases=prod_db \
--no-check-binlog-format \
--replicate=percona.checksums
# 使用pt-table-sync修复不一致
pt-table-sync \
--execute \
--sync-to-master \
h=192.168.1.101,u=root,p=RootPass123 \
--databases=prod_db
故障3:主库宕机切换
bash
#!/bin/bash
# failover.sh
# 检查主库状态
if ! mysqladmin -h 192.168.1.100 -u root -p ping > /dev/null 2>&1; then
echo "主库宕机,开始故障切换..."
# 选择延迟最小的从库作为新主库
NEW_MASTER=$(find_best_slave)
# 在新主库执行
mysql -h $NEW_MASTER -u root -p <<EOF
STOP REPLICA;
RESET REPLICA ALL;
SET GLOBAL read_only = OFF;
SET GLOBAL super_read_only = OFF;
-- 重置二进制日志
FLUSH LOGS;
RESET BINARY LOGS AND GTIDS;
EOF
# 配置其他从库指向新主库
for SLAVE in "${OTHER_SLAVES[@]}"; do
mysql -h $SLAVE -u root -p <<EOF
STOP REPLICA;
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='$NEW_MASTER',
SOURCE_AUTO_POSITION=1;
START REPLICA;
EOF
done
echo "故障切换完成,新主库: $NEW_MASTER"
fi
7.2 数据一致性验证
sql
-- 使用MySQL内置功能验证
SELECT
table_schema,
table_name,
CRC32(CONCAT_WS('#', *)) AS checksum
FROM information_schema.tables
WHERE table_schema = 'prod_db'
INTO OUTFILE '/tmp/master_checksums.csv'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
-- 在从库执行相同查询并比较结果
八、高级复制架构
8.1 级联复制架构
复制
复制
复制
复制
主库 Master
一级从库 Relay Slave
二级从库 Slave 1
二级从库 Slave 2
二级从库 Slave 3
8.2 多主复制配置
ini
# 多主配置示例
# 节点1配置
server-id = 1
auto_increment_increment = 2
auto_increment_offset = 1
log_slave_updates = ON
gtid_mode = ON
# 节点2配置
server-id = 2
auto_increment_increment = 2
auto_increment_offset = 2
log_slave_updates = ON
gtid_mode = ON
8.3 基于ProxySQL的读写分离
sql
-- ProxySQL配置示例
-- 配置后端服务器
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES
(10, '192.168.1.100', 3306), -- 主库写入组
(20, '192.168.1.101', 3306), -- 从库读取组
(20, '192.168.1.102', 3306); -- 从库读取组
-- 配置查询路由规则
INSERT INTO mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup, apply) VALUES
(1, 1, '^SELECT.*FOR UPDATE', 10, 1), -- 锁定读发往主库
(2, 1, '^SELECT', 20, 1), -- 普通查询发往从库
(3, 1, '^INSERT', 10, 1), -- 写操作发往主库
(4, 1, '^UPDATE', 10, 1),
(5, 1, '^DELETE', 10, 1);
-- 配置监控用户
INSERT INTO mysql_users(username, password, default_hostgroup) VALUES
('app_user', 'AppPass123', 10);
九、安全最佳实践
9.1 SSL加密配置
bash
# 生成SSL证书
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
# 配置MySQL使用SSL
[mysqld]
ssl_ca = /etc/mysql/ssl/ca-cert.pem
ssl_cert = /etc/mysql/ssl/server-cert.pem
ssl_key = /etc/mysql/ssl/server-key.pem
require_secure_transport = ON
# 验证SSL连接
mysql --ssl-mode=REQUIRED -h 192.168.1.100 -u repl -p
9.2 访问控制
sql
-- 限制复制用户访问
REVOKE ALL PRIVILEGES ON *.* FROM 'repl'@'%';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%';
-- 限制应用用户
CREATE USER 'app_user'@'app-server.%' IDENTIFIED BY 'AppPass123';
GRANT SELECT, INSERT, UPDATE, DELETE ON prod_db.* TO 'app_user'@'app-server.%';
-- 启用审计日志
INSTALL COMPONENT "file://component_audit_api";
SET GLOBAL audit_log_format = JSON;
SET GLOBAL audit_log_policy = ALL;
9.3 备份安全
bash
# 加密备份文件
openssl enc -aes-256-cbc -salt -in backup.sql -out backup.sql.enc -k password
# 自动备份脚本(带加密)
#!/bin/bash
mysqldump --all-databases | \
openssl enc -aes-256-cbc -salt -k "$ENCRYPTION_KEY" | \
gzip > /backup/mysql_$(date +%Y%m%d).sql.gz.enc
十、性能调优
10.1 复制延迟优化
sql
-- 优化并行复制
STOP REPLICA;
SET GLOBAL slave_parallel_workers = 8;
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';
SET GLOBAL slave_preserve_commit_order = ON;
START REPLICA;
-- 优化网络参数
SET GLOBAL slave_compressed_protocol = ON;
SET GLOBAL slave_net_timeout = 60;
-- 监控延迟原因
SELECT
THREAD_ID,
EVENT_NAME,
COUNT_STAR,
SUM_TIMER_WAIT/1000000000 AS total_seconds,
AVG_TIMER_WAIT/1000000000 AS avg_seconds
FROM performance_schema.events_waits_summary_by_thread_by_event_name
WHERE THREAD_ID IN (
SELECT THREAD_ID
FROM performance_schema.threads
WHERE NAME LIKE '%slave%'
)
ORDER BY total_seconds DESC;
10.2 监控指标优化
sql
-- 关键性能指标查询
SELECT
-- 复制状态
(SELECT COUNT(*) FROM performance_schema.replication_connection_status) AS connections,
(SELECT COUNT(*) FROM performance_schema.replication_applier_status) AS appliers,
-- 延迟统计
(SELECT AVG(SECONDS_BEHIND_SOURCE) FROM performance_schema.replication_applier_status) AS avg_delay,
(SELECT MAX(SECONDS_BEHIND_SOURCE) FROM performance_schema.replication_applier_status) AS max_delay,
-- 吞吐量
(SELECT COUNT_APPLIED FROM performance_schema.replication_applier_status) AS applied_count,
(SELECT COUNT_RECEIVED FROM performance_schema.replication_applier_status) AS received_count,
-- 错误统计
(SELECT COUNT(*) FROM performance_schema.replication_applier_status WHERE LAST_ERROR_NUMBER != 0) AS error_count
FROM DUAL;
十一、自动化部署脚本
11.1 Ansible自动化配置
yaml
# mysql_replication.yml
---
- name: 配置MySQL主从复制
hosts: mysql_servers
vars:
mysql_version: "8.4"
master_host: "192.168.1.100"
slave_hosts: ["192.168.1.101", "192.168.1.102"]
tasks:
- name: 安装MySQL
apt:
name: "mysql-server-{{ mysql_version }}"
state: present
- name: 配置my.cnf
template:
src: my.cnf.j2
dest: /etc/mysql/mysql.conf.d/mysqld.cnf
- name: 重启MySQL服务
service:
name: mysql
state: restarted
- name: 配置主库复制用户
when: inventory_hostname == master_host
mysql_user:
name: repl
host: "192.168.1.%"
password: "ReplPass123"
priv: "*.*:REPLICATION SLAVE,REPLICATION CLIENT"
state: present
- name: 配置从库复制
when: inventory_hostname in slave_hosts
shell: |
mysql -e "CHANGE REPLICATION SOURCE TO
SOURCE_HOST='{{ master_host }}',
SOURCE_USER='repl',
SOURCE_PASSWORD='ReplPass123',
SOURCE_AUTO_POSITION=1;"
mysql -e "START REPLICA;"
11.2 Docker容器化部署
yaml
# docker-compose.yml
version: '3.8'
services:
mysql-master:
image: mysql:8.4
container_name: mysql-master
environment:
MYSQL_ROOT_PASSWORD: RootPass123
MYSQL_REPLICATION_USER: repl
MYSQL_REPLICATION_PASSWORD: ReplPass123
ports:
- "3306:3306"
volumes:
- ./master.cnf:/etc/mysql/conf.d/mysql.cnf
- master-data:/var/lib/mysql
networks:
- mysql-network
mysql-slave:
image: mysql:8.4
container_name: mysql-slave
environment:
MYSQL_ROOT_PASSWORD: RootPass123
MYSQL_REPLICATION_USER: repl
MYSQL_REPLICATION_PASSWORD: ReplPass123
depends_on:
- mysql-master
volumes:
- ./slave.cnf:/etc/mysql/conf.d/mysql.cnf
- slave-data:/var/lib/mysql
networks:
- mysql-network
networks:
mysql-network:
driver: bridge
volumes:
master-data:
slave-data:
十二、最佳实践总结
12.1 配置检查清单
✅ 基础配置
- 每个节点server-id唯一
- 启用GTID模式
- 配置正确的时区
- 设置适当的字符集
✅ 安全配置
- 使用SSL加密复制流量
- 限制复制用户权限
- 定期更换密码
- 启用防火墙规则
✅ 性能配置
- 配置并行复制
- 设置合理的缓冲池大小
- 启用二进制日志压缩
- 优化网络参数
✅ 监控配置
- 配置慢查询日志
- 启用性能模式
- 设置复制延迟监控
- 配置告警系统
12.2 维护计划
每日维护:
- 检查复制状态
- 监控延迟情况
- 检查错误日志
- 备份验证
每周维护:
- 一致性检查
- 性能分析
- 日志清理
- 参数调优
每月维护:
- 安全审计
- 备份恢复测试
- 版本升级评估
- 容量规划
12.3 故障恢复演练
定期进行以下演练:
- 主库故障切换
- 从库重建恢复
- 数据一致性修复
- 网络分区处理
结论
MySQL主从复制是构建高可用数据库架构的基础。通过本文的全面指南,您可以:
- 理解复制原理:掌握GTID复制的内部工作机制
- 完成配置部署:按照步骤配置稳定可靠的主从环境
- 实施监控维护:建立完善的监控和维护体系
- 处理故障恢复:具备应对各种故障场景的能力
- 优化性能安全:确保复制系统的高性能和安全性
记住,复制配置不是一次性的工作,而是需要持续监控、优化和维护的过程。只有通过系统的管理和定期的演练,才能确保数据库系统在关键时刻能够稳定运行。
专业提示:在生产环境部署前,务必在测试环境进行充分验证,并建立完善的备份和恢复流程。
适用版本 :MySQL 8.4.0
相关工具:Percona Toolkit, ProxySQL, Ansible, Docker