lvs简介
lvs基础原理及实现
Linux Cluster:
Cluster:计算机集合,为解决某个特定问题组合起来形成的单个系统
LB:Load Balancing,负载均衡
HA: High Availiablity,高可用
HP:High Performance,高性能
lvs集群的类型:
lvs-nat(network address translation)
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和port实现转发
- RIP和DIP必须在同一个IP网络,且应该使用私网地址;
- 请求报文和响应报文都必须经过由Director转发,Director易于成为系统瓶颈
- 支持端口映射,可修改请求报文的目标port
- vs必须是linxu系统,rs可以是任意系统
- 发送的包 cip/vip --> vs cip/rip 返回的包 rip/cip --> vs vip/cip 支持端口映射
lvs-dr(direcrot routing直接路由)
Director Routing:直接路由: //后端主机,改IP后不做通告,也不arp请求响应
通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
- 确保前端路由器将目标IP为VIP的请求报文发往Director
- 在RS上修改内核参数以限制arp通告及应答级别
- arp_announce 限制通告级别
- arp_ignore 限制应答级别
- arp_announce 限制通告级别
- RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
- RS跟Director要在同一个物理网络
- 请求报文要经由Director,但响应报文不能经由Director,而是由RS直接发往Client
- 不支持端口映射
lvs-tun
转发方式 :不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
[CIP/VIP] ---> director ---> [DIP/RIP[CIP/VIP]] ---> RIP ---> [VIP|CIP]
- DIP,VIP,RIP都应该是公网地址
- RS的网关不能,也不可能指向DIP
- 请求报文要经由Director,但响应不能经由Director
- 不支持端口映射
- RS的OS得支持隧道功能
- 有可能会出现世型针,超过MTU1500,同时RIP主机得要支持隧道技术,RIP在接收到请求报文的时候会拆开包看到里面还有一个IP首部(CIP-->VIP),但是一看vip在自己主机上,就接收报文发往用户进程处理,并从vip地址上发送给CIP,也就不用经由Director
lvs-tun
通过同时修改请求报文的源IP地址和目标IP地址进行转发
- VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络,因此,RIP的网关一般不会指向DIP
- RS收到的请求报文源地址是DIP,因此,只能响应给DIP,但是Director不宁将其发往Client
- 请求和响应报文都经由Director
- 支持端口映射
此类开型默认不支持,需要手动编译安装
LVS的调试算法 Scheduler
- rr: Round Robin 轮询,按照顺序依次重复轮询
缺陷:
每台服务器工作性能可能有差异,应该能者多劳,轮询没法达到此效。
session无法保持,用户第一次请求时发往A服务器,第二次请求发往B服务器,这两个不同的会话,客户端第一次请求操作是在购物车添加商品,第二次请求轮询至另一台,则第一次添加的商品会丢失,这是客户不可忍受的(此时需要依赖于session保持机制)
- wrr: Weighted RR 按照服务器权重轮询
通过给RS设定权重,一般性能高的RS权重设置大,按照权重的算法依次轮询转发
- sh: Source Hashing 源地址哈希
客户端的首次请求按照其他算法选择RS,后续请求只要是源地址相同都发往同一台RS,这样一定程度上解决了session保持问题。但是又引出情人眼里出西施下问题:
缺陷:
现今多数用户都通过snat方式访问互联网,如一个上百台主机的局域网环境,都指向同一个网关,所以对DR而言,源地址都是同一个,实际上是来自不同的客户端的请求,这些请求都将被 发往同一台RS处理,严重损害了负载均衡的效果
- dh: Destination Hashing 目标地址哈希
此算法一般在有多个防火墙时的场景下应用,在防火墙基于状态追踪的机制下,保证响应报文能够通过同一防火墙发送出去
动态算法: 根据算法及各RS当前负载状态进行调度
- LC:least connect 最少连接 //当计算结果相同时,就按照“自上而下”的轮询方式进行选择
- WLC: Weight LC 加权最少连接数(少者胜出)
当计算结果相同时,自上而下选择,一般首次所有RS都先轮询一遍,每个都处理一个请求,以免权重小的术轻松了。第二轮开始权重才开始发挥效果,但是第一次响应的有可能是性能最差的服务器
- SED:shortest Expections Delay (Overhead=(activeconns+1)*256/weight)最短期望延迟
改进版的WLC,这种算法保证了是有权重最高的RS首先响应服务,而非初始计算值都是相同的造成轮询,但是会造成权重大的RS过多的负载,而权重小的RS过于空闲
- NQ: SED 的增强版,避免了,权重过大的服务器过于繁忙,而权重过小的过于空闲,也就是一开始全都轮询一遍,然后在开启SED算法来选择。
- LBLC: Locality-based Least Connection
相当于DH+LC,基于局部性的最少连接算法是针对请求报文的目标IP地址的负载均衡调度,主要用于Cache集群系统,因为Cache集群中客户请求报文的布标IP地址是变化的,这里假设任何后端服务器都可以处理任何请求,算法的设计目标在服务器的负载基本平衡的情况下,将相同的目标IP地址的请求调度到同一个台服务器,来提高个太服务器的访问局部性和主存Cache命中率,从而调整整个集群系统的处理能力。 基于局部性的最少连接调度算法根据请求的目标IP地址找出该目标IP地址最近使用的RealServer,若该Real Server是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
- LBLCR:Replicated adn Locality-based Connection
带复制的基于局部性最少链接调度算法也是针对目标IP地址的负载均衡,该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度
静态方法:仅根据算法本身进行调度,不考虑RS负载状态
- rr: Round Robin 轮询,按照顺序依次重复轮询
如今centos6/7的版本上已经自动的编译了ipvs,但是可以确定一下://如果没有显示的话,就要自己重新编译内核
[root@localhost ~]# grep -i -C 10 'ipvs' /boot/config-3.10.0-327.el7.x86_64 # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y # IPVS scheduler
//lvs支持的10种算法
CONFIG_IP_VS_RR=m CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m CONFIG_IP_VS_WLC=m CONFIG_IP_VS_LBLC=m CONFIG_IP_VS_LBLCR=m CONFIG_IP_VS_DH=m CONFIG_IP_VS_SH=m CONFIG_IP_VS_SED=m CONFIG_IP_VS_NQ=m- ipvsadm是一款用于操控内核的应用软件,在base源好像就有:
管理集群服务
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]A:添加 E:修改 t:tcp u:udp f:firewall server-address:VIP -s:调试算法 -p:持久连接功能
ipvsadm -D -t|u|f service-address //删除 ipvsadm -C //清空 ipvsadm -R < /etc/sysconfig/ipvsadm //载入规则 ipvsadm -S [-n] //保存规则管理集群服务中的RS
ipvsadm -a|e -t|u|f service-address -r server-address [options] //添加 ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address] lvs-nat配置实例:
Director CR1 CR2 VIP:172.168.254.35 CIP:192.168.153.143 CIP:192.168.153.144 DIP:192.168.153.139 Director
~]# yum install ipvsadm ~]# ipvsadm -A -t 172.16.254.35:80 -s rr ~]# ipvsadm -a -t 172.16.254.35:80 -r 192.168.153.143 -g ~]# ipvsadm -a -t 172.16.254.35:80 -r 192.168.153.143 -g ~]# sysctl -w net.ipv4.ip_forward=1 ~]# sysctl -pCR1
~]# yum install httpd ~]# echo 143 > /var/www/html/index.html ~]# systemctl start httpd ~]# ip route add default via 192.168.153.139CR2
~]# yum install httpd ~]# echo 144 > /var/www/html/index.html ~]# systemctl start httpd ~]# ip route add default via 192.168.153.139打开一个客户端,访问一下,试试,可不可以轮询
[root@localhost ~]# for((i=1;i<=10;i++));do curl 172.16.254.35 ;done 143 144 143 144 143 144 143 144 143 144
lvs-dr配置实例:
Director CR1 CR2 VIP:172.168.254.36 CIP:172.16.252.113 CIP:172.16.250.84 DIP:172.16.254.35 arp_ignore:定义响应级别,响应时忽略方式,1表示只从本接口进入的请求响应,且本接口地址是个网络地址
arp_annouce:定义通告级别,2表示仅使用定义的网卡接口在同网络内通信
Director:
~]# ip addr add 172.16.254.36 dev eth0:0 ~]# yum install ipvsadm ~]# ipvsadm -A -t 172.16.254.36:80 -s rr ~]# ipvsadm -a -t 172.16.254.36:80 -r 172.16.252.113 -g ~]# ipvsadm -a -t 172.16.254.36:80 -r 172.16.250.84 -g ~]# for((i=1;i<=10;i++));do curl 172.16.254.36;done 113 84 113 84 113 84 113 84 113 84
FWM防火墙标记功能
功能:防火墙标记可以实现多个集群服务绑定为同一个,实现统一调度;将共享一组RS的集群服务统一进行定义。
在PREROUTING链上打标,在INPUT链上把打标记的请求来做成集群
~]# iptables -t mangle -A PREROUTING -d 172.16.254.36 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 2 ~]# ipvsadm -A -f 2 -s rr -p 60 //在一定时间内,将同一个ip地址的请求发往同一个RS ~]# ipvsadm -a -f 2 -r 172.16.252.113 -g -w 1 ~]# ipvsadm -a -f 2 -r 172.16.250.84 -g -w 3 ~]# ipvsadm-save > /etc/sysconfig/ipvsadm ~]# iptables-save > /etc/sysconfig/iptable
~]# ipvsadm -A -t 172.16.254.36:0 -s rr //默认所有的服务全都调度给后端服务器,所以不常用