Keepalived + LVS 搭建高可用负载均衡

发布时间 2023-06-20 03:40:47作者: 我的城市没有海

 

一、Keepalived简介

1、什么是keepalived?

Keepalived是用C语言编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础结构提供负载均衡高可用性的简单而强大的功能。

负载平衡框架依赖于提供第4层负载平衡的著名且广泛使用的Linux虚拟服务器(IPVS)内核模块。Keepalived实现了一组VIP功能,以根据其运行状况动态,自适应地维护和管理负载平衡的服务器池。

VRRP实现了高可用性 协议,VRRP是路由器故障转移的基础。

Keepalived 是一个基于 VRRP 协议来实现的服务高可用方案,可以利用其来避免 IP 单点故障,一般与其它负载均衡技术(如 LVS 、HAProxy 、Nginx)一起工作来达到集群的高可用。

 

2、keepalived原理介绍

VRRP (Virtual Router Redundancy Protocol,虚拟路由器冗余协议): 在现实的网络环境中,主机之间的通信都是通过配置静态路由(默认网关)完成的, 而主机之间的路由器一旦出现故障,通信就会失败,

因此,在这种通信模式中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了 VRRP 协议。

VRRP 可以将两台或多台物理路由器设备虚拟成一个虚拟路由器,每个虚拟路由器都有一个唯一标识,称为 VRID,一个 VRID 与一组 IP 地址构成了一个虚拟路由器。

这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务。而在虚拟路由器内部,同一时间只有一台物理路由器对外提供服务,这台物理路由器被称为主路由器(处于 MASTER 角色)。

而其他物理路由器不拥有对外的虚拟 IP,也不提供对外网络功能,仅仅接收 MASTER 的 VRRP 状态通告信息,这些路由器被统称为备份路由器(处于 BACKUP 角色)。

当主路由器失效时,处于 BACKUP 角色的备份路由器将重新进行选举,产生一个新的主路由器进入 MASTER 角色继续提供对外服务,整个切换过程对用户来说完全透明。

 

3、keepalive使用场景

  • LVS和keepalived可以说是天然的集成, 因为LVS已经集成到linux内核系统中,LVS+keepalived的集成,,只需要在keepalived的配置文件中增加配置就可以;

  • keepalive提供了主从切换的功能, 主从之间有心跳检测, 如果发现主从挂掉, keepalived会自动进行主从的切换;

  • 单体架构中, 我们最常使用lvs+keepalived的功能。

 

4、keepalive运行原理

keepalived 通过选举(看服务器设置的权重)挑选出一台热备服务器做 MASTER 机器,MASTER 机器会被分配到一个指定的虚拟 ip,即VIP,外部程序可通过该 VIP 访问这台服务器。

如果这台服务器出现故障(断网,重启,或者本机器上的 keepalived crash 等),keepalived 会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做 MASTER 并分配同样的虚拟 IP,充当前一台 MASTER 的角色。

权重越高,备用机器被拉起来的占比就越大,一般的主备就可以满足我们的需求。

 

5、keepalive选举策略

选举策略是根据 VRRP 协议,完全按照权重大小,权重最大的是 MASTER 机器,下面几种情况会触发选举:

  • keepalived 启动的时候

  • master 服务器出现故障(断网,重启,或者本机器上的 keepalived crash 等,而本机器上其他应用程序 crash 不算)

  • 有新的备份服务器加入且权重最大

 

6、keepalive状态监控和检测

Keepalived 工作在 TCP/IP 参考模型的第三、第四和第五层,也就是网络层、传输层和应用层。根据 TCP/IP 参考模型各层所能实现的功能,Keepalived运行机制如下:

  • 在网络层,运行着四个重要的协议:互连网协议 IP、互连网控制报文协议 ICMP、地址转换协议 ARP 以及反向地址转换协议 RARP。

        Keepalived 在网络层采 用的最常见的工作方式是通过ICMP协议向服务器集群中的每个节点发送一个 ICMP 的数据包(类似于 ping 实现的功能),

        如果某个节点没有返回响应数据包,那么 就认为此节点发生了故障,Keepalived 将报告此节点失效,并从服务器集群中剔除故障节点。

  • 在传输层,提供了两个主要的协议:传输控制协议 TCP 和用户数据协议 UDP。传输控制协议 TCP 可以提供可靠的数据传输服务,IP 地址和端口,代表一个 TCP 连接的 一个连接端。

        要获得 TCP 服务,须在发送机的一个端口上和接收机的一个端口上建立连接,而 Keepalived 在传输层就是利用 TCP 协议的端口连接和扫描技术来 判断集群节点是否正常的。

        比如,对于常见的 Web 服务默认的 80 端口、SSH 服务默认的 22 端口等,Keepalived 一旦在传输层探测到这些端口没有响应数据返回, 就认为这些端口发生异常,然后强制将此端口对应的节点从服务器集群组中移除。

  • 在应用层,可以运行 FTP、TELNET、SMTP、DNS 等各种不同类型的高层协议,Keepalived 的运行方式也更加全面化和复杂化,用户可以通过自定义 Keepalived 的工作方式,

        例如用户可以通过编写程序来运行 Keepalived,而 Keepalived 将根据用户的设定检测各种程序或服务是否允许正常,如果 Keepalived 的检测结果 与用户设定不一致时,Keepalived 将把对应的服务从服务器中移除。

 

二、LVS简介

1、什么是LVS?

LVS 是一个开源的软件,可以实现 LINUX 平台下的简单负载均衡。 LVS 是 Linux Virtual Server 的缩写,意思是 Linux 虚拟服务器。

LVS 已经集成到Linux内核系统中,ipvsadm 是 LVS 的命令行管理工具。目前有三种 IP 负载均衡技术( VS/NAT 、 VS/TUN 和 VS/DR );八种调度算法( rr,wrr,lc,wlc,lblc,lblcr,dh,sh )。

 

2、LVS 的组成

  • 负载均衡层(load balance): 位于整个集群的最前端,由一台或多台负载调度器(Director Server)组成。 其上安装了 LVS 的核心模块 IPVS,负责把用户请求分发给服务器群组层的应用服务器(Real Server),

                 同时还有监控模块(Ldirectord),用于监测各个 Real Server 服务的健康情况,当 real server 不可用时, 将其从路由表中剔除,待主机恢复后重新加入。

  • 服务器群组(Server Array): 由一组实际运行应用服务的主机组成。每个 Real Server 之间通过高速 LAN 相连。

  • 数据共享存储(Shared Storage): 为所有 Real Server 提供共享存储空间和内容一致性的存储区域,一般由磁盘阵列设备组成。

 

3、IPVS 简单介绍

IPVS: 安装于 Director Server 上,并在 Director Server 上虚拟出一个 VIP(Virtual IP)。 用户的访问请求通过 VIP 到达负载调度器,然后由负载调度器从 Real Server 列表中选取一个服务节点响应用户的请求。

IPVS 转发请求的 3 种方式:

  • VS/NAT(Virtual Server via Network Address Translation): 当用户请求到达调度器时,调度器将请求报文的目标地址和端口地址改写 成选定的 Real Server 的相应地址和端口,并将请求报文发送给选定的 Real Server。当 Real Server 返回数据时,还需要再次将报文的源地址和端口更改为 VIP 和相应的端口后,再发送给用户。 因为请求和响应报文都需要经过 Director Server 重写,所以当高并发时,调度器的处理能力将会成为瓶颈。

  • VS/TUN (Virtual Server via IP Tunneling): 也就是 IP 隧道技术实现虚拟服务器。调度器采用 IP 隧道技术将用户请求转发到某个 Real Server,而这个 Real Server 将直接响应用户的请求,不再经过前端调度器,此外,对 Real Server 的地域位置没有要求,可以和 Director Server 位于同一个网段,也可以是独立的一个网络。由于在 TUN 方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。

  • VS/DR(Virtual Server via Direct Routing): 也就是用直接路由技术实现虚拟服务器。VS/DR 通过改写请求报文的 MAC 地址,将请求发送到 Real Server,而 Real Server 将响应直接返回给客户,免去了 VS/TUN 中的 IP 隧道开销。这种方式是三种负载调度机制中性能最高、最好的,但是必须要求 Director Server 与 Real Server 都有一块网卡连在同一物理网段上。

 

IPVS 的负载调度算法:

上面我们谈到,负载调度器是根据各个服务器的负载情况,动态地选择一台 Real Server 响应用户请求,那么动态选择是如何实现呢,其实也就是我们这里要说的负载调度算法,

根据不同的网络服务需求和服务器配置,IPVS 实现了如下八种负载调度算法,这里我们详细讲述最常用的四种调度算法,剩余的四种调度算法请参考其它资料。

  • 轮询调度(Round Robin)

    “轮询”调度也叫1:1调度,调度器通过“轮询”调度算法将外部用户请求按顺序1:1的分配到集群中的每个 Real Server 上,这种算法平等地对待每一台 Real Server, 而不管服务器上实际的负载状况和连接状态。

  • 加权轮询调度(Weighted Round Robin)

    “加权轮询”调度算法是根据 Real Server 的不同处理能力来调度访问请求。可以对每台 Real Server 设置不同的调度权值,对于性能相对较好的 Real Server 可以设置较高的权值,而对于处理能力较弱的 Real Server,可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访问流量,充分合理的利用了服务器资源。 同时,调度器还可以自动查询 Real Server 的负载情况,并动态地调整其权值。

  • 最少链接调度(Least Connections)

    “最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。

  • 加权最少链接调度(Weighted Least Connections)

    “加权最少链接调度”,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态的设置相应的权值,缺省权值为1,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。

  • 其它四种调度算法分别为:

    • 基于局部性的最少链接(Locality-Based Least Connections)
    • 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
    • 目标地址散列(Destination Hashing)
    • 源地址散列(Source Hashing)
       

三、Keepalived+LVS搭建高可用负载均衡

测试环境

  • 系统环境:CentOS7
  • Keepalived+Lvs(MASTER):192.168.200.20
  • Keepalived+Lvs(BACKUP):192.168.200.21
  • Real Server1:192.168.200.22:80 Nginx
  • Real Server2:192.168.200.23:80 Nginx
  • VIP:192.168.200.24

架构图

 

配置 Keepalived+Lvs

在MASTER和BACKUP两台机器上安装ipvsadm keepalived

yum install ipvsadm keepalived -y

 配置keepalived和lvs

[root@lvskb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc        #报警接收人,多个写多行(需要开启本机的sendmail服务)
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc    #报警发件人
   smtp_server 127.0.0.1                  #发送email时使用的smtp服务器地址 
   smtp_connect_timeout 30                #smtp超时时间
   router_id lvs01            #表示运行keepalived服务器的一个标识,发邮件时显示在邮件主题的信息
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# Keepalived的VRRR 实例配置 vrrp_instance VI_1 { state MASTER                # 如果使用主/备,另外一台机器需要设置为BACKUP interface ens34              # 当前 IP 对应的网络接口,通过 ifconfig 查询 virtual_router_id 55           # 虚拟路由 ID(0-255),在一个 VRRP 实例中主备服务器 ID 必须一样(主备的虚拟机路由ID必须一致) priority 150                # 优先级值设定:MASTER 要比 BACKUP 的值大 advert_int 1                # VRRP Multicast广播周期秒数:单位秒,主备要一致 authentication {             # 认证机制,主从节点保持一致即可 auth_type PASS auth_pass 1111 } virtual_ipaddress {            # VIP,可配置多个(需换行填写) 192.168.200.24 } }
# 虚拟服务器(LVS)的配置,主要实现LVS的ip包转发功能 virtual_server 192.168.200.24 80 { delay_loop 3              # 设置健康状态检查时间(每隔3秒查询Real Server状态) lb_algo rr                # 调度算法,这里用了 rr 轮询算法 lb_kind DR                # 转发请求方式,这里用了 Direct Route 模式 persistence_timeout 50        # 持久连接超时时间(会话保持时间),这段时间内,同一ip发起的请求将被转发到同一个Real Server protocol TCP              # 用TCP协议检查Real Server状态   

  # 第一台Real Server物理环境 real_server 192.168.200.22 80 { weight 1            # 权重 TCP_CHECK {           # 健康检查 connect_timeout 10     # 无响应超时时间,单位是秒 delay_before_retry 3    # 重试次数(旧版本为 nb_get_retry ) retry 3            # 重试间隔 connect_port 80       # 端口 } }

# 第二台Real Server物理环境 real_server 192.168.200.23 80 { weight 1 TCP_CHECK { connect_timeout 10 delay_before_retry 3 retry 3 connect_port 80 } } }

 注:健康检查有多种检查方式,常见的有,HTTP_GET,SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK.

 

Keepalived+Lvs(BACKUP)节点

基本都和主一样,只需要修改几处:

state  BACKUP
priority  100
router_id  LVS02

 

在两台 Keepalived+Lvs 服务器上开启路由转发功能

# vim/etc/sysctl.conf
net.ipv4.ip_forward= 1
# sysctl-p

 配置完成后,分别重启 Keepalived 服务,并在防火墙开放相关服务

启动服务
systemctl start keepalived.service

设为开机自启
systemctl enable keepalived.service

防火墙开放相关服务
firewall-cmd --permanent --zone=public --add-protocol=vrrp
firewall-cmd --reload

 查看路由配置

[root@lvskb01 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  lvskb01:http rr persistent 50
  -> 192.168.200.22:http          Route   1      0          0
  -> 192.168.200.23:http          Route   1      0          0

 

配置 Real Server

在 Real Server 2台服务器的网卡上配置 lo 为 VIP。配置脚本如下

 

[root@nginxwb01 ~]# cat lvs-web.sh
#!/bin/bash
#Author:Mr.Ding
#Mail:1490176741@qq.com
#Created Time:2023-06-18 21:05:33
#Name:lvs-web.sh
#Description:
#Ver:
SNS_VIP=192.168.200.24
case "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_VIP dev lo:0
       echo "0" >/proc/sys/net/ipv4/ip_forward
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $SNS_VIP >/dev/null 2>&1
       echo "1" > /proc/sys/net/ipv4/ip_forward
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
exit 0

 

本地创建完后,并执行

[root@localhost ~]# chmod a+x lvs-web.sh
[root@localhost ~]# ./lvs-web.sh start

 配置完成后,通过 VIP 就可以访问到 Real Server 上的服务了

 

测试验证

配置完双机热备后,我们就可以测试下,节点发生故障后以及 LB 切换失败后,能否保证服务的 HA。

1、在 LB 的主节点上输入 ip a,可以看到 VIP 目前已经正确配置在网卡上。

 

输入 watch ipvsadm -Ln --stats 可实时看到负载均衡的结果,正常。

 

接下面我们试着访问一下 VIP

while true ; do curl 192.168.200.24; sleep 1;done

 

如果此时,手动停止 MASTER 上的 Keepalived,模拟 LB MASTER 节点挂了,VIP 会自动飘到 BACKUP LB 上。

 

 此时,如果重启 MASTER 后,VIP 又会飘回去。MASTER 的优先级高于 BACKUP,从而实现 HA。

 

命令说明

 查看日志信息:

tail-f /var/log/messages

 查看 LVS 当前设置:

watch ipvsadm -Ln

 查看转发情况:

watch ipvsadm -Lnc

 清除路由设置:

 

ipvsadm -C