Mysql中Keepalived+双主架构的详细讲解

时间:2025-04-24 12:35:51

在 MySQL 的高可用性架构中,结合 Keepalived 和 双主架构(Master-Master Replication) 是一种常见的设计方法,以提高系统的可用性和负载均衡能力。以下将详细讲解这一架构的概念、工作原理、设置步骤、使用场景及其优势与局限性。

1. 概述

1.1 双主架构

双主架构是指在一个 MySQL 集群中存在两个主服务器,两台服务器之间实现双向的主从复制。每台服务器既可以接收写请求,也能够将数据同步给另一台主服务器。这种模式的优点是可以实现负载均衡并提高系统的容错能力。

1.2 Keepalived

Keepalived 是一种基于 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)的高可用性解决方案。它可以监控和管理网络服务的可用性,并在主服务器发生故障时自动切换流量到备用服务器。在 MySQL 环境中,Keepalived 可以配置虚拟 IP 地址(VIP),确保数据库服务在多台主服务器之间无缝切换。

2. 架构图示

双主架构结合 Keepalived 的示意图:

+-----------------------+  
                 |       Keepalived      |  
                 +-----------+-----------+  
                             |  
                             |     Virtual IP (VIP)  
                             |  
                   +---------+---------+  
                   |                   |  
                   |                   |  
               +---+---+           +---+---+  
               | Master 1|         | Master 2|  
               +---------+           +---------+  
                   |  ^                   |  ^  
                   |  |                   |  |  
                   |  +-------------------+  |  
                   |                      |  
              +----+-------+      +-----+-------+  
              |   Slave 1  |      |   Slave 2   |  
              +------------+      +-------------+

3. 工作原理

  1. 数据同步:在双主架构中,Master 1 和 Master 2 之间通过双向复制进行数据同步。它们各自接收写请求并将数据同步给对方。
  2. VIP 管理:Keepalived 管理一个虚拟 IP(VIP),该 IP 可以在主服务器发生故障时自动切换到备用服务器。这意味着客户端始终使用同一个 IP 地址来访问数据库服务。
  3. 故障转移:当 Master 1 发生故障时,Keepalived 会通过 VRRP 协议检测到故障,并将 VIP 迁移到 Master 2。这时,所有的数据库请求将通过 Master 2 继续服务。
  4. 健康检查:Keepalived 定期检查数据库节点的健康状况,确保系统的可用性和一致性。

4. 设置步骤

以下是在 Linux 环境中配置 Keepalived 和双主架构的详细步骤:

4.1 环境准备

确保你有两个安装了 MySQL 的服务器(例如,Master 1 和 Master 2),以及安装了 Keepalived 的环境。

4.2 安装 Keepalived

在每个主服务器上安装 Keepalived:

sudo apt-get update  
sudo apt-get install keepalived

4.3 配置双主复制

4.3.1 配置 MySQL

在 Master 1 和 Master 2 中进行以下配置:

  1. 在 master1.cnf 和 master2.cnf 中设置:
# Master 1 Configuration  
[mysqld]  
server-id = 1  
log-bin = mysql-bin  
binlog-do-db = your_database  # 需要同步的数据库  
auto-increment-increment = 2  
auto-increment-offset = 1
# Master 2 Configuration  
[mysqld]  
server-id = 2  
log-bin = mysql-bin  
binlog-do-db = your_database  # 需要同步的数据库  
auto-increment-increment = 2  
auto-increment-offset = 2
  1. 重启 MySQL 服务
sudo systemctl restart mysql
  1. 创建复制用户

在 Master 1 上执行:

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

在 Master 2 上执行相同的操作,确保复制用户相同。

4.3.2 配置复制

在 Master 1 和 Master 2 中执行以下步骤:

  1. 获取 Master 1 的状态(在 Master 1 上执行):
FLUSH TABLES WITH READ LOCK;  
SHOW MASTER STATUS;

记下 File 和 Position 的值。

  1. 在 Master 2 上执行配置
CHANGE MASTER TO  
    MASTER_HOST='master1_ip',  
    MASTER_USER='replication_user',  
    MASTER_PASSWORD='password',  
    MASTER_LOG_FILE='mysql-bin.xxxxxx',  -- 记下的 File  
    MASTER_LOG_POS=xxxx;                  -- 记下的 Position  

START SLAVE;
  1. 获取 Master 2 的状态(在 Master 2 上执行):
FLUSH TABLES WITH READ LOCK;  
SHOW MASTER STATUS;

记下 File 和 Position 的值,然后在 Master 1 上执行相同的配置:

CHANGE MASTER TO  
    MASTER_HOST='master2_ip',  
    MASTER_USER='replication_user',  
    MASTER_PASSWORD='password',  
    MASTER_LOG_FILE='mysql-bin.xxxxxx',  -- 记下的 File  
    MASTER_LOG_POS=xxxx;                  -- 记下的 Position  

START SLAVE;

4.4 配置 Keepalived

4.4.1 配置 Keepalived

在每个主服务器上创建和编辑 Keepalived 配置文件 /etc/keepalived/keepalived.conf

在 Master 1 上:

vrrp_instance VI_1 {  
    state MASTER  
    interface eth0  # 根据实际网卡调整  
    virtual_router_id 51  
    priority 100  
    advert_int 1  
    authentication {  
        auth_type PASS  
        auth_pass YourAuthPass  # 设置认证密码  
    }  
    virtual_ipaddress {  
        192.168.1.100  # VIP 地址  
    }  
}

在 Master 2 上:

vrrp_instance VI_1 {  
    state BACKUP  
    interface eth0  # 根据实际网卡调整  
    virtual_router_id 51  
    priority 90  
    advert_int 1  
    authentication {  
        auth_type PASS  
        auth_pass YourAuthPass  # 设置认证密码  
    }  
    virtual_ipaddress {  
        192.168.1.100  # VIP 地址  
    }  
}

4.4.2 启动 Keepalived

在每个主服务器上启动并设置 Keepalived 为自启动:

sudo systemctl start keepalived  
sudo systemctl enable keepalived

4.5 验证配置

  1. 检查 Keepalived 状态

使用以下命令确认 VIP 已分配至 Master 1:

ip addr show
  1. 检查 MySQL 主从复制状态

在 Master 1 和 Master 2 上执行:

SHOW SLAVE STATUS\G;

确保 Slave_IO_Running 和 Slave_SQL_Running 都是 Yes,表明复制正常。

5. 使用场景

  1. 高可用性数据库:对可用性要求高的业务场景,可以暑以双主架构搭配 Keepalived 提升可靠性。
  2. 读写分离:在确保可用性的同时,实现读取负载的分散,双主架构允许同时处理写请求。
  3. 容灾备份:在一台主服务器发生故障时,另一台主服务器可即时接管服务。

6. 优势与局限性

6.1 优势

  • 自动故障转移:借助 Keepalived 实现自动故障转移,减少了人工干预的需要。
  • 负载均衡:双主架构能够在多台服务器之间分担负载,提高整体性能。
  • 高可用性:保持较高的可用性和恢复能力,适用于关键业务系统。

6.2 局限性

  • 数据冲突:双主架构可能会在写入操作上产生数据冲突,需谨慎设计应用的写入逻辑。
  • 复杂性:相较于单主单从架构,双主架构的配置和维护会更加复杂。
  • 网络瓶颈:网络延迟和带宽可能会成为性能瓶颈,影响主从之间的同步速度。