LVS+Keepalived 高可用群集

目录

[一、Keepalived 概述](#一、Keepalived 概述)

1、VRRP

1.1、VRRP协议概念

1.2、VRRP工作原理

1.3、VRRP抢占模式

1.3.1、抢占模式的概念

1.3.2、抢占模式的优先级比较

1.3.3、抢占模式的应用场景

2、Keepalived概述

2.1、Keepalived作用

2.2、Keepalived工作原理

[2.3、Keepalived 体系及其模块主要作用](#2.3、Keepalived 体系及其模块主要作用)

[四、部署LVS+Keepalived 高可用群集](#四、部署LVS+Keepalived 高可用群集)

1、部署Master负载调度服务器

1.1、修改主配置文件

1.2、调整/proc响应参数

2、部署Backup负载调度服务器

2.1、修改主配置文件

2.2、调整/proc响应参数

3、配置节点服务器

3.1、配置虚拟IP

3.2、调整/proc响应参数

4、测试

五、Keepalived脑裂以及解决方法

1、什么是脑裂

2、形成脑裂的原因

3、脑裂解决方法


一、Keepalived 概述

1、VRRP

1.1、VRRP协议概念

VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是一种用于提高网络可靠性的协议。它通过在一组路由器之间创建一个虚拟路由器,实现了网关的冗余。这个虚拟路由器拥有一个虚拟IP地址和虚拟MAC地址,主路由器负责处理发送到这个虚拟IP地址的流量,而备份路由器在主路由器失效时自动接管,以确保网络的连续性。

在VRRP中,路由器被分为主路由器(Master)和备份路由器(Backup)。主路由器定期发送VRRP通告消息,如果备份路由器检测到一定时间内没有收到通告消息,就会自动接管,成为新的主路由器,并继续提供服务。

1.2、VRRP工作原理

VRRP(虚拟路由冗余协议)的工作原理通过协调多台路由器来创建一个虚拟路由器,实现网关的冗余和故障切换。

虚拟路由器的概念

  • 在VRRP中,多个实际的物理路由器被配置成一个虚拟路由器组,这个虚拟路由器拥有一个虚拟IP地址和虚拟MAC地址。
  • 虚拟IP地址通常配置为网络中的网关地址,网络中的主机将其配置为默认网关。

角色分配

  • 在一个VRRP组中,路由器被分为两类:主路由器(Master)和备份路由器(Backup)。
  • 主路由器(Master)负责处理发送到虚拟IP地址的所有流量。
  • 备份路由器(Backup)作为冗余设备,当主路由器不可用时接管其工作。

优先级

  • 每个路由器都被分配一个优先级,范围是1到254,数值越高,优先级越高。
  • 默认情况下,优先级最高的路由器会成为主路由器。如果有两个路由器优先级相同,那么拥有更高IP地址的路由器会成为主路由器。

VRRP通告消息

  • 主路由器定期向备份路由器发送VRRP通告消息,默认间隔时间为1秒。
  • 这些通告消息中包含主路由器的优先级和状态信息。

故障检测与切换

  • 如果备份路由器在一定时间(通常为3秒,即3次通告消息间隔)内没有收到主路由器的VRRP通告消息,它会认为主路由器已经失效。
  • 备份路由器会在检测到主路由器失效后,根据优先级顺序选举一个新的主路由器,并开始发送VRRP通告消息。
  • 这个新的主路由器接管虚拟IP地址,继续为网络中的设备提供网关服务,实现无缝切换。

负载均衡

  • 虽然VRRP主要用于冗余和故障切换,但在某些高级配置中,也可以通过设置不同VRRP组的优先级,实现负载均衡。

抢占功能

  • 如果启用了抢占功能(通常为默认设置),当一个优先级较高的路由器恢复工作时,它会自动抢回主路由器的位置。
  • 如果不启用抢占功能,即使优先级更高的路由器恢复,也不会抢回主路由器的角色,除非当前主路由器失效。

1.3、VRRP抢占模式

1.3.1、抢占模式的概念
  • 抢占模式允许一个优先级更高的备份路由器在恢复正常后,主动接管主路由器的角色,即成为新的主路由器。
  • 如果抢占模式被禁用,则无论优先级高低,当前的主路由器将继续保留其主路由器的角色,直到它失效为止。
1.3.2、抢占模式的优先级比较
  • 抢占模式的前提是路由器之间存在优先级差异。路由器优先级越高,越有可能在启用抢占模式时成为主路由器。
  • 当一个优先级较低的主路由器正在运行时,如果优先级更高的路由器恢复并启用了抢占模式,它将抢占主路由器的角色。
1.3.3、抢占模式的应用场景

启用抢占模式

  • 适用于希望始终由最高优先级路由器作为主路由器的场景。这样可以确保最强大、最可靠的设备始终承担主要的流量处理任务。

禁用抢占模式

  • 适用于希望避免频繁切换主路由器的场景,特别是在恢复时间较短且网络流量相对稳定的情况下。禁用抢占模式可以减少不必要的网络波动和切换。

2、Keepalived概述

2.1、Keepalived作用

Keepalived 是一个基于 VRRP(虚拟路由冗余协议)实现的高可用性解决方案,常用于 LVS(Linux Virtual Server)集群中,以确保服务的高可用性。它能够有效解决静态路由中可能出现的单点故障问题。

专为LVS和HA设计的一款健康检查工具

  • 支持故障自动切换(Failover)
  • 支持节点健康状态检查(Health Checking)
cpp 复制代码
官方网站:http://www.keepalived.org/

2.2、Keepalived工作原理

Keepalived 的工作原理基于 VRRP(虚拟路由冗余协议),通过在主备服务器之间协调工作,实现服务的高可用性。以下是 Keepalived 的工作原理详细说明:

基本结构:

  • 主服务器(MASTER):负责处理大部分或全部的实际流量,并定期发送状态通告。
  • 备份服务器(BACKUP):在主服务器正常工作时处于待命状态,持续监听主服务器的状态。

虚拟IP(VIP):

  • 虚拟IP地址:Keepalived 配置的主备服务器共享一个虚拟IP地址,这个地址对外公开,客户端通过该虚拟IP访问服务。
  • VIP 绑定:在正常情况下,VIP 绑定在主服务器上,所有流量都通过主服务器处理。

VRRP 协议:

  • VRRP 通告消息:主服务器定期发送 VRRP 通告消息(默认每秒一次)给备份服务器。这个通告消息包含主服务器的优先级和当前状态。
  • 优先级:每个服务器在 VRRP 中有一个优先级,主服务器通常具有较高的优先级。优先级较高的服务器会成为主服务器。

故障检测与切换:

  • 主服务器故障:如果备份服务器在一定时间内(通常为3秒)没有收到主服务器的 VRRP 通告消息,它会认为主服务器发生了故障。
  • 备份服务器接管:备份服务器将自动接管虚拟IP地址,成为新的主服务器,继续处理流量和请求。
  • 无缝切换:这种切换是无缝的,客户端通常不会察觉到背后的变化,确保服务不中断。

健康检查:

  • 服务检测:Keepalived 还可以配置健康检查模块,定期检查主服务器的健康状态(如服务端口、URL 等)。
  • 动态调整:如果主服务器的某些服务出现异常,但服务器本身未完全失效,Keepalived 可以根据健康检查的结果动态调整服务器状态,如将其暂时从负载均衡池中移除。

抢占机制:

  • 优先级较高的服务器恢复:如果主服务器恢复正常,它会重新发送 VRRP 通告消息。
  • 抢占设置:根据配置,如果启用了抢占机制,优先级更高的服务器会重新夺回主服务器的位置,并重新绑定虚拟IP地址。

2.3、Keepalived 体系及其模块主要作用

①、Core 模块

作用:Core 模块是 Keepalived 的核心部分,负责主进程的启动和维护,以及全局配置文件的加载和解析。

功能

  • 启动 Keepalived 的主要进程。
  • 解析并加载 Keepalived 的配置文件,初始化其他模块。
  • 维护整个 Keepalived 的运行状态和管理流程。

②、VRRP 模块

作用:VRRP 模块负责实现 VRRP(虚拟路由冗余协议),确保在主服务器故障时备份服务器能够接管虚拟路由器的角色,提供高可用性。

功能

  • 实现 VRRP 协议的通信和选举机制。
  • 管理主路由器和备份路由器之间的角色转换,确保网关的高可用性。
  • 发送和接收 VRRP 通告消息,进行故障检测与切换。

③、Check 模块

作用:Check 模块负责对后端服务器的健康状态进行检查,确保只有健康的服务器能够参与负载均衡或接管服务。

功能

  • 实施健康检查,常见的方式包括端口检查和 URL 检查。
  • 动态监控后端服务器的状态,根据健康检查结果调整服务器在负载均衡池中的状态。
  • 确保在服务器发生故障时,自动将其移除,并在其恢复正常后重新加入。

四、部署LVS+Keepalived 高可用群集

前提:关闭防火墙和临时防护

cpp 复制代码
systemctl stop firewalld.service
setenforce 0

1、部署Master负载调度服务器

1.1、修改主配置文件

bash 复制代码
yum -y install ipvsadm keepalived
//安装软件
systemctl start keepalived.service
//启动服务
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
//备份文件
bash 复制代码
vim /etc/keepalived/keepalived.conf


global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_01
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER          //备服务器设置为 MASTER
    interface ens33
    virtual_router_id 10
    priority 100          //备服务器设置为 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        172.16.88.180
    }
}

virtual_server 172.16.88.180 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    real_server 172.16.88.44 80 {     //第一个节点服务器
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 172.16.88.55 80 {     //第二个节点服务器
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}


//删除后面的其余配置

1.2、调整/proc响应参数

bash 复制代码
vim /etc/sysctl.conf

net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

sysctl -p

2、部署Backup负载调度服务器

2.1、修改主配置文件

bash 复制代码
yum -y install ipvsadm keepalived
//安装软件
systemctl start keepalived.service
//启动服务
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
//备份文件
bash 复制代码
vim keepalived.conf

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_02
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP          //备服务器设置为 BACKUP
    interface ens33
    virtual_router_id 10
    priority 80          //备服务器设置为 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        172.16.88.180
    }
}

2.2、调整/proc响应参数

bash 复制代码
vim /etc/sysctl.conf

net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

sysctl -p

3、配置节点服务器

bash 复制代码
yum -y install httpd    //安装服务
systemctl start httpd     //开启服务

配置节点服务器1:172.16.88.44

bash 复制代码
echo 'this is kgc web!' > /var/www/html/index.html

配置节点服务器2:172.16.88.55

bash 复制代码
echo 'this is benet web!' > /var/www/html/index.html

3.1、配置虚拟IP

编辑网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-lo:0

bash 复制代码
DEVICE=lo:0
ONBOOT=yes
IPADDR=172.16.88.180
NETMASK=255.255.255.255

重启网络服务:

bash 复制代码
service network restart 或 systemctl restart network
ifup lo:0
ifconfig lo:0
route add -host 172.16.88.180 dev lo:0

3.2、调整/proc响应参数

bash 复制代码
vim /etc/sysctl.conf

net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

sysctl -p

4、测试

客户端访问测试:

在客户端浏览器中访问以下URL,确认能够正常访问负载均衡后的Web服务

bash 复制代码
http://172.16.88.180/

主服务器故障切换测试:

在主服务器上停止 keepalived 服务,以模拟主服务器故障

bash 复制代码
systemctl stop keepalived

客户端重新访问测试

再次在客户端浏览器中访问 http://172.16.88.180/,确认备份服务器是否能够接管并正常提供服务。如果服务正常,则说明故障切换功能正常,备份服务器成功接管虚拟IP。

五、Keepalived脑裂以及解决方法

1、什么是脑裂

在 Keepalived 的上下文中,"脑裂"(Split-Brain)指的是高可用集群系统中的一个问题,发生在主节点和备份节点之间的状态不一致或通信中断时。这种情况可能导致系统中的两个节点都认为自己是主节点,从而导致虚拟 IP 地址或服务的重复运行,造成系统的不稳定性。

脑裂的表现

  • 服务重复:两个节点同时持有虚拟 IP 地址,导致服务的重复实例。
  • 数据不一致:由于两个节点同时处理请求或提供服务,可能会导致数据不一致或冲突。
  • 系统混乱:用户请求可能被路由到错误的节点,导致服务不可用或异常。

2、形成脑裂的原因

原因:

①、心跳之间发生故障:主备服务器间的心跳通信中断,导致双方无法确认对方的状态,可能引发脑裂。

②、网卡驱动故障:网卡驱动异常或故障,导致网络连接中断或不稳定,无法正常传输心跳消息。

③、IP 地址冲突问题:虚拟 IP 地址与实际 IP 地址发生冲突,导致网络混乱,可能引发脑裂。

④、仲裁服务器故障:仲裁服务器出现问题,导致无法正确判断主备节点状态,引发脑裂。

⑤、防火墙阻挡心跳消息传输:防火墙配置不当,阻挡了 Keepalived 的心跳消息传输,导致主备节点之间通信中断。

⑥、Keepalived 配置不一致

  • VRID 不一致:虚拟路由器 ID(VRID)配置不一致,可能导致主备节点无法正确识别对方。
  • 优先级一致:主备节点优先级配置相同,导致主备节点无法正确确定主节点,可能引发竞争状态。

3、脑裂解决方法

  • 双心跳连接:同时使用串行电缆和以太网电缆进行心跳通信。这种冗余设计确保即使一条连接断开,另一条仍能传递心跳消息,保持集群的完整性。

  • 强制节点关闭:在检测到脑裂时,可以使用专用的硬件设备(如STONITH或Fencing设备)强制关闭其中一个节点的电源,避免两个节点同时作为主节点运行,从而解决脑裂问题。

  • 完善的监控系统:建立一个全面的监控系统,实时监测集群的状态和健康状况。该系统应能及早发现潜在问题,并及时采取相应措施,预防脑裂的发生。

相关推荐
木子Linux3 分钟前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
mit6.8248 分钟前
Ubuntu 系统下性能剖析工具: perf
linux·运维·ubuntu
鹏大师运维10 分钟前
聊聊开源的虚拟化平台--PVE
linux·开源·虚拟化·虚拟机·pve·存储·nfs
watermelonoops17 分钟前
Windows安装Ubuntu,Deepin三系统启动问题(XXX has invalid signature 您需要先加载内核)
linux·运维·ubuntu·deepin
不惑_21 分钟前
小白入门 · 腾讯云轻量服务器部署 Hadoop 3.3.6
服务器·hadoop·腾讯云
阿甘知识库40 分钟前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
滴水之功1 小时前
VMware OpenWrt怎么桥接模式联网
linux·openwrt
saynaihe1 小时前
安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南
运维·安全·docker·容器·kafka
ldinvicible1 小时前
How to run Flutter on an Embedded Device
linux
YRr YRr2 小时前
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
linux·opencv·ubuntu