MySQL双主同步配置实战:构建高可用数据库架构

一、背景介绍

在实际生产环境中,单点故障是数据库系统面临的最大风险之一。一旦主数据库发生故障,整个业务可能会陷入瘫痪。为了避免这种情况,我们需要构建一个高可用的数据库架构,确保在主数据库出现问题时,能够迅速切换到备用数据库,保证业务的连续性。

MySQL双主同步配置是一种常见的高可用解决方案,它通过在两台服务器上分别部署MySQL实例,并配置它们互为主从关系,实现数据的双向同步。在此基础上,结合Keepalived工具,可以进一步实现虚拟IP(VIP)的自动漂移,从而实现无缝切换。

二、准备工作

在开始配置之前,我们需要做好以下准备工作:

    硬件环境

    • 两台服务器,分别作为主数据库和备用数据库。
    • 确保服务器网络互通,且配置相同的操作系统环境。

    软件环境

    • 安装相同版本的MySQL数据库,建议使用MySQL 8.0及以上版本。
    • 安装Keepalived工具,用于实现VIP的自动漂移。

    权限配置

    • 确保操作用户具有足够的权限,能够进行MySQL和Keepalived的配置和管理。

三、MySQL双主同步配置

1. 安装MySQL

首先,在两台服务器上分别安装MySQL数据库。可以通过以下命令进行安装(以CentOS为例):

yum install -y mysql-community-server

安装完成后,启动MySQL服务并进行初始配置:

systemctl start mysqld
systemctl enable mysqld

2. 修改MySQL配置文件

在两台服务器的/etc/my.cnf配置文件中,分别添加以下配置:

服务器A(主节点1)

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
sync-binlog=1
gtid-mode=ON
enforce-gtid-consistency=ON

服务器B(主节点2)

[mysqld]
server-id=2
log-bin=mysql-bin
binlog-format=ROW
sync-binlog=1
gtid-mode=ON
enforce-gtid-consistency=ON

注意:server-id必须唯一,用于标识不同的MySQL实例。

3. 创建同步用户

在两台服务器上分别创建用于数据同步的用户,并授予相应的权限:

CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

4. 配置双主同步

在服务器A上执行以下命令,获取当前的二进制日志位置:

SHOW MASTER STATUS;

记录下FilePosition的值,然后在服务器B上执行以下命令,配置同步:

CHANGE MASTER TO
MASTER_HOST='服务器A的IP',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='记录的File值',
MASTER_LOG_POS=记录的Position值;

同样,在服务器B上获取二进制日志位置,并在服务器A上配置同步。

5. 启动同步

在两台服务器上分别启动同步:

START SLAVE;

通过以下命令检查同步状态:

SHOW SLAVE STATUS\G

确保Slave_IO_RunningSlave_SQL_Running都为Yes,表示同步正常。

四、Keepalived配置

1. 安装Keepalived

在两台服务器上分别安装Keepalived:

yum install -y keepalived

2. 配置Keepalived

在两台服务器的/etc/keepalived/keepalived.conf配置文件中,分别添加以下配置:

服务器A

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

virtual_server 192.168.1.100 3306 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.10 3306 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.20 3306 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

服务器B

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

virtual_server 192.168.1.100 3306 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.10 3306 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.20 3306 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

注意:virtual_ipaddress中的IP地址为虚拟IP,real_server中的IP地址分别为两台服务器的实际IP。

3. 启动Keepalived

在两台服务器上分别启动Keepalived服务:

systemctl start keepalived
systemctl enable keepalived

五、测试与验证

1. 检查VIP

通过以下命令检查VIP是否已绑定到主节点:

ip addr show

2. 模拟故障切换

在主节点上停止MySQL服务或Keepalived服务,观察VIP是否自动漂移到备用节点。

3. 验证数据同步

在主节点上插入一条数据,检查备用节点是否能够同步到该数据。

六、总结

通过本文的详细步骤,我们已经成功搭建了一个基于MySQL双主同步配置的高可用数据库架构。结合Keepalived工具,实现了VIP的自动漂移,确保在主数据库发生故障时,能够迅速切换到备用数据库,保障业务的连续性和数据的安全性。

在实际生产环境中,还可以进一步优化和扩展该架构,例如增加更多的备用节点、配置读写分离、使用监控工具实时监控数据库状态等,以进一步提升系统的稳定性和可靠性。

希望本文能够帮助读者掌握MySQL双主同步配置的实战技巧,为构建高可用数据库架构提供有力支持。