lvs负载均衡集群
集群的概念
Cluster:一个计算集合,为解决某个特定问题组合起来
Linux clustrt主要有三种类型:
LB:load balancing,负载均衡
HA:high availiablity,高可用
HP:high performance,高性能
负载均衡
负载均衡(Load Balance)通过对服务请求的调度,以实现提高服务的并发处理能力。
负载均衡集群的前端使用一个调度器,将客户端请求按照算法调度分配到后端的服务器中,同时调度器可能还具有后端服务器状态检测的功能,将故障的服务器自动下线,使得集群具有一定的容错能力。
负载均衡实现的方法
软件上的负载
按照网络协议工作层的分类,可以分为两种
1.四层负载:对工作在osi四层的请求进行调度,tcp/udp属于此类
2.七层负载:对工作的osi七层的请求进行调度,也就是大家熟知的httpd请求调度
硬件上的负载
通常使用的就是F5,能对四七层进行调度。属于硬件方面的调度。
软件调度的主要软件及对应使用场景
1.lvs
lvs由之前在淘宝工作的章文嵩所编写,其主要基于对tcp进行调度。基于vrrp协议转发,根据请求报文的目标ip和目标协议及端口将其调试转发至某RealServer,挑选RealServer将根据调试方法实现,一般用于千万级别pv的调度。
lvs工作模式与iptables类似,工作在四层空间,通过对INPUT请求进行修改,以实现调度
2.haproxy
可以基于四层负载,也可以基于七层负载。相比lvs,能支持session的转发。
3.nginx
nginx相比于lvs与haproxy,只能基于七层的http进行调度(nginx 1.10版本之后已经支持四层负载),负载功能约为一万左右的并发调度。
lvs集群
LVS集群类型:主要有四种:
lvs-nat
lvs-dr
lvs-tun
lvs-fullnat
同时依据其调度方法,可分为静态和动态:
根据其调度时是否考虑各RS当前的负载状态,可分为静态方法和动态方法
静态方法:仅根据算法本身进行调度,注重起点公平
RR:roundrobin,轮询
WRR:Weighted RR,加权轮询
SH:Source Hashing,源地址哈希,实现会话绑定
DH:Destination Hashing,目标地址哈希,经常用在正向代理中
动态方法:主要根据每RS当前的负载状态进行调试,注重结果公平
LC:least connetions,最少连接
overhead=activeconns*256+inactiveconns
WLC:Weighted LC,加权最少连接
overhead=(activeconns*256+inactiveconns)/weight
SED:shorstest expection delay,最短期望延迟;
overhead=(activeconns+1)*256/weight
NQ:never queue,改进的SED算法,请求进入时每个RS先分配一个再使用SED算法
LBLC:locality-based least connections基于本地的最少连接;动态的DH算法
LBLCR:LBLC with replication
lvs中常用术语
CIP:Client IP
VIP:Virtual Server IP
DIP:Director IP
RIP:Real Server IP
lvs-nat:
其结构模型如下:
当CIP访问时VIP时,通过VIP的路由转发至DIP,再经过NAT调度,分配到后面的RIP上,RIP响应报文后,再经由DIP转发至VIP,最后响应CIP。
在lvs-nat模型下,整个报文进出均需要通过director,所以director很容易成为瓶颈。
lvs-nat特点:
多目标IP的NDAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
1)RIP和DIP必须要同一ip网段(要确保响应报文经由dirctor,同时完成nat序列包的转换),且应该使用私网地址;
RS的网关指向DIP,VIP如果与DIP在同一主机,则必须不能在同一网段,否则无法通过路由转发进行request调度
2)请求报文和响应报文都必须经由Dirctor转发;Director易成为系统瓶颈
3)支持端口映射;VIP上的端口和RIP上的端口不必非得是同一个
4)vs必须是linux系统,rs可以是任意系统
实验过程如下:
配置环境:
VIP:172.16.45:31
DIP:192.168.45.200
RIP1:192.168.45.11:8080
RIP2:192.168.45.22:80
设置如下:
在director主机(原ip地址为172.16.45.31)上新增加一块网卡,并设置ip地址
ip addr add 192.168.45.200 dev eno33554984
ifconfig eno33554984 up
ifconfig –a
打开director主机路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
在Real Server上面设置好ip及gateway指向,gateway指向必须为director主机
Real Server IP必须与director主机在同一网段。
同时director主机上面DIP与VIP必须不能在同一网段,否则director不能进行路由转发,同时也就无法实现crul request调度
在生产环境中,VIP必须为公网IP
设置结果:
RIP1地址为192.168.45.11,端口为8080
RIP2地址为192.168.45.22,端口为80
在director主机上面增加集群服务
ipvsadm -A -t 172.16.45.31:80 -s wrr //设置调试方式为wrr,设置目标为VIP
ipvsadm –Ln
增加Real Server
ipvsadm -a -t 172.16.45.31:80 -r 192.168.45.11:8080 -m -w 1
增加格式为:ipvsadm –a –t VIP –r RIP –m –w 1
ipvsadm -a -t 172.16.45.31:80 -r 192.168.45.22:80 -m -w 2
CIP访问调试结果如下:可以看出request调度通过weighted roundrobin方式,同时支持端口映射,访问的端口为80,可以映射到Real Server1的8080上面
[root@chunlanyy ~]# for i in {1..10};do curl http://172.16.45.31/;done
<h1>Real Server 1 ,the ip is 172.16.45.22</h1>
<h1>Real Server 2 ,the ip is 172.16.45.33</h1>
<h1>Real Server 2 ,the ip is 172.16.45.33</h1>
<h1>Real Server 1 ,the ip is 172.16.45.22</h1>
<h1>Real Server 2 ,the ip is 172.16.45.33</h1>
<h1>Real Server 2 ,the ip is 172.16.45.33</h1>
<h1>Real Server 1 ,the ip is 172.16.45.22</h1>
<h1>Real Server 2 ,the ip is 172.16.45.33</h1>
<h1>Real Server 2 ,the ip is 172.16.45.33</h1>
<h1>Real Server 1 ,the ip is 172.16.45.22</h1>
Lvs-dr:
其结构模型如下:
lvs-dr解决了lvs-nat模型中director容易成为瓶颈的问题。在lvs-dr中,director与real server在同一网络,且两者配有相同的VIP地址,director只负责调度,real server负责直接响应CIP的请求报文,响应报文不再经同director,故能提高director的并发性。
CIP请求到达directorr的VIP后(通过arp控制,不会送达到real server上),director将报文的源MAC地址和目标MAC地址进行重装封装,然后再调度分配给real server,此时报文的源ip和目标ip均未修改,故real server将通过自己的VIP地址直接响应给CIP,无需要再经由director
Director与real server在同一网络,且有着相同的VIP地址,故为解决ip冲突的问题,可以使用三种方法
1)确保前端路由器将目标IP为VIP的请求报文发往Director;
a)在前端路由器绑定
b)在RS使用arptables
c)在RS上修改内核参数限制通知及应答级别
arp_announce
arp_ignore
在此即通过在内核进行修改:
[root@chunlanyy ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@chunlanyy ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@chunlanyy ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@chunlanyy ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
我们会在lo上进行设置VIP,故通过禁止lo的通知和应答,故可以勉强同一网络下的ip冲突问题
arp_announce:定义了网卡在向外宣告自己的MAC-IP时候的限制级别
arp_ignore:定义了网卡在响应外部ARP请求时候的响应级别
对于ignore和announcer的各项值,相关官方说明:
arp_annouce:Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface;
0 - (default) Use any local address, configured on any interface.
//0:默认,把本机所有接口的信息向每个接口上的网络通知
1 - Try to avoid local addresses that are not in the target's subnet for this interface.
// 1:尽量改名向非本网络通告
2 - Always use the best local address for this target.
// 2:必须避免向非本网络通告
arp_ignore: Define different modes for sending replies in response to received ARP requests that resolve local target IP address.
0 - (default): reply for any local target IP address, configured on any interface.
//0:使用本地任意接口上配置的地址进行响应;
1 - reply only if the target IP address is local address configured on the incoming interface.
// 1:仅在请求的目标IP配置在本地主机的接收报文接口上时,才给予响应
配置环境:
DIP:172.16.45.31
VIP:72.16.45.25
RIP1:172.16.45.32
RIP2:172.16.45.33
配置director主机上面VIP与DIP地址。
主机默认ip为172.16.45.31,然后再添加 VIP即可
ifconfig eno16777736:0 172.16.45.25 netmask 255.255.255.255 broadcast 172.16.45.25 up
ifconfig即可查看新加入的地址
同时在两台real server上设置VIP地址,两台real server原始地址分别172.16.45.32,172.16.45.33
为方便执行,引用以下脚本,在两台real server上分别执行即可
[root@chunlanyy ~]# cat lvs-dr.sh
#!/bin/bash
#
vip=172.16.45.25
mask=255.255.255.255
case $1 in
start)
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
ifconfig lo:0 $vip netmask $mask broadcast $vip up
;;
stop)
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "please input start|stop"
;;
Esac
运行脚本后即完成lvs-dr的配置
在director主机上进行lvs-dr集群的设置
ipvsadm -A -t 172.16.45.25:80 -s rr
ipvsadm -a -t 172.16.45.25:80 -r 172.16.45.32 -g -w 2
ipvsadm -a -t 172.16.45.25:80 -r 172.16.45.33 -g -w 1
ipvsadm –Ln
通过其它CIP访问集群VIP地址即可
[root@localhost ~]# for i in {1..10};do curl http://172.16.45.25;done
<h1>Real Server2,the ip is 172.16.45.33</h1>
<h1>Real Server1,the ip is 172.16.45.32</h1>
<h1>Real Server2,the ip is 172.16.45.33</h1>
<h1>Real Server1,the ip is 172.16.45.32</h1>
<h1>Real Server2,the ip is 172.16.45.33</h1>
<h1>Real Server1,the ip is 172.16.45.32</h1>
<h1>Real Server2,the ip is 172.16.45.33</h1>
<h1>Real Server1,the ip is 172.16.45.32</h1>
<h1>Real Server2,the ip is 172.16.45.33</h1>
<h1>Real Server1,the ip is 172.16.45.32</h1>
lvs-tun:
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS
1)DIP,VIP,RIP应该都是公网地址
2)RS网关必须不可能指向DIP
3)请求报文经由Director,但响应不能经由Director,而是直接发往CIP
4)不支持端口映射
5)RS必须支持隧道功能
lvs-tun 的特性:
集群节点和可以跨越 Internet
RIP,DIP,VIP 都是公网地址
Director 仅负责处理入站请求,响应报文由 Realserver 直接发往客户端
Realserver 使用自己的网关而不是 Director
Realserver 只能使用支持隧道功能的操作系统
不支持端口映射
lvs-fullnat
系统默认不支持lvs-fullnat,使用这种模式需要单独对内核进行加补丁
lvs-fullnat是通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP-->DIP
VIP-->RIP
lvs-fullnat的特性
1)VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;
2)RS收到的请求报文源地址为DIP,因响应给DIP即可
3)请求和响应报文都经由Directory
4)支持端口映射