MySQL / MariaDB 主从复制架构实战指南

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.sql

2. 创建复制用户

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等工具检查主备数据一致性。

总之,在选择高可用方案时要考虑业务的实际需求,而不是盲目追求复杂的配置。