LVS+keepalived高可用群集

一. Keepalived 双机热备基础知识

Keepalived 起初是专门针对 LVS 设计的一款强大的辅助工具,主要用来提供故障切换(Failover)和健康检査(Health Checking)功能--判断 LVS 负载调度器、节点服务器的可用性,当 master 主机出现故障及时切换到 backup节点保证业务正常,当 master 故障主机恢复后将其重新加入群集并且业务重新切换回 master 节点。

1. Keepalived 概述及安装

Keepalived 的官方网站位于 http://www.keepalived.org/,将以 YUM方式讲解 Keepalived 的安装、配置和使用过程。在非 LVS 群集环境中使用时,Keepalived 也可以作为热备软件使用。

2. Keepalived 的热备方式

Keepalived 采用 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现Linux 服务器的多机热备功能。VRRP是针对路由器的一种备份解决方案--由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务;每个热备组内同一时刻只有一台主路由器提供服务,其他路由器处于冗余状态。若当前在线的路由器失效,则其他路由器会自动接替(优先级决定接替顺序)虚拟IP地址,以继续提供服务。

热备组内的每台路由器都可能成为主路由器,虚拟路由器的IP地址(VIP)可以在热备组内的路由器之间进行转移,所以也称为漂移IP地址。使用Keepalived 时,漂移地址的实现不需要手动建立虚接口配置文件(如 ens160:0),而是由 Keepalived 根据配置文件自动管理。

|-------------|----------------|------------------|
| 操作系统 | IP | 服务 |
| 0penEuler24 | 192.168.10.101 | Keepalived/nginx |
| 0penEuler24 | 192.168.10.102 | Keepalived/nginx |

3. Keepalived 的安装与服务控制

安装Keepalived

在0penEuler24系统中,使用DNF方式安装keepalived.x86642.2.8-1.oe2403spl,会自动安装 Keepalived 所需的软件包。除此之外,在 LVS群集环境中应用时,也需要用到 ipvsadm 管理工具。

二. 使用 Keepalived 实现双机热备

基于 VRRP 的热备方式,Keepalived 可以用作服务器的故障切换,每个热备组可以有 多台服务器--当然,最常用的就是双机热备了。在这种双机热备方案中,故障切换主要针对虚拟IP地址的漂移来实现,因此能够适用于各种应用服务器(不管是 Web、FTP、Mail,还是 SSH、DNS......)

简单的案例来说明 Keepalived 双机热备的配置方法。其中,主、备服务器的 IP 地址分别为 192.168.10.101和 192.168.10.102,基于漂移地址 192.168.10.100 提供 Web 服务

1. 主服务器的配置

Keepalived 服务的配置目录位于/etc/keepalived/。其中keepalived.conf 是主配置文件。

解释:

  • router_id HA_TEST_RI:本路由器(服务器)的名称
  • vrrp_instance VI_1:定义 VRRP 热备实例
  • state MASTER:热备状态,MASTER 表示主服务器
  • interface ens160:承载 VIP 地址的物理接口
  • virtual_router_id 1:虚拟路由器的 ID号,每个热备组保持一致
  • priority 100:优先级,数值越大优先级越高
  • advert_int 1:通告间隔秒数(心跳频率)
  • authentication:认证信息,每个热备组保持一致
  • auth_type PASS:认证类型
  • auth_pass 1111:密码字串
  • virtual_ipaddress:指定漂移地址(VIP),可以有多个

确认上述配置无误,然后启动 Keepalived 服务。实际状态为 MASTER 的主服务器将为 ens160接口自动添加 VIP 地址,通过 ip 命令可以査看。注意:ifconfig 命令看不到。

2. 备用服务器的配置

在同一个 Keepalived 热备组内,所有服务器的 Keepalived 配置文件基本相同,包括虚拟路由器的 ID 号、认证信息、漂移地址、心跳频率等。不同之处主要在于路由器名称、热备状态、优先级。

  • 路由器名称(router_id):建议为每个参与热备的服务器指定不同的名称。
  • 热备状态(state):至少应有一台主服务器,将状态设为MASTER;可以有多台备用的服务器,将状态设为BACKUP。
  • 优先级(priority):数值越大则取得 VIP 控制权的优先级越高,因此主服务器的优先级应设为最高;其他备用服务器的优先级可依次递减,但不要相同,以免在争夺 VIP 控制权时发生冲突。

配置备用服务器(可以有多台)时,可以参考主服务器的keepalived.conf配置文件内容,只需修改路由器名称、热备状态、优先级。

确认配置无误,一样需要启动Keepalived 服务。此时主服务器仍然在线,VIP 地址实际上仍然由主服务器控制,其他服务器处于备用状态。因此,在备用服务器中将不会为 ens160 接口添加 VIP 地址。

3. 测试双机热备功能

Keepalived 的日志消息保存在/var/log/messages 文件中,在测试主、备故障自动切换功能时,可以跟踪此日志文件来观察热备状态的变化。以针对连通性和Web 服务的测试为例

(1) 连通性测试

在客户机中执行"ping 192.168.10.100"命令,能够正常、持续 ping 通,根据以下操作继续观察测试结果。

停止启用主服务器的 Keepalived 服务,发现 ping 测试只中断了 1或 2个包或者一个包都不断,一直通说明其他服务器直接替VIP地址,并及时响应

重新启动主服务器的keepalived 服务,主服务会夺回VIP地址的控制权

(2) Web 访问测试

在 keepalived 运行的主机上启动 nginx 服务并写入不通的测试页面内容

keepalived01

keepalived02

在客户机中访问 curl 192.168.10.100,将看到由主服务器 192.168.10.101提供的网页文档。

① 停止启用主服务器的 Keepalived 服务,再次访问上述 Web 服务,将看到由备用服务

器 192.168.10.102 提供的网页文档,说明 VIP 地址已切换至备用服务器。②) 重新启用主服务器的 Keepalived 服务,再次访问上述 Web 服务,将看到重新由主服务器 192.168.10.101 提供的网页文档,说明主服务器已重新夺取 VIP 地址。

(3) 查看日志记录在执行主、备服务器故障切换的过程中,分别观察各自的/var/log/messages 日志文件,可以看到 MASTER、SLAVE 状态的迁移记录。① 主服务器中,Keepalived 服务状态先变为"stop",移除 VIP 地址,恢复后重新变为 MASTER。② 备用服务器中,状态切换MASTER,待主服务器恢复后再交回控制权

通过上述测试过程,可以发现双机热备已经正常。客户机只要通过VIP地址就可以访问服务器所提供的 Web 等应用。其中,任何一台服务器失效,另一台服务器将会立即接替服务,从而实现高可用性。实际应用时,注意主、备服务器所提供的 Web 服务内容要保持一致。

三. 使用Keepalived 实现双机热备

Keepalived 的设计目标是构建高可用的 LVS 负载均衡群集,可以调用ipvsadm 工具来创建虚拟服务器、管理服务器池,而不仅仅用作双机热备。使用Keepalived 构建 LVS 群集更加简便易用,主要优势体现在:对 LVS 负载调度器实现热备切换,提高可用性;对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入。在基于 LVS+Keepalived 实现的 LVS 群集结构中,至少包括两台热备的负载调度器,三台以上的节点服务器。本节将以 DR 模式的 LVS 群集为基础,增加一台从负载调度器,使用 Keepalived 来实现主、从调度器的热备,从而构建兼有负载均衡、高可用两种能力的 LVS 网站群集平台

使用 Keepalived 构建 LVS 群集时,也需要用到 ipvsadm 管理工具。但大部分工作会由Keepalived 自动完成,不需要手动执行 ipvsadm(除了查看和监控群集以外)。

资源列表:

|-----------|----------------|--------------------|
| 操作系统 | IP | 服务 |
| 0penEuler | 192.168.10.101 | Keepalived/ipvsadm |
| 0penEuler | 192.168.10.102 | Keepalived/ipvsadm |
| 0penEuler | 192.168.10.103 | http |
| 0penEuler | 192.168.10.104 | http |
| 0penEuler | 192.168.10.105 | |

先配置两台http网站服务

http1

复制代码
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# dnf -y install httpd
[root@localhost ~]# echo "web1">/var/www/html/index.html
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl enable httpd

http2

复制代码
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# dnf -y install httpd
[root@localhost ~]# echo "web2">/var/www/html/index.html
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl enable httpd

测试一下

配置 keepalived01

cpp 复制代码
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# dnf -y install keepalived
[root@localhost ~]# dnf -y install keepalived ipvsadm
[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# cp keepalived.conf.sample keepalived.conf
[root@localhost keepalived]# vim keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.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
    interface ens160
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.172
    }
}

virtual_server 192.168.10.172 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP

    real_server 192.168.10.103 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.10.104 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

[root@localhost keepalived]# systemctl start keepalived
  • virtual _server 192.168.10.100 80: 虚拟服务器地址(VIP)、端口
  • delay_loop 15:健康检查的间隔时间(秒)
  • lb_algo rr:轮询(rr)调度算法
  • lb_kind DR:直接路由(DR)群集工作模式
  • #persistence 60:连接保持时间(秒),若启用请去掉#号
  • protocol TCP:应用服务采用的是 TCP 协议
  • real_server 192.168.10.103 80:第一个 Web 节点的地址、端口
  • weight 1:节点的权重
  • TCP_CHECK {:健康检查方式
  • connect_port 80:检查的目标端口
  • connect_timeout 3:连接超时(秒)
  • nb_get_retry 3:重试次数
  • delay_before_retry 4:重试间隔(秒)

keepalived02

cpp 复制代码
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# dnf -y install keepalived
[root@localhost ~]# dnf -y install keepalived ipvsadm
[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# cp keepalived.conf.sample keepalived.conf
[root@localhost keepalived]# vim keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.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
    interface ens160
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.172
    }
}

virtual_server 192.168.10.172 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP

    real_server 192.168.10.103 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.10.104 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

[root@localhost keepalived]# systemctl start keepalived

http1、2都是一样的

cpp 复制代码
[root@localhost ~]# ip addr add 192.168.10.172/32 dev lo label lo:0
[root@localhost ~]# nmcli c reload
[root@localhost ~]# nmcli c up lo
[root@localhost ~]# ip a
[root@localhost ~]# ip route add local 192.168.10.172/32 dev lo

可用可不用 静态路由
[root@localhost ~]# route add -host 192.168.10.172 dev lo
[root@localhost ~]# vim /etc/sysctl.conf 
添加
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

[root@localhost ~]# sysctl -p

测试

关闭一台keepalived再次测试 交替出现成功

相关推荐
路由侠内网穿透.1 天前
本地部署代码托管解决方案 Gitea 并实现外部访问( Windows 版本)
运维·服务器·网络协议·gitea
serve the people1 天前
python环境搭建 (十三) tenacity重试库
服务器·python·php
jake don1 天前
GPU服务器搭建大模型指南
服务器·人工智能
江畔何人初1 天前
pod的内部结构
linux·运维·云原生·容器·kubernetes
齐鲁大虾1 天前
Linux下用什么编程语言方便开发B/S架构程序
linux·运维·架构
范纹杉想快点毕业1 天前
状态机设计与嵌入式系统开发完整指南从面向过程到面向对象,从理论到实践的全面解析
linux·服务器·数据库·c++·算法·mongodb·mfc
三块钱07941 天前
群晖docker部署Mattermost,对接openclaw
运维·docker·容器
博客-小覃1 天前
内网穿透/端口映射之二层穿透访问”FTP共享文件“示例操作教程
运维·服务器·网络
珠海西格1 天前
光伏电站全景感知体系:数据采集与设备状态监测技术
大数据·运维·服务器·数据库·人工智能
大黄说说1 天前
深入理解 Linux 权限机制:文件、用户与访问控制全解析
linux·运维·服务器