使用keepalived + Redis 实现双机热备

简介

在分布式系统中,实现高可用性是一个重要的课题。一种常见的方式是使用双机热备机制,即当主节点故障时,备节点可以快速接管主节点的工作。本文将介绍如何使用keepalived和Redis实现双机热备。

原理

Keepalived是一个基于VRRP协议的工具,可以实现高可用性的故障切换。VRRP(Virtual Router Redundancy Protocol)是一种用于实现默认网关冗余的协议,可以将多个路由器组成一个虚拟路由器,对外提供一个虚拟的IP地址,实现故障切换。而Redis是一个开源的内存数据库,支持主从复制。通过将Redis配置为主节点和备节点,可以实现数据的实时同步。

以下是简化的系统架构图:

sequenceDiagram
    participant Client
    participant Keepalived
    participant RedisMaster
    participant RedisSlave

    Client ->> Keepalived: 请求
    Keepalived ->> RedisMaster: 转发请求
    RedisMaster ->> RedisSlave: 同步数据
    RedisSlave -->> RedisMaster: 应答
    RedisMaster -->> Keepalived: 应答
    Keepalived -->> Client: 应答

配置

安装 keepalived

首先,需要在两台服务器上安装keepalived。假设服务器A的IP地址为192.168.0.1,服务器B的IP地址为192.168.0.2。在服务器A上执行以下命令:

$ sudo apt-get install keepalived

在服务器B上执行相同的命令。

配置 keepalived

在服务器A上创建并编辑 /etc/keepalived/keepalived.conf 文件:

$ sudo vi /etc/keepalived/keepalived.conf

在文件中添加以下内容:

vrrp_instance VI_1 {
    state MASTER              # 服务器A配置为主节点
    interface eth0            # 网卡名称
    virtual_router_id 51      # 虚拟路由器ID,取一个唯一的值
    priority 100              # 优先级,主节点的优先级应该高于备节点
    advert_int 1              # 广播间隔
    authentication {
        auth_type PASS
        auth_pass password     # 身份验证密码
    }
    virtual_ipaddress {
        192.168.0.100/24       # 虚拟IP地址
    }
}

在服务器B上创建并编辑 /etc/keepalived/keepalived.conf 文件,内容如下:

vrrp_instance VI_1 {
    state BACKUP              # 服务器B配置为备节点
    interface eth0
    virtual_router_id 51
    priority 98               # 备节点的优先级应该低于主节点
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass password
    }
    virtual_ipaddress {
        192.168.0.100/24
    }
}

在以上配置中,重要的配置项有:

  • state:指定节点的状态,可以是MASTER(主节点)或BACKUP(备节点)。
  • interface:指定网卡的名称。
  • virtual_router_id:虚拟路由器ID,需要在两个节点上保持一致。
  • priority:节点的优先级,主节点优先级应该高于备节点。
  • virtual_ipaddress:虚拟IP地址,客户端将通过该IP地址访问服务。

保存文件后,重启keepalived服务:

$ sudo service keepalived restart

配置 Redis

在服务器A上安装Redis,并将其配置为主节点。在服务器B上安装Redis,并将其配置为备节点。

在服务器A上创建并编辑 /etc/redis/redis.conf 文件,设置以下配置:

bind 127.0.0.1 192.168.0.100    # 绑定本地和虚拟IP地址
requirepass password            # 设置访问密码

在服务器B上创建并编辑 /etc/redis/redis.conf 文件,设置以下配置:

bind 127.0.0.1