Skip to content

MariaDB 复制环境部署与配置

复制概述

MariaDB 复制是实现高可用性、负载均衡和数据备份的基础机制。它通过将主库(Master)的二进制日志(Binary Log)传输到从库(Slave),并在从库上重放,实现数据的同步。

复制的主要类型包括:

  • 异步复制(Asynchronous Replication)
  • 半同步复制(Semi-Synchronous Replication)
  • GTID复制(Global Transaction ID Replication)
  • 多源复制(Multi-Source Replication)

异步复制部署与配置

异步复制是 MariaDB 默认的复制模式,主库在写入二进制日志后不需要等待从库确认,继续处理下一个事务。

部署准备

  1. 环境准备

    • 主库:MariaDB 10.5+,IP:192.168.1.100
    • 从库:MariaDB 10.5+,IP:192.168.1.101
    • 确保主从库版本兼容(建议使用相同主版本)
    • 网络连通性良好
  2. 配置主库

    ini
    # 启用二进制日志
    log_bin = /var/log/mysql/mariadb-bin
    binlog_format = ROW
    server_id = 100
    
    # 设置二进制日志过期时间(7天)
    expire_logs_days = 7
    
    # 允许从库连接
    bind-address = 0.0.0.0
  3. 配置从库

    ini
    # 启用中继日志
    relay_log = /var/log/mysql/relay-bin
    server_id = 101
    read_only = ON
    
    # 允许从库连接
    bind-address = 0.0.0.0
  4. 重启主从库

    bash
    # 主库
    systemctl restart mariadb
    
    # 从库
    systemctl restart mariadb

部署步骤

  1. 在主库上创建复制用户

    sql
    CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY 'repl_password';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101';
    FLUSH PRIVILEGES;
  2. 备份主库数据

    bash
    # 使用 mariabackup 备份主库
    mariabackup --backup --target-dir=/backup/initial --user=root --password=root_password
    
    # 准备备份文件
    mariabackup --prepare --target-dir=/backup/initial
    
    # 将备份文件复制到从库
    rsync -avP /backup/initial/ 192.168.1.101:/backup/initial/
  3. 恢复从库数据

    bash
    # 停止从库服务
    systemctl stop mariadb
    
    # 清空数据目录
    rm -rf /var/lib/mysql/*
    
    # 恢复备份
    mariabackup --copy-back --target-dir=/backup/initial
    
    # 设置权限
    chown -R mysql:mysql /var/lib/mysql
    
    # 启动从库
    systemctl start mariadb
  4. 配置从库复制连接

    sql
    -- 查看备份文件中的二进制日志位置
    cat /backup/initial/xtrabackup_binlog_info
    
    -- 在从库上配置复制
    CHANGE MASTER TO
      MASTER_HOST='192.168.1.100',
      MASTER_USER='repl',
      MASTER_PASSWORD='repl_password',
      MASTER_LOG_FILE='mariadb-bin.000001',
      MASTER_LOG_POS=107;
    
    -- 启动复制
    START SLAVE;
    
    -- 查看复制状态
    SHOW SLAVE STATUS\G

配置验证

在从库上执行 SHOW SLAVE STATUS\G,如果看到以下状态,则复制配置成功:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

GTID复制部署与配置

GTID(Global Transaction ID)复制使用全局唯一的事务ID来标识和跟踪每个事务,简化了复制的管理和故障转移。

配置步骤

  1. 配置主库

    ini
    # 启用 GTID
    gtid_domain_id = 1
    server_id = 100
    log_bin = /var/log/mysql/mariadb-bin
    binlog_format = ROW
    
    # 启用 GTID 复制
    gtid_strict_mode = ON
    enforce_gtid_consistency = ON
  2. 配置从库

    ini
    # 启用 GTID
    gtid_domain_id = 1
    server_id = 101
    relay_log = /var/log/mysql/relay-bin
    read_only = ON
    
    # 启用 GTID 复制
    gtid_strict_mode = ON
    enforce_gtid_consistency = ON
  3. 重启主从库

  4. 配置复制连接

    sql
    -- 在从库上配置 GTID 复制
    CHANGE MASTER TO
      MASTER_HOST='192.168.1.100',
      MASTER_USER='repl',
      MASTER_PASSWORD='repl_password',
      MASTER_USE_GTID=slave_pos;
    
    -- 启动复制
    START SLAVE;
    
    -- 查看复制状态
    SHOW SLAVE STATUS\G

GTID复制优势

  • 简化复制配置和管理
  • 便于故障转移和主从切换
  • 支持多源复制和级联复制
  • 提高复制的可靠性和一致性

半同步复制部署与配置

半同步复制是异步复制的增强版,主库在提交事务前需要至少一个从库确认接收了二进制日志。

配置步骤

  1. 安装半同步复制插件

    sql
    -- 在主库上安装
    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    
    -- 在从库上安装
    INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  2. 启用半同步复制

    sql
    -- 在主库上启用
    SET GLOBAL rpl_semi_sync_master_enabled = 1;
    SET GLOBAL rpl_semi_sync_master_timeout = 10000; -- 10秒超时
    
    -- 在从库上启用
    SET GLOBAL rpl_semi_sync_slave_enabled = 1;
  3. 重启从库 IO 线程

    sql
    STOP SLAVE IO_THREAD;
    START SLAVE IO_THREAD;
  4. 验证半同步复制

    sql
    -- 在主库上查看
    SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync_master_status';
    -- 预期结果:Value: ON
    
    -- 在从库上查看
    SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync_slave_status';
    -- 预期结果:Value: ON

半同步复制参数优化

参数名称默认值说明建议值
rpl_semi_sync_master_timeout10000超时时间(毫秒)5000-30000
rpl_semi_sync_master_wait_for_slave_count1需要确认的从库数量1-从库总数
rpl_semi_sync_master_wait_no_slaveON当没有从库可用时是否降级为异步复制ON
rpl_semi_sync_master_trace_level32调试级别32(生产环境)

多源复制部署与配置

多源复制允许一个从库从多个主库复制数据,适用于数据整合和集中备份场景。

配置步骤

  1. 配置从库

    ini
    server_id = 101
    relay_log = /var/log/mysql/relay-bin
    read_only = ON
    
    # 启用多源复制
    slave_parallel_workers = 4
    slave_parallel_type = LOGICAL_CLOCK
  2. 配置复制连接

    sql
    -- 配置第一个主库
    CHANGE MASTER 'master1' TO
      MASTER_HOST='192.168.1.100',
      MASTER_USER='repl',
      MASTER_PASSWORD='repl_password',
      MASTER_LOG_FILE='mariadb-bin.000001',
      MASTER_LOG_POS=107;
    
    -- 配置第二个主库
    CHANGE MASTER 'master2' TO
      MASTER_HOST='192.168.1.102',
      MASTER_USER='repl',
      MASTER_PASSWORD='repl_password',
      MASTER_LOG_FILE='mariadb-bin.000001',
      MASTER_LOG_POS=107;
    
    -- 启动所有主库的复制
    START ALL SLAVES;
    
    -- 查看复制状态
    SHOW ALL SLAVES STATUS\G

多源复制注意事项

  • 确保不同主库的表结构不冲突
  • 建议使用不同的数据库名区分不同主库的数据
  • 监控每个主库的复制延迟
  • 合理设置并行复制线程数

复制监控与维护

复制状态监控

  1. 查看复制状态

    sql
    -- 单源复制
    SHOW SLAVE STATUS\G
    
    -- 多源复制
    SHOW ALL SLAVES STATUS\G
  2. 监控复制延迟

    sql
    -- 查看复制延迟
    SELECT Seconds_Behind_Master FROM information_schema.processlist WHERE command = 'Slave SQL';
    
    -- 使用性能 schema 监控
    SELECT * FROM performance_schema.replication_applier_status_by_worker;
  3. 监控二进制日志

    sql
    -- 查看主库二进制日志状态
    SHOW MASTER STATUS;
    SHOW BINARY LOGS;
    
    -- 查看从库中继日志状态
    SHOW RELAYLOG EVENTS IN 'relay-bin.000001';

复制维护

  1. 修复复制错误

    sql
    -- 跳过单个错误
    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
    START SLAVE SQL_THREAD;
    
    -- 跳过特定错误
    -- 在配置文件中添加
    slave_skip_errors = 1062,1032
  2. 重置复制

    sql
    -- 停止复制
    STOP SLAVE;
    
    -- 重置复制配置
    RESET SLAVE ALL;
    
    -- 重新配置复制
    CHANGE MASTER TO ...;
    START SLAVE;
  3. 清理二进制日志

    sql
    -- 手动清理
    PURGE BINARY LOGS TO 'mariadb-bin.000010';
    PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00';
    
    -- 自动清理(通过配置文件)
    expire_logs_days = 7

复制优化

二进制日志优化

ini
# 使用 ROW 格式,提高复制可靠性
binlog_format = ROW

# 增大二进制日志文件大小
max_binlog_size = 1G

# 启用二进制日志校验
binlog_checksum = CRC32

# 优化二进制日志写入
sync_binlog = 1

从库优化

ini
# 启用并行复制
slave_parallel_workers = 8
slave_parallel_type = LOGICAL_CLOCK

# 优化中继日志写入
relay_log_recovery = ON
relay_log_info_repository = TABLE
relay_log_purge = ON

# 优化从库读取
skip_slave_start = ON
read_only = ON

网络优化

  • 使用专用网络进行复制流量传输
  • 配置合适的 slave_net_timeout 参数
  • 考虑使用压缩复制(MariaDB 10.1+ 支持)

复制常见问题及解决方案

问题 1:Slave_IO_Running: No

可能原因

  • 网络连接问题
  • 复制用户权限不足
  • 二进制日志文件不存在或已被清理

解决方案

  • 检查网络连通性:ping 192.168.1.100
  • 验证复制用户权限:SHOW GRANTS FOR 'repl'@'192.168.1.101'
  • 检查主库二进制日志:SHOW BINARY LOGS

问题 2:Slave_SQL_Running: No

可能原因

  • 从库执行事务时发生错误
  • 主从库表结构不一致
  • 数据冲突(如主键重复)

解决方案

  • 查看错误日志:tail -f /var/log/mysql/error.log
  • 跳过错误:SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1
  • 修复数据冲突:手动同步不一致的数据

问题 3:Seconds_Behind_Master 持续增长

可能原因

  • 主库写入压力过大
  • 从库硬件性能不足
  • 网络延迟过高
  • 并行复制配置不合理

解决方案

  • 优化主库查询性能
  • 升级从库硬件配置
  • 优化网络连接
  • 调整并行复制线程数

问题 4:二进制日志文件过大

可能原因

  • max_binlog_size 设置过大
  • expire_logs_days 设置过小
  • 长时间运行的事务

解决方案

  • 调整 max_binlog_size 为合理值(如 1G)
  • 设置合适的 expire_logs_days(如 7 天)
  • 优化长时间运行的事务

常见问题 (FAQ)

Q1:主从复制和 GTID 复制有什么区别?

A:主从复制使用二进制日志文件名和位置来跟踪复制进度,而 GTID 复制使用全局唯一的事务 ID。GTID 复制简化了复制管理和故障转移,提高了复制的可靠性。

Q2:半同步复制会影响主库性能吗?

A:半同步复制会导致主库提交事务的延迟增加,因为主库需要等待从库确认接收二进制日志。影响程度取决于网络延迟和从库性能。建议根据业务需求选择合适的超时时间。

Q3:如何实现复制的自动故障转移?

A:可以使用工具如 MariaDB MaxScale、ProxySQL、HAProxy 结合 Keepalived 实现自动故障转移。这些工具可以监控主库状态,并在主库故障时自动将从库提升为主库。

Q4:多源复制支持多少个主库?

A:MariaDB 理论上支持无限多个主库,但实际应用中建议根据从库的性能和网络带宽合理设置主库数量,一般不超过 10 个。

Q5:如何监控复制状态?

A:可以使用命令行工具如 SHOW SLAVE STATUS\G,或使用监控工具如 Prometheus + Grafana、Nagios、Zabbix 等进行可视化监控。建议配置告警机制,及时发现和处理复制问题。

Q6:如何处理复制延迟问题?

A:可以通过优化主库查询性能、升级从库硬件配置、调整并行复制线程数、使用专用网络等方式解决复制延迟问题。同时,建议监控复制延迟,及时发现并处理问题。

Q7:复制过程中主库崩溃怎么办?

A:如果主库崩溃,可以将一个从库提升为主库,然后重新配置其他从库指向新主库。使用 GTID 复制可以简化这个过程,因为不需要手动查找二进制日志位置。

Q8:如何验证复制数据的一致性?

A:可以使用工具如 pt-table-checksumpt-table-sync 来验证和修复主从库数据一致性问题。这些工具可以检测主从库之间的数据差异,并生成修复脚本。