LVS集群


一、LVS集群介绍

LVS(linux virtual server)即linux虚拟服务器,由章文嵩博士主导开发的开源负载均衡项目,从2.6内核开始已经被集成到linux内核模块中了,该项目在linux内核中实现了基于IP的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台web服务器,如果后端的所有web服务器存储的内容时相同的,那么用户不管访问哪台真实的web服务器得到的内容也都是相同的,所以整个集群对于用户而言是透明的。最后根据工作模式不同,真实服务器会选择不同的方式将用户需要的数据发送给终端用户。

image20200204132829832.png

1.1、LVS的四种模式

  • NAT模式
    • 客户端请求和响应都经过负载均衡器,通过地址转换实现负载均衡。
  • DR直连路由
    • 客户端请求直接路由到后端服务器,响应也直接返回客户端,负载均衡器仅负责转发请求。
  • TUN隧道模式
    • 客户端请求通过隧道传输到后端服务器,响应直接返回客户端,减轻负载均衡器压力。
  • FULLNAT完全NAT模式(基于NAT实现,LVS 本身不支持,需要额外对内核打补丁后才能使用。)
    • 通过双重地址转换实现负载均衡,客户端和后端服务器双向请求都经过负载均衡器。
    • 提供了跨网段负载均衡功能。

1.2、LVS负载均衡调度算法

分发算法介绍 分发算法其实就是分发器如何将用户请求分发给数据服务器,让数据服务器来处理。比如:

幼儿园里老师分苹果

  • 老师就是分发器:他来决定给小朋友们如何发苹果
  • 苹果就是用户请求
  • 小朋友就是数据服务器,负责来处理苹果

根据前面的介绍,我们了解了LVS的四种模式,但是不管使用哪种模式,调度器进行调度的策略与算法都是LVS的核心技术,LVS在内核中主要实现了八种调度算法

轮询-rr

调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

加权轮询-wrr

调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

最小连接-lc

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

加权最小连接-wlc

在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

基于局部的最小连接-lblc

基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接” 的原则选出一个可用的服务器,将请求发送到该服务器。

带复制的基于局部性最少链接-lblcr

带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标 IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

目标地址散列-dh

目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

源地址散列-sh

源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

一般情况 rr wrr lc wlc适用于静态网站,lblc sh dh适用于动态网站

1.3、常用缩写解释

名称 含义
LB(Load Balancer) 负载均衡
HA(High Available) 高可用
Cluster 集群
DS(Director Server) 前端负载均衡节点服务器
RS(Real SERVER) 后端真实服务器
CIP(Client IP) 客户端IP地址
VIP(Virtual IP) 负载均衡对外提供访问的IP地址,一般负载均衡IP都会通过Viirtual IP实现高可用
RIP(RealServer IP) 负载均衡后端的真实服务器IP地址
DIP(Director IP) 主要用于和内部主机通讯的 IP 地址

二、集群部署工具-ipvsadm介绍

LVS已经集成在linux内核模块中,但整个LVS环境又分为内核层与用户层,内核层负责核心算法的实现,用户层需要安装ipvsadm工作,通过命令将管理员需要的工作模式与实现算法传递给内核来实现。

# yum install ipvsadm -y
# 或者
# apt install ipvsadm -y
# 查看是否在内核中
lsmod |grep ip_vs 

# 如果不在使用modprobe添加
modprobe ip_vs

# 如果编译lvs,需要使用内核,先查看内核版本
uname -r
3.10.0-1160.114.2.el7.x86_64

yum install kernel-devel -y
# 链接内核
ln -s /usr/src/kernels/3.10.0-1160.114.2.el7.x86_64 /usr/src/linux

ls -l /usr/src/
总用量 0
drwxr-xr-x. 2 root root   6 4  11 2018 debug
drwxr-xr-x. 5 root root 113 4   2 08:16 kernels
lrwxrwxrwx  1 root root  45 4   4 18:12 linux -> /usr/src/kernels/3.10.0-1160.114.2.el7.x86_64

安装完成之后会生成一个同名的命令工具,我们需要使用该命令来配置LVS和算法

用法
ipvsadm     选项  服务器地址   -s  算法
ipvsadm     选项  服务器地址   -r  真是服务器地址     [工作模式]  [权重]
选项
-A      添加一个虚拟服务器
-E      编辑一个虚拟服务器
-D      删除一个虚拟服务器
-C      清空虚拟服务器列表
-R      从标准输入中还原虚拟服务器规则
-S      将虚拟服务器规则保存至标准输出
-a      添加一个真实服务器
-e      编辑一个真实服务器
-d      删除一个真实服务器
-l/L    查看分发列表
-t      使用tcp协议
-u      使用udp协议
-s      指定算法
-r      设置真实服务器的IP地址和端口信息
-g      DR模式
-i      tun模式
-m      nat模式
-w      设置真实服务器的权重
-c      查看连接状态,需要配合L使用
-n      以数字形式输出


# 比如,添加一个虚拟服务器,算法为rr,所有使用tcp协议访问192.168.1.100:80的请求,最终都被NAT模式转发给了192.168.2.210和2.220的80端口
[root@zuolaoshi ~]# ipvsadm -A -t 192.168.1.100:80 -s rr
[root@zuolaoshi ~]# ipvsadm -a -t 192.168.1.100:80 -r 192.168.2.210:80 -m
[root@zuolaoshi ~]# ipvsadm -a -t 192.168.1.100:80 -r 192.168.2.220:80 -m

# 查看规则
[root@zuolaoshi ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  localhost.localdomain:http rr
  -> 192.168.2.210:http           Masq    1      0          0         
  -> 192.168.2.220:http           Masq    1      0          0         
[root@zuolaoshi ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.100:80 rr
  -> 192.168.2.210:80             Masq    1      0          0         
  -> 192.168.2.220:80             Masq    1      0          0         


# 查看调度状态
[root@zuolaoshi ~]# ipvsadm -lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 00:20  TIME_WAIT   192.168.1.100:36916 192.168.1.100:80   192.168.2.220:80
TCP 01:09  TIME_WAIT   192.168.1.100:36922 192.168.1.100:80   192.168.2.210:80
TCP 00:20  TIME_WAIT   192.168.1.100:36918 192.168.1.100:80   192.168.2.210:80
TCP 00:25  TIME_WAIT   192.168.1.100:36920 192.168.1.100:80   192.168.2.220:80
TCP 01:40  TIME_WAIT   192.168.1.100:36924 192.168.1.100:80   192.168.2.220:80
TCP 14:57  ESTABLISHED 192.168.1.100:36926 192.168.1.100:80   192.168.2.210:80

# 删除真实服务器
[root@zuolaoshi ~]# ipvsadm -d -t 192.168.1.100:80 -r 192.168.2.220
[root@zuolaoshi ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.100:80 rr
  -> 192.168.2.210:80             Masq    1      0          2         

备份规则
[root@zuolaoshi ~]# ipvsadm -S > /tmp/ipvs.bak
清空规则
[root@zuolaoshi ~]# ipvsadm -C
还原规则
[root@zuolaoshi ~]# ipvsadm -R < /tmp/ipvs.bak
修改算法
[root@zuolaoshi ~]# ipvsadm -E -t 192.168.1.100:80 -s wrr