Bootstrap

keepalived+nginx实现高可用的案例详解(主主模式)


前言

keepalived主备模式和主主模式有什么区别

Keepalived 是用于实现高可用性和负载均衡的软件,通常用于配置虚拟路由冗余协议(VRRP)。在使用 Keepalived 时,可以配置两种常见的模式:主备模式 和 主主模式。它们在高可用性和负载均衡的实现上有不同的工作方式。下面详细解释这两种模式及它们的区别。

1. 主备模式(Master-Backup Mode)

概念:
主备模式是最常见的一种高可用性配置方式。在这种模式下,只有一个主节点(MASTER)在提供服务,其他节点作为备份节点(BACKUP),只有在主节点宕机或失效时,备份节点才会自动接管并提供服务。

工作流程:
主节点(MASTER):主节点运行正常时,它负责处理所有的流量或请求。它拥有指定的虚拟 IP 地址(VIP),客户端通过这个虚拟 IP 进行访问。
备节点(BACKUP):备节点处于待命状态,持续监控主节点的状态。如果主节点宕机或无法提供服务,备节点就会自动提升为主节点,接管虚拟 IP 并开始处理流量。
故障切换:当主节点恢复时,它可以再次成为主节点(根据优先级高低),备节点会退回到待命状态。

主要特点:
单点提供服务:在任何时候,只有一个节点(主节点)在提供服务。备份节点不处理流量,除非主节点失效。
高可用性(HA):这是典型的高可用性架构,目的是避免服务中断。
低资源利用率:备节点在大多数时候只是等待,没有实际工作,资源利用率相对较低。

场景举例:
一个简单的 Web 服务高可用性场景,主节点在正常情况下处理所有的 HTTP 请求,备份节点在主节点宕机时接管服务。
举例配置(简化版):

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    virtual_ipaddress {
        192.168.10.111
    }
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    virtual_ipaddress {
        192.168.10.111
    }
}

state MASTER 的节点负责处理流量,state BACKUP 的节点则等待主节点失效。

2. 主主模式(Active-Active Mode 或 Dual Master Mode)

概念:
在主主模式下,两个节点同时工作,都可以提供服务。它们各自处理部分流量,通常结合负载均衡来实现,同时提高资源利用率和服务的可用性。这里没有严格的“主”和“备”的区分,而是两个节点都处于活动状态。

工作流程:
两个节点同时处理流量:在主主模式下,两个节点共享流量。可以通过负载均衡策略(如轮询、最少连接等)来将客户端的请求分发到不同的节点上。
虚拟 IP(VIP)共享:两个节点可能共享多个虚拟 IP,每个节点管理不同的 VIP。
故障切换:如果其中一个节点宕机或失效,另一个节点可以接管其负责的虚拟 IP 和流量,继续提供服务。

主要特点:
负载均衡:主主模式的主要特点是负载均衡,两台服务器同时提供服务。
高资源利用率:因为两个节点都在工作,资源得到了充分利用。
高可用性(HA)+ 负载均衡(LB):除了高可用性之外,主主模式还能提供负载均衡功能。
复杂性:相对主备模式,配置和管理更加复杂,特别是在同步数据、会话保持等方面。

场景举例:
高并发的 Web 应用服务器。客户端的请求通过负载均衡算法分配给两台服务器,以减轻单台服务器的负担。
数据库集群:两个数据库节点同时提供读服务,写操作通过主节点进行。
举例配置(简化版):

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    virtual_ipaddress {
        192.168.10.111
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    virtual_ipaddress {
        192.168.10.112
    }
}

这里,两个节点分别作为不同 VRRP 实例的 MASTER,各自处理不同的虚拟 IP(192.168.10.111 和 192.168.10.112)。这就实现了两个节点同时工作。

主备模式 vs 主主模式 的区别
项目主备模式主主模式
节点角色一个主节点,其他节点为备节点两个节点都是主节点,均同时工作
流量处理只有主节点处理流量两个节点都处理流量(负载均衡)
资源利用率备节点不处理流量,资源利用率较低两个节点同时工作,资源利用率高
故障切换主节点失效时备节点接管一个节点失效时另一个节点接管该节点的任务
适用场景简单的高可用性场景,避免单点故障需要高可用性且负载较大的场景,如负载均衡
复杂性配置简单,管理容易配置复杂,管理需要负载均衡和同步机制
总结:

主备模式
强调高可用性,主要目的是避免服务中断,但在资源利用率上存在一些浪费,因为备份节点在正常情况下不处理流量。

主主模式
则不仅提供高可用性,还能够同时处理流量,解决资源利用的问题,并通过负载均衡来分摊负载。不过,主主模式的配置和管理更复杂,适用于负载较大的场景。

环境

主机名ip服务虚拟ip
ngx1192.168.10.11nginx+keepalived192.168.10.111
ngx2192.168.10.12nginx+keepalived192.168.10.111

案例实现具体步骤

在双主模式下,两台服务器都处于活动状态,并且各自绑定一个公网虚拟 IP。
当其中一台服务器发生故障时,另一台服务器会接管发生故障服务器的公网虚拟 IP。
配置步骤:
在两台服务器上安装 Nginx 和 Keepalived。
在两台服务器上都配置 Keepalived 为双主模式,设置相同的优先级。
配置健康检查脚本,用于检测 Nginx 服务是否运行正常。
配置两个虚拟 IP 地址(VIP),每个服务器一个。

ngx1

安装nginx和keepalived

yum -y install nginx keepalived

作为主端配置

vim /etc/keepalived/keepalived.conf

留下需要的配置即可
下面是配置完后的示例

global_defs {
   router_id LVS_DEVEL1
}

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

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.112
    }
}

解释:
这是一个使用 Keepalived 配置的示例文件。Keepalived 通常用于在 Linux 系统中配置高可用性(HA)和负载均衡。它实现了 VRRP(Virtual Router Redundancy Protocol)协议,用于管理虚拟 IP 地址的主备关系,以确保在主节点故障时备节点能够自动接管虚拟 IP。

1. global_defs 配置块

plaintext
global_defs {
   router_id LVS_DEVEL1
}

global_defs: 全局配置选项。
router_id: 这是一个全局唯一的路由器标识符,可以使用任意字符标识。通常用于日志文件中标识此节点。比如 LVS_DEVEL1 表示这个 Keepalived 配置的名称是 LVS_DEVEL1。
2. vrrp_instance 配置块
文件中有两个 vrrp_instance 配置块,分别命名为 VI_1 和 VI_2,表示两个不同的 VRRP 实例。

vrrp_instance VI_1
plaintext
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.111
    }
}

vrrp_instance VI_1: 定义一个 VRRP 实例,实例名称为 VI_1。
state MASTER: 指定当前节点为该实例的主节点(MASTER)。在同一实例中,主节点和备节点(BACKUP)之间共享虚拟 IP 地址。
interface ens33: 指定 Keepalived 监控的网络接口(如 ens33)。这个接口是虚拟 IP 将绑定的物理网络接口。
virtual_router_id 51: 虚拟路由器的 ID,用于识别 VRRP 实例。这个 ID 应该在网络中是唯一的(通常范围为 1-255)。
priority 100: 优先级,取值范围为 1-255,数值越大优先级越高。这里设置了 100,因此在正常情况下,该节点将作为 MASTER。
advert_int 1: 设置 VRRP 心跳包的通告间隔时间(秒)。表示每 1 秒发送一次 VRRP 报文。
authentication:
auth_type PASS: 设置验证类型为密码验证。
auth_pass 1111: 设置密码。两台设备在同一个 VRRP 实例中进行通信时,密码需要相同。
virtual_ipaddress: 定义该实例管理的虚拟 IP 地址(VIP)。在该示例中是 192.168.10.111。

vrrp_instance VI_2
plaintext
vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.112
    }
}

vrrp_instance VI_2: 定义了另一个 VRRP 实例,实例名称为 VI_2。
state BACKUP: 指定该节点在 VI_2 实例中的状态为备节点(BACKUP)。
virtual_router_id 52: 此实例的虚拟路由器 ID 与 VI_1 中的 51 不同,表明 VI_2 是一个独立的实例。
priority 99: 优先级设置为 99,表示在 VI_2 实例中,该节点的优先级比 VI_1 的 MASTER 节点优先级低,因此它不会成为 MASTER。
virtual_ipaddress: 定义该实例管理的虚拟 IP 地址(VIP)。在该示例中是 192.168.10.112。

配置文件整体解析
配置文件定义了两个 VRRP 实例 VI_1 和 VI_2,分别管理 192.168.10.111 和 192.168.10.112 两个虚拟 IP 地址。
VI_1 的 state 为 MASTER,优先级为 100,因此该节点在 VI_1 实例中为主节点。
VI_2 的 state 为 BACKUP,优先级为 99,因此该节点在 VI_2 实例中为备节点。
VI_1 和 VI_2 实例使用相同的网络接口(ens33)进行 VRRP 通信。
两个实例使用了相同的身份验证密码(auth_pass 为 1111),保证了通信的安全性。

然后创建一个测试页面

echo web1 > /usr/share/nginx/html/index.html

启动nginx和keepalived

systemctl start nginx
systemctl enable nginx
systemctl start keepalived
systemctl enable keepalived
ngx2

安装nginx和keepalived

yum -y install nginx keepalived
vim /etc/keepalived/keepalived.conf

留下需要的配置即可
下面是配置完后的示例

global_defs {
   router_id LVS_DEVEL2
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.111
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.112
    }
}

然后创建一个测试页面

echo web2 > /usr/share/nginx/html/index.html

启动nginx和keepalived

systemctl start nginx
systemctl enable nginx
systemctl start keepalived
systemctl enable keepalived
验证

ngx1查看ip

ip add

可以看见ngx1为主的虚拟ip 192.168.10.11
在这里插入图片描述

ngx2查看ip

ip add

可以看见ngx2为主的虚拟ip 192.168.10.12
在这里插入图片描述

访问测试
192.168.10.111
在这里插入图片描述
关闭ngx1后

systemctl stop keepalived

虚拟地址消失

ip add

在这里插入图片描述
出现在ngx2上
在这里插入图片描述
同时访问也是ngx2的页面
在这里插入图片描述

同时也能访问192.168.10.112
在这里插入图片描述

192.168.10.112同理
就不多叙述了。

;