LVS 集群基础


声明:本文为个人学习笔记,内容不保证完全正确,仅供参考。如有错误,可以的话麻烦提出,谢谢!


一、集群技术简介

集群简单点说就是让多台计算机协同完成一项任务。

集群具有两大作用,一是提高计算效率,二是避免单点故障。

与使用单个高端服务器相比,使用多个廉价服务器组成集群成本会低很多,而且能很好地避免单点故障。

下面简要介绍一下 LVS 集群的基本概念以及用法。


二、LVS 基础知识

2.1 LVS 简介

Linux 虚拟服务器(Linux Virtual Server,LVS)是由中国的章文蒿博士发明的一个虚拟服务器集群系统,现已被集成到 Linux 内核之中。它是完全开源的。

LVS 可以将一组服务器组成一个可伸缩、高可用的虚拟服务器。而且它对客户端是完全透明的。

2.2 LVS 结构

LVS 集群系统的结构如下图:

LVS 结构图

LVS 集群系统主要分为三大部分,下面简要介绍下。

  1. 负载均衡器:LVS 系统的前端,它负责维护一个虚拟 IP。当客户端访问这个虚拟 IP 的时候,负载均衡器会将请求通过特定的算法分配给不同的真实服务器来处理。为避免单点故障,通常需要两个负载均衡器做主从备份(LVS 本身并不支持该功能)。由于负载均衡器要处理客户端的所有请求,所以通常把性能较好的服务器当作负载均衡器。以下把负载均衡器称为 LD。
  2. 服务器群:一组真正执行客户端请求的服务器,负责处理客户端请求并返回结果。服务器群中服务器的数目是可以变化的。以下把真实服务器称为 RS。
  3. 共享存储池:为服务器群提供一个共享的存储空间,确保服务器群都能得到一致的数据并提供相同的服务。共享存储池一般使用网络文件系统或者分布式文件系统。

2.3 LVS 的三种工作模式

2.3.1 NAT 模式(VS/NAT)

当客户端通过 VIP 访问网络服务时,LD 通过特定算法从服务器池中选出一台 RS,然后将请求报文的目标地址改为 RS 的 IP 地址并转发;当收到 RS 的响应时,则将响应报文的源地址改为 VIP 并转发。如图所示:

NAT 结构图

由于客户端的请求报文和 RS 的响应报文都必须经过 LD,所以 NAT 模式对 LD 的性能要求较高,LD 很可能成为瓶颈。而且 NAT 模式下需要把 RS 的默认网关改成 LD 的地址,整个集群系统也必须位于同一个网段内,限制比较多,一般不用。

2.3.2 隧道模式(VS/TUN)

当客户端通过 VIP 访问网络服务时,负载均衡器通过特定算法从服务器池中选出一台 RS,然后将请求报文通过一条 IP 隧道转发给一台 RS;RS 可以将响应报文直接发送给客户端。如图所示:

TUN 结构图

在 TUN 模式下,LD 只需要处理请求报文而不需要处理响应报文,而一般场景下服务器的响应报文比请求报文多得多,因此整个集群系统的性能以及吞吐量都有了明显的提升。而且 TUN 模式还支持跨网段、跨地域部署,十分方便。

2.3.3 直接路由模式(VS/DR)

当客户端通过 VIP 访问网络服务时,LD 通过特定算法从服务器池中选出一台 RS,然后将请求报文的目的 MAC 地址改为 RS 的 MAC 地址并转发;RS 可以将响应报文直接发送给客户端。如图所示:

DR 结构图

由于 DR 模式没有了 IP 隧道的开销,所以它是效率最高的模式。但是由于该模式修改的是报文的 MAC 地址,所以要求整个集群系统要在同一个 VLAN 内,灵活性不如 TUN 模式好。不过大多数时候集群服务器都在同一个机房内,所以 DR 模式的应用是最广泛的。

2.4 LVS 的十种调度算法

说明

可能是最后两种调度算法用的比较少,所以只找到了一种版本的中文解释,我就直接引用了。

2.4.1 轮询(RR)

把客户端的请求按顺序轮流分配到各个 RS 上,不理会 RS 的负载情况。

2.4.2 加权轮询(WRR)

根据各个 RS 处理能力的不同动态调整各个 RS 的权重,可以让处理能力强的服务器分配到更多的请求,有着较强的灵活性。

2.4.3 最少连接(LC)

把客户端的请求分配到当前已建立连接数最小的 RS 上,不理会 RS 的负载情况。

2.4.4 加权最少连接(WLC)

根据各个 RS 处理能力的不同动态调整各个 RS 的权重,然后把客户端的请求优先分配到连接数少且权重较大的 RS 上。

2.4.5 基于局部最小连接(LBLC)

根据客户端请求的目标 IP 地址找出该目标 IP 地址最近使用的 RS。如果该 RS 可用且未超载,则将请求分配到该 RS 上;否则使用 LC 算法分配到另外的 RS 上。该算法主要用于缓存集群,可提高缓存命中率。

2.4.6 带复制的基于局部最小连接(LBLCR)

与 LBLC 不同的是,该算法需要维护一个目标 IP 到一组 RS 的映射。根据客户端请求的目标 IP 地址找出该目标 IP 地址最近使用的 RS 组,再通过 LC 算法选择该组中的一台 RS。如果该 RS 可用且未超载,则将请求分配到该 RS 上;否则使用 LC 算法从所有 RS 中选择一台 RS 加入到该组中,并把请求分配到新加入的 RS 上。如果该 RS 组在一段时间内没有变化,则最忙的 RS 将被踢出该组。该算法主要用于缓存集群,可提高缓存命中率。

2.4.7 源地址散列(SH)

把客户端请求的源 IP 地址作为散列键,从静态分配的散列表中找出对应的 RS。若该 RS 是可用的且未超载,则将请求分配到该 RS 上;否则返回空。

2.4.8 目的地址散列(DH)

把客户端请求的目的 IP 地址作为散列键,从静态分配的散列表中找出对应的 RS。若该 RS 是可用的且未超载,则将请求分配到该 RS 上;否则返回空。

2.4.9 最短预计延时(SED)

基于 WLC 算法。举例说明:
A、B、C 三台服务器的权重分别是 1、2、3 ,连接数也分别是 1、2、3。那么如果使用 WLC 算法的话一个新请求进入时它可能会分给 A、B、C 中的任意一个。使用 SED 算法后会进行这样一个运算
A:(1+1)/1
B:(1+2)/2
C:(1+3)/3
根据运算结果,把请求分配到 C。

2.4.10 不排队(NQ)

无需队列。如果有台服务器的连接数为零就直接分配过去,不需要再进行 SED 运算。


三、LVS 的简单应用

3.1 实验目的 & 环境

搭建一个 LVS 的 Web 集群,使用一个 LD 和三个 RS。要求客户端访问 VIP 时,三个 RS 轮流提供服务。不使用共享存储池。

所有设备均为配置相同的虚拟机,且系统均为全新安装的。

  • 客户端 IP:10.0.0.1
  • VIP:10.0.0.200
  • LD IP:10.0.0.101
  • RS IP:10.0.0.102-104
  • 操作系统:均为 CentOS 7.4.1708 最小安装(已关闭 SELinux 和防火墙)
  • LVS 模式:DR

3.2 LD 的配置

3.2.1 安装 LVS 管理软件

yum -y install ipvsadm

说明

ipvsadm 的操作逻辑跟 iptables 很接近。

3.2.2 配置虚拟服务器

ipvsadm -A -t 10.0.0.200:80 -s rr

选项说明

  • -A:添加一台虚拟服务器。
  • -t:使用 TCP 协议。
  • 10.0.0.200:80:VIP 和端口号。
  • -s rr:使用轮询调度算法。

3.2.3 添加 RS

ipvsadm -a -t 10.0.0.200:80 -r 10.0.0.102:80 -g
ipvsadm -a -t 10.0.0.200:80 -r 10.0.0.103:80 -g
ipvsadm -a -t 10.0.0.200:80 -r 10.0.0.104:80 -g

选项说明

  • -a:添加一台 RS。
  • -t:使用 TCP 协议。
  • 10.0.0.200:80:指定 VIP 和端口号。
  • -r 10.0.0.10{2,3,4}:80:指定 RS 的 IP 和端口号。
  • -g:使用 DR 模式。

3.2.4 检查 ipvsadm 配置

ipvsadm -l -n

选项说明

  • -l:列出 ipvsadm 配置。
  • -n:不解析 IP 地址。

如果出现以下结果,说明配置正确。

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.200:80 rr
  -> 10.0.0.102:80                Route   1      0          0       
  -> 10.0.0.103:80                Route   1      0          0       
  -> 10.0.0.104:80                Route   1      0          0    

3.2.5 设置 VIP

ip addr add 10.0.0.200/32 dev lo

3.2.6 开启 IP 转发

echo 1 > /proc/sys/net/ipv4/ip_forward

3.3 RS 的配置

说明

本节的步骤需要在所有 RS 上执行。

3.3.1 安装 Nginx

yum -y install nginx

3.3.2 添加网页识别信息

请把下面的 xxx 改为 RS 的 IP 地址然后再执行。

echo "This is xxx." > /usr/share/nginx/html/index.html

3.3.3 设置 VIP

ip addr add 10.0.0.200/32 dev lo

3.3.4 调整 ARP 参数

如果不进行设置,就会有多台机器发出 VIP 的 ARP 回应,造成网关的 ARP 表混乱。

echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce

3.3.5 启动 Nginx

systemctl start nginx

3.4 测试

在客户端上反复执行以下命令:

curl 10.0.0.200

如果可以接收到各个 RS 交替的回应信息(如下结果),说明配置成功。

This is 10.0.0.104
This is 10.0.0.103
This is 10.0.0.102
This is 10.0.0.104
This is 10.0.0.103
This is 10.0.0.102
...

四、LVS + Keepalived 高可用集群的简单配置

4.1 Keepalived 简介

由于 LVS 本身并不提供任何冗余功能,所以仅用它无法搭建起一个健壮的集群系统。

而 Keepalived 正好可以弥补 LVS 的缺陷。

Keepalived 最大的作用就是防止 LD 的单点故障。它使用 VRRP(虚拟路由冗余协议)来检测 LD 的状态。当主 LD 宕机时,备 LD 可以立即接管服务。

此外,它还可以自动检测 RS 的状态,当 RS 宕机时,会把宕机的 RS 从 RS 列表中踢出,以免影响正常服务。待 RS 恢复后又会自动添加回来。

还有,用 Keepalived 来配置 LVS 非常简单,方便性甩 ipvsadm 几条街!

所以,我推荐大家使用 Keepalived 来配置 LVS,哪怕只有一个 LD。

4.2 实验目的 & 环境

搭建一个高可用的 LVS Web 集群,使用两个 LD 和两个 RS。要求客户端访问 VIP 时,两个 RS 轮流提供服务。而且当一个 LD 宕机时,另一个 LD 可以立即接管服务。不使用共享存储池。

所有设备均为配置相同的虚拟机,且系统均为全新安装的。

  • 客户端 IP:10.0.0.1
  • VIP:10.0.0.200
  • 主 LD IP:10.0.0.101
  • 备 LD IP:10.0.0.102
  • RS IP:10.0.0.103-104
  • 操作系统:均为 CentOS 7.4.1708 最小安装(已关闭 SELinux 和防火墙)
  • LVS 模式:DR

4.3 LD 的配置

说明

本节的步骤需要在所有 LD 上执行,在修改配置文件的时候请注意区分主备 LD。

4.3.1 安装 Keepalived

yum -y install keepalived

4.3.2 修改 Keepalived 配置文件

请使用 vim 之类的文本编辑器打开 /etc/keepalived/keepalived.conf,清空已有的内容,然后根据以下模版及注释提示修改此文件。修改之后记得保存文件。

! Configuration File for keepalived

global_defs {   #全局配置
   router_id LVS_DEVEL  #机器标识
}

vrrp_instance VI_1 {    #VRRP组
    state MASTER    #主备模式(主机设置为MASTER,备机设置为BACKUP)
    interface ens33 #网络接口(按实际情况修改)
    virtual_router_id 51    #VRRP ID,主备机必须相同
    priority 100    #优先级(越大越优先,主机要比备机大)
    advert_int 1    #VPPR通告时间(秒)
    authentication {    #认证方式(主备机必须相同)
        auth_type PASS  #明文密码认证
        auth_pass 1111  #密码
    }
    virtual_ipaddress { #虚拟IP组
        10.0.0.200  #虚拟IP(一行一个)
    }
}

virtual_server 10.0.0.200 80 {  #虚拟服务器配置
    delay_loop 6    #健康检查间隔(秒)
    lb_algo rr  #LVS调度模式
    lb_kind DR  #LVS工作模式
    nat_mask 255.255.255.0 #VIP子网掩码(在DR或NAT模式下RS需要与LD在同一子网中)
    persistence_timeout 50  #会话保持时间(秒)
    protocol TCP    #使用TCP协议

    real_server 10.0.0.103 80 { #真实服务器配置
        weight 1    #权重
        TCP_CHECK { #在线检查设置
            connect_timeout 5   #连接超时时间
            nb_get_retry 3  #重试次数
            delay_before_retry 3    #重试连接延迟(秒)
            connect_port 80 #连接端口
        }
    }

    real_server 10.0.0.104 80 { #同上
        weight 1
        TCP_CHECK {
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

4.3.3 开启 IP 转发

echo 1 > /proc/sys/net/ipv4/ip_forward

4.3.4 启动 Keepalived 服务

systemctl start keepalived

4.4 RS 的配置

与 3.3 完全相同,这里省略。

4.5 测试

正常情况下,在主 LD 上执行 ip addr show 命令,可以看到 VIP 地址;而在备 LD 上执行则看不到。然后关闭主 LD,在备 LD 上执行就可以看到了。VIP 在集群中任何正常的服务器上都可以 Ping 通。

在客户端上反复执行 curl 10.0.0.200,在约 50 秒内会显示相同的 IP 地址,而过了 50 秒就会显示另一个 IP 地址。这是由于设置了 LVS 会话保持引起的,一个客户端在一段时间之内的所有请求会固定分配到一个 RS 上。


五、参考文献

  1. LVS 官方文档库
  2. 51CTO – 集群入门浅析—LVS
  3. 简书 – LVS负载均衡
  4. LVS中文站点 – LVS的调度算法简介
  5. CSDN – LVS DR模式中arp_ignore和arp_announce的作用解释
  6. Keepalived 官方说明 – Keepalived for LVS User Guide
  7. ITeye – LVS+Keepalived负载均衡安装配置笔记
  8. 51CTO – 最详细的keepalived+lvs-dr配置文档

发表评论

电子邮件地址不会被公开。