浅谈Linux Virtual Server
❎ 集群的概念
1️⃣ 系统性能扩展方式:
- Scale UP:垂直扩展,向上扩展,增强,性能更强的计算机运行同样的服务
- Scale Out:水平扩展,向外扩展,增加设备,并行地运行多个服务调度分配问题,
- 集群(Cluster)即是向外扩展思路的体现
- 垂直扩展不再提及:
随着计算机性能的增长,其价格会成倍增长
单台计算机的性能是有上限的,不可能无限制地垂直扩展
2️⃣ 集群的概念和分类
- Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统
▶1 Linux Cluster类型
-
LB(Load Balancing):负载均衡
-
HA(High Availiablity):高可用
- SPOF(Single Point Of Failure):单点失败,必须尽可能消灭出现单点失败的环节
- MTBF(MeanTime Between Failure):平均无故障时间
- MTTR(MeanTime To Restoration/Repair):平均恢复前时间,即故障修复时间
- A=MTBF/(MTBF+MTTR)
取值范围(0,1):99%, 99.5%, 99.9%, 99.99%, 99.999%, 99.9999%,生产环境要求99.999%以上,即一年内故障时间不超过0.001%(约5分钟)
-
HPC(High-performance computing):高性能,超级计算机
▶2 Cluster按照实现分类
-
硬件
F5 Big-IP
Citrix Netscaler
A10 A10 -
软件
lvs:Linux Virtual Server
nginx:支持四层调度
haproxy:支持四层调度
▶3 Cluster基于工作协议层次分类
-
传输层(通用):基于IP地址与端口DPORT
LVS:
nginx:stream
haproxy:mode tcp -
应用层(专用):针对特定协议,自定义的请求模型分类
也称作代理服务器(proxy server)
http:nginx, httpd, haproxy(mode http), …
fastcgi:nginx, httpd, …
mysql:mysql-proxy, …
3️⃣ 负载均衡下实现会话保持
-
http协议是无状态的,cookie和session机制实现会话保持
-
在负载均衡模式下,相同客户端的前后连接可能被分配给不同的服务器提供服务,需要有相关技术解决会话保持问题
-
三种解决技术:
- session sticky:同一用户调度固定服务器
Source IP:LVS sh算法(对某一特定服务而言)
Cookie - session replication:每台服务器拥有全部session
session multicast cluster - session server:专门的session服务器
Memcached, Redis
- session sticky:同一用户调度固定服务器
❎ Linux Virtual Server简介
1️⃣ LVS介绍
-
LVS(Linux Virtual Server):负载调度器,集成内核
-
工作原理:VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS
-
LVS集群类型中的术语:
VS:Virtual Server,又称Director, Dispatcher(调度器), Load Balancer
RS:Real Server(lvs), upstream server(nginx), backend server(haproxy)
CIP:Client IP
VIP:Virtual server IP,LVS外网的IP
DIP:Director IP,LVS内网的IP
RIP:Real server IP
- 访问流程:CIP <–> VIP == DIP <–> RIP
- LVS集群类型
- lvs-nat:修改请求报文的目标IP,即多目标IP的DNAT
- lvs-dr:操纵封装新的MAC地址
- lvs-tun:在原请求IP报文之外新加一个IP首部
- lvs-fullnat:修改请求报文的源和目标IP
2️⃣ LVS-NAT模式
实现原理
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为VS调度的RS的RIP和PORT实现转发
特点
- RIP和DIP建议在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP
- 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
- 支持端口映射,可修改请求报文的目标PORT
- VS必须是Linux系统,RS可以是任意OS系统
3️⃣ LVS-DR(Direct Routing)模式
▶1 LVS-DR实现原理
- 通过为请求报文重新封装一个MAC首部进行转发
- 源MAC是DIP所在的接口的MAC,目标MAC是VS调度的RS的RIP所在接口的MAC地址
- 源IP/PORT,以及目标IP/PORT均保持不变
▶2 LVS-DR模式特点
- 直接路由,LVS默认模式,应用最广泛
- Director和各RS都配置有VIP
- 源IP/PORT以及目标IP/PORT均保持不变
- RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
- RS和Director要在同一个物理网络
- 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
- 不支持端口映射(端口不能修改)
- RS可使用大多数OS系统
▶3 LVS-DR调度条件
-
通过RS目标MAC实现调度的条件:防止IP地址冲突
-
有以下三种方法
- Director上静态绑定VIP和RS的MAC地址
- 在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
- 在RS上修改内核参数以限制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
-
流程原理图
4️⃣ LVS-TUN模式
▶ 实现原理:
- 不修改请求报文的IP首部(源IP为CIP,目标IP为VIP)
- 而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;
- RS直接响应给客户端(源IP是VIP,目标IP是CIP)
▶ LVS-TUN模式特点:
- DIP, VIP, RIP都应该是公网地址
- RS的网关不能,也不可能指向DIP
- 请求报文要经由Director,但响应不能经由Director
- 不支持端口映射
- RS的OS须支持隧道功能
- 流程原理
5️⃣ LVS-FULLNAT模式
▶ 实现原理:
- 通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --> DIP
VIP --> RIP
▶ LVS-FULLNAT模式特点:
- VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
- RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
- 请求和响应报文都经由Director
- 支持端口映射;
- 注意:此类型kernel默认不支持
- 流程原理图
6️⃣ LVS四种模式异同
-
lvs-nat与lvs-fullnat:请求和响应报文都经由Director
lvs-nat:RIP的网关要指向DIP
lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信 -
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
7️⃣ LVS 调度算法
- 根据调度时是否考虑各RS当前的负载状态,分为静态方法和动态方法
🌐 静态算法(四种)
只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况
▶ RR:轮叫调度(Round Robin)
调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
▶ WRR:加权轮叫(Weight RR)
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
▶ DH:目标地址散列调度(Destination Hash )
根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
▶ SH:源地址 hash(Source Hash)
源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
🌐 动态算法(六种)
前端的调度器会根据后端真实服务器的实际连接情况来分配请求
▶ LC:最少链接(Least Connections)
调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
▶ WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
▶ SED:最短延迟调度(Shortest Expected Delay )
在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权
,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。
▶ NQ永不排队/最少队列调度(Never Queue Scheduling NQ)
无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。
▶ LBLC:基于局部性的最少链接(locality-Based Least Connections)
基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
▶ LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)
带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统
。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
❎ LVS 相关软件
1️⃣ 程序包:ipvsadm
- ipvsadm:集群服务管理和集群服务的RS管理工具
- Unit File: ipvsadm.service
- 主程序:/usr/sbin/ipvsadm
- 规则保存工具:/usr/sbin/ipvsadm-save
- 规则重载工具:/usr/sbin/ipvsadm-restore
- 配置文件:/etc/sysconfig/ipvsadm-config
2️⃣ ipvsadm管理集群服务
ipvsadm命令
-
增、改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-
删除
ipvsadm -D -t|u|f service-address
-
-t|u|f service-address
- service-address:VIP:PORT
-t:TCP协议的端口,VIP:TCP_PORT
-u:UDP协议的端口,VIP:UDP_PORT
-f:firewall MARK,标记,一个数字
[-s scheduler]:指定集群的调度算法,默认为wlc
- service-address:VIP:PORT
-
ipvsadm工具示例用法
# 管理集群服务
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
[--pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address #删除
ipvsadm –C #清空
ipvsadm –R #重载
ipvsadm -S [-n] #保存
3️⃣ ipvsadm管理集群上的RS
ipvsadm命令:
-
增、改
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-
删除
ipvsadm -d -t|u|f service-address -r server-address
-
-t| u | f VIP:PORT -r RIP:PORT,省略PORT则为不做端口映射
-
lvs类型:
-g:gateway,dr类型,默认
-i:ipip,tun类型
-m:masquerade,nat类型 -
-w weight:权重
4️⃣ FWM(FireWall Mark)
- FWM的功能:分类报文并基于标记定义集群服务;实现多个不同的应用使用同一个集群服务进行调度
- 基于iptables的mangle表来实现
- MARK target 可用于给特定的报文打标记
--set-mark value
- 其中:value 可为0xffff格式,表示十六进制数
- 实现方法:
- 在Director主机打标记
iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $port1,$port2,… -j MARK --set-mark NUMBER
- 在Director主机基于标记定义集群服务
ipvsadm -A -f NUMBER [options]
- –set-mark NUMBER:NUMBER为16进制数
- 在Director主机打标记
- 示例
[root@lvs ~]#ipvsadm -A -f 10
[root@lvs ~]#ipvsadm -a -f 10 -r 192.168.39.17 -g
[root@lvs ~]#ipvsadm -a -f 10 -r 192.168.39.7 -g
[root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 wlc
-> 192.168.39.7:0 Route 1 0 0
-> 192.168.39.17:0 Route 1 0 0
5️⃣ LVS 持久连接
-
session 绑定:对共享同一组RS的多个集群服务,需要统一进行绑定,lvs sh算法无法实现
-
持久连接(lvs persistence)模板:实现无论使用任何调度算法,在一段时间内(默认360s),能够实现将来自同一个地址的请求始终发往同一个RS
ipvsadm -A|E -t|u|f service-address [-s scheduler] -p [timeout]
-
持久连接实现方式:
- 每端口持久(PPC):每个端口对应定义为一个集群服务,每集群服务单独调度
- 每防火墙标记持久(PFWMC):基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity
- 每客户端持久(PCC):基于0端口(表示所有服务)定义集群服务,即将客户端对所有应用的请求都调度至后端主机,必须定义为持久模式(基本不用,会开放主机全部端口)
-
示例
[root@lvs ~]#ipvsadm -E -f 10 -p
[root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 wlc persistent 360
-> 192.168.39.7:0 Route 1 0 15
-> 192.168.39.17:0 Route 1 0 7
[root@lvs ~]#ipvsadm -E -f 10 -p 3600
[root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 wlc persistent 3600
-> 192.168.39.7:0 Route 1 0 79
-> 192.168.39.17:0 Route 1 0 7
6️⃣ 其他ipvsadm命令
清空定义的所有内容:ipvsadm -C
清空计数器:ipvsadm -Z [-t|u|f service-address]
查看:ipvsadm -L|l [options]
--numeric, -n:以数字形式输出地址和端口号
--exact:扩展信息,精确值
--connection,-c:当前IPVS连接输出
--stats:统计信息
--rate :输出速率信息
查看当前内存中ipvs规则:/proc/net/ip_vs
查看当前内存中ipvs连接:/proc/net/ip_vs_conn
7️⃣ 保存及重载规则
- 保存:建议保存至/etc/sysconfig/ipvsadm
ipvsadm-save > /PATH/TO/IPVSADM_FILE
ipvsadm -S > /PATH/TO/IPVSADM_FILE
systemctl stop ipvsadm.service
- 重载:
ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
ipvsadm -R < /PATH/FROM/IPVSADM_FILE
/ 上述两条命令一个意思
systemctl restart ipvsadm.service