MySQL 主从复制配置完全指南:从原理到实践

MySQL 主从复制配置完全指南:从原理到实践

引言

数据库主从复制是现代IT架构的基石,它不仅能实现读写分离、负载均衡,还能提供数据冗余和故障恢复能力。在MySQL 8.4.0环境中,GTID(全局事务标识符)复制已成为标准配置。本文将深入探讨MySQL主从复制的方方面面,并提供实战配置指南。

一、主从复制核心原理

1.1 复制架构图

二进制日志 Binary Log
Relay Log
从库组件
IO线程
中继日志
SQL线程
主库组件
Binary Log Dump线程
二进制日志文件
主库 Master
从库 Slave
SQL线程应用
客户端写入
客户端读取

1.2 复制流程详解

  1. 二进制日志生成:主库将数据变更写入二进制日志
  2. 日志传输:从库IO线程连接主库并请求日志
  3. 中继日志存储:从库将接收的日志写入中继日志
  4. 日志应用:从库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 故障恢复演练

定期进行以下演练:

  1. 主库故障切换
  2. 从库重建恢复
  3. 数据一致性修复
  4. 网络分区处理

结论

MySQL主从复制是构建高可用数据库架构的基础。通过本文的全面指南,您可以:

  1. 理解复制原理:掌握GTID复制的内部工作机制
  2. 完成配置部署:按照步骤配置稳定可靠的主从环境
  3. 实施监控维护:建立完善的监控和维护体系
  4. 处理故障恢复:具备应对各种故障场景的能力
  5. 优化性能安全:确保复制系统的高性能和安全性

记住,复制配置不是一次性的工作,而是需要持续监控、优化和维护的过程。只有通过系统的管理和定期的演练,才能确保数据库系统在关键时刻能够稳定运行。

专业提示:在生产环境部署前,务必在测试环境进行充分验证,并建立完善的备份和恢复流程。


适用版本 :MySQL 8.4.0
相关工具:Percona Toolkit, ProxySQL, Ansible, Docker

相关推荐
李广坤17 小时前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12022 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
爱可生开源社区2 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐3 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再3 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
WeiXin_DZbishe3 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
tryCbest3 天前
数据库SQL学习
数据库·sql