LVS
Linux Virtual Server 传输层的包转发工具,通过VS对RS的调度实现负载均衡:
-
VS:Virtual Server(Director、Dispatcher、Balancer);
-
RS:Real Server(upstream server,backend server);
LVS工作在传输层,主要根据目标端口进行分发,相当于4层交换机,不受应用层套接字和端口的数量的限制,而是直接把报文转发给后端服务器,并发量极高。支持TCP、UPD、ESP、AH、SCTP等协议报文的转发。相同功能的模拟传输层进行任务调度的应用还用:nginx(stream)、haproxy(mod tcp)等。
相比较而言:
Nginx作为反向代理服务器实现负载均衡时工作应用层,因此只能模拟传输层进行任务调度,主要根据请求模型的分类进行分发,例如把SELECT语句分发至一台MySQL服务器,把php请求分发至fpm服务器等。这类应用层的均衡调度器主要有:nginx(upstream)、httpd(balance)、haproxy(mod http)、ats、perlbal、mysql-proxy等。
在与客户端通信的过程中常常涉及到会话追踪的需求,比如用户在不同的终端上完成的一次购物行为等待。但是http协议本身是无状态的,服务器与客户端如何实现会话追踪,尤其是集群服务如何实现Session保持成为一大问题。集群服务的Session保持方案主要由以下3种:
-
Session Stick:Source IP or Cookie实现在单台服务器时间最基本的Session保持;
-
Session replication:Session Cluster实现在多台服务器之间复制所有Session;
-
Session Server:由独立的Session服务器实现Session同步和共享;
LVS工作类型
LVS有两部分组成:ipvsadm/ipvs,分别是用户空间的规则定义和Real Server管理工具;内核空间的调度分发组件;
-
ipvsadm:用户空间的规则定义和Real Server管理工具;
-
ipvs:工作于内核空间的Netfilter的INPUT Function之上,请求报文经路由到达用户空间进程之前,ipvs改变了报文的流向直接转给POSTROUTING,并根据调度算法选择一个Real Server,并对请求报文做相应的修改之后转发给Real Server。Director与Real Server之间的packet-forwarding-method有4种:
-
lvs-nat:修改请求报文的目标IP,报文的收发都由Director完成
-
lvs-dr:封装新的MAC地址,响应报文有Real Server直接响应给客户端
-
lvs-tun:在原请求报文中新加一个IP首部,远程
-
lvs-fullnat:同时修改请求报文的源和目标IP
LVS NAT
多目标的DNAT,通过修改请求报文的目标IP地址和PORT实现以Director为网关的调度与分发,正是因为RS的网关为Director,所以无需修改源IP,且Director和RS必须通过交换机相连接。可概括为以下特点:
-
RIP和DIP属于同一网络,且使用私网地址,Real Server的网关必须指向DIP(保证响应报文经由Director);
-
请求和响应文本都经由Director;在高负载场景中,Director很可能成为系统性能瓶颈;
-
Director主机为Linux系统,Real Server可以是任意支持集群服务的OS;
-
支持端口映射;
LVS DR(默认)
Direct Routing 直接路由,对请求报文封装一个MAC地址,根据调度算法广播发送给其中一台Real Server,并且由Real Server直接响应客户端请求。可概括为以下特点:
-
Real Server的RIP可使用私网地址,也可使用公网地址,但Director与Real Server直接不能经过路由
-
Real Server与Directory通过物理交换机连接
-
请求报文经由DIrector,但响应不经由Director,而是由Real Server直接发往Client
-
不支持端口映射
Direct Routing带来的问题
每个Real Server与VS共用VIP才能实现Real Server直接响应Client,但是多块网卡共用VIP是不被允许的,可能会造成路由器把请求报文直接给Real Server而不经过Director调度。因此,Real Server必须把VIP隐藏起来,或者通过设定路由器策略及ARP广播策略,以实现只是Director接收请求以完成调度,且Real Server直接响应客户端的工作方式:
-
方案一:在前端网关做静态绑定,依赖于路由器设定,一般不可取
-
方式二:禁止广播,需arptables组件,较难适用
-
方式三:内核开启应答与通告级别(arp_annouce、arp_ignore)设定,避免内核使用不在对应网卡上的ip地址进行交叉通告,限制内核仅对对应接口的ARP请求做出响应,把VIP绑定在 lo 网卡上,达到隐藏的效果。这样在Director封装MAC后广播发送给Real Server,并且由Real Server解包的报文中目标地址VIP就可以被Real Server的lo网卡所绑定的VIP相对应,不至于被丢弃。Real Server发送报文时则先经过 lo 网卡转发至物理网卡再发送出去,原因是 Linux 内核会根据响应报文的源IP选择网卡,因此,回应报文必须先经过 lo 网卡,再由物理网卡发送。
限制响应模型的内核参数
-
arp_annouce:
0:默认值,把本机所有接口的所有信息向每个接口上的网络进行通告
1:尽量避免向非直接连接网络进行通告
2:必须避免向非本网络通告 -
arp_ignore:
0:默认值,内核使用任意地址响应网卡的
1:仅在请求的目标IP配置在本地主机的收到请求报文接口
LVS TUN
由于DR类型的Director与Real Server工作在同一物理网络上,而LVS TUN则针对Real Server工作在不同网络中的情况,利用IP隧道(把报文经公网IP再次封装)将请求报文送达至远程Real Server,并实现有Real Server直接响应客户端的一种LVS类型。
LVS TUN的转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在源IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文通过路由分发给Real Server。可概括为以下特点:
-
DIP,VIP,RIP都是公网地址(Director通过公网给Real Server分发请求);
-
Real Server的网关不能也不可能指向DIP(保证响应报文经由Director发出);
-
请求报文要经由Director,但响应报文不经由Director;
-
不支持端口映射;
-
Real Server的内核需支持隧道功能;
LVS FULLNAT
与 NAT 类型不同的是 FULLNAT 则是同时修改请求报文的源IP与目标IP,经过路由分发给RS,响应报文也经过路由到达Director再发出,为了实现路由,要把目标地址和源地址改成DIP与RIP。此外FULLNAT也支持端口映射,但需做内核修补,LVS默认不支持此模型。可概括为以下特点:
-
VIP是公网地址,RIP与DIP是私网地址,且通常不在同一网络,但必须能够路由
-
Director的VIP接收Client的CIP请求,但响应报文也需Director转发给Client的RIP;
-
Real Server收到请求报文源IP是Director的DIP(CIP –> DIP、VIP –> RIP),响应目标IP也是Director的DIP;
scheduling-method
ipvs的根据是否需要考虑Real Server的负载,可分为静态调度算法和动态调度算法;
ipvs默认采用WLC调度算法,是较好的一种调度算法。其既考虑到活动与非活动connection的比重,又考虑到Real Server本身性能的权重,是一种较为综合、均衡、通用的调度算法;
静态调度算法
仅根据算法本身,轮询Real Server分发请求;
-
RR(Roundrobin),自上而下轮询Real Server,逐一分发;
-
WRR(Weighted RR),根据Real Server的权重进行分发,能够分析一段时间内Real Server的处理能力对其进行加权;
-
SH(Source Hashing),对源IP地址hash,将来自同一IP地址的请求始终发往一台Real Server,实现
Session Stick
,其算法是基于WRR实现的;
此外,设置调度时的timeout
,也可实现类似的会话保持功能; -
DH(Destination Hashing),对目标IP地址hash,将发往同一目标地址的请求始终发送给一台Real Server,一般是缓存服务器,以负载均衡内网用户对外部服务器的请求;
动态调度算法
根据算法本身以及实时Real Server负载状态(Overhead
),分发给负载较小的Real Server;
-
LC(least connections),Overhead=activeconns*256+inactiveconns;
-
WLC(Weighted LC),默认调度算法,Overhead=(acriveconns*256+inactiveconns)/weight;考虑非活动连接的负载
-
SED(Shortest Expection Delay),最短期望延时,弱化非活动连接的负载,Overhead=(activeconns+1)*256/weight,活动连接相同(包括0个连接),优先分配给权重大的Real Server,但不公平,会导致权重小的Real Server空闲;
-
NQ(Never Queue),每台Real Server最少分发一个conn,再根据SED调度;
-
LBLC(Locality-Based LC),动态的DH算法,考虑Real Server的负载,但损失命中率;
-
LBLCR(LBLC with Replication),带复制功能的LBLC,在考虑Real Server负载的情况下,优先从另一Real Server中复制缓存;
CentOS 7 中的ipvs组件
RHEL 7系统的内核中默认已经编译了ipvs,可通过查看发行版编译内核时的config文件是否有相关选项:
grep -i -C 10 ipvs /boot/config-xxx.x86_64
# IPVS transport protocol load balancing support
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
# IPVS scheduler
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程序
yum -y install ipvsadm
rpm -ql ipvsadm
主要文件
Unit File:/usr/lib/systemd/system/ipvsadm.service
程序文件:/usr/sbin/ipvsadm
, /usr/sbin/ipvsadm-restore
,/usr/sbin/ipvsadm-save
ipvsadm命令
用法与iptables类似,可分为管理集群服务、管理Real Server、查看当前状态、规则保存等几个部分的命令选项。
使用ipvs应开启内核的ip_forward功能;
ipvs支持调度防火墙的MARK捆绑,可同时对一组或单个应用的设定集群服务;
ipvs有两种方式实现 Session 保持功能,原理是让客户端可以持续连接同一台Real Server;一种是设定默认为300s的persistent,另一种是使用SH调度算法;前一种可在任意一种调度算法上实现会话保持;such as SSL or FTP where it is important that clients consistently connect with the same real server.
ipvsadm -h
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe peReal Serveristence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
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] #清空packet, byte and rate counteReal Server
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
ipvsadm --stop-daemon state
ipvsadm -h
管理集群服务:
-
增加、修改Director及调度算法
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-
删除Director,关闭lvs:
ipvsadm -D -t|u|f service-address
-t|u|f service-address
-t:TCP协议的端口
-u:UDP协议的端口
-f:firewall MARK,通过防火墙对相同服务的不同端口标记为同一数字
管理Real Server
-
增加、修改Real Server及工作模型:
ipvsadm -a|e -t|u|f service-address -r server-address [options]
[options]:
lvs类型:
-g:gateway,dr类型
-l:ipip,tun类型
-m:masquerade,nat类型
权重:
-w weight,权重,wrr,wlc使用
-
删除Real Server:
ipvsadm -d -t|u|f service-address -r server-address
server-address:
RemotAddress[:port] #默认与请求服务的端口相同
#dr、tun不支持端口转发,nat、fullnat支持端口转发
查看状态
不反解的ip与端口、权重、活动连接、非活动连接、精确显示数值、当前的IPVS连接、统计数据、每秒连接数、接收、发送字节数等
ipvsadm -L|l [options]
--numeric,-n:numeric output of addresses and ports
--exact:expand numbeReal Server (display exact values)
--connection,-c:output of current IPVS connections
--stats:output of statistics information
--rate:output of rate information
清空内容
ipvsadm -C #清空所有集群服务的定义,造成集群服务立即断开
ipvsadm -Z [-t|u|f service-address] #清空单集群或所有集群的统计数据
保存和重载
ipvsadm -R #接收标准输入
ipvsadm -S [-n] #保存在/etc/sysconfig/ipvsadm 文件中
配置集群服务
man ipvsadm
通俗易懂的配置示例。主要配置两部分的规则:
集群服务 + Real Server的配置,配置前需要准备好以下几项条件:
-
同步时间:建立ntp服务器或使用chrony同步某一台主机的时间
vi /etc/chrony.con
#注释默认设置,修改为某一主机的地址
systemctl restart chronyd.service
chronyc sources
-
Director开启包转发功能:echo 1 > /proc/sys/net/ipv4/ip_forward
-
RS的默认网关指向要正确
-
lvs之前先测试每台Real Server提供的服务是否正常
NAT方法示例
可能用到的命令:
-
临时修改网卡地址:ifconfig eth0 IP/PRX up
-
增加默认路由:route add defaule GATEWAY
-
禁用某块网卡:ip link set down ethX
使用rr调度算法轮询RS
ipvsadm -A -t 10.1.253.29:80 -s rr
ipvsadm -a -t 10.1.253.29:80 -r 192.168.22.15 -m
ipvsadm -a -t 10.1.253.29:80 -r 192.168.22.16 -m
ipvsadm -Ln
for i in {1..5}; do curl http://10.1.253.29
#结果为交替响应
使用wrr调度算法静态加权轮询
ip -E -t 10.1.253.29:80 -s wrr
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.15 -m -w 1
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16 -m -w 1
for i in {1..5}; do curl http://10.1.253.29
#结果为rs1:rs2=2:1
使用sh调度算法实现持久连接
ip -E -t 10.1.253.29:80 -s sh
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16 -m -w 2
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16 -m -w 1
for i in {1..5}; do curl http://10.1.253.29
#结果为该客户端ip只由某一RS响应
使用wlc调度算法实现动态负载加权
ip -E -t 10.1.253.29:80 -s wlc
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16 -m -w 1
ipvsadm -e -t 10.1.253.29:80 -r 192.168.22.16 -m -w 1
#结果为2:1
DR方法示例
通用的Real Server配置
#
#Real Server
#
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_annouce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_annouce
ifconfig lo:0 10.1.253.11 netmask 255.255.255.255 broadcast 10.1.253.11 up
route add -host 10.1.253.11 dev lo:0
负载均衡http服务
#
#Director Server
#
ifconfig eno16777736:0 10.1.253.11 netmask 255.255.255.255 broadcast 10.1.253.11 up
ipvsadm -A -t 10.1.0.11:80 -s wlc
ipvsadm -a -t 10.1.0.11:80 -r 10.1.0.51 -g -w 1
ipvsadm -a -t 10.1.0.11:80 -r 10.1.0.69 -g -w 2
负载均衡mysql服务
ipvsadm -E -t 10.1.0.11:3306 -s wrr
ipvsadm -e -t 10.1.0.11:80 -r 10.1.0.51 -g -w 1
ipvsadm -e -t 10.1.0.11:80 -r 10.1.0.69 -g -w 2
负载均衡FWM捆绑的服务
FWM(FireWall Mark):借助防火墙标记分类报文,可将多个不同应用使用同一个集群服务jingx当做一类请求进行轮询
iptables -t mangle -A PREROUTING -p tcp -d 10.1.253.11 -m multiport --dports 80,443 -j MARK --set-mark 01
iptables -t mangle -vnL
ipvsadm -A -f 01 -s wrr
ipvsadm -a -f 01 -r 10.1.253.51 -g -w 1
ipvsadm -a -f 01 -r 10.1.253.69 -g -w 1
lvs persistence(持久连接)
lvs通过定义集群服务的persistent
时间实现持久连接,可在任一的调度算法中实现持久连接。其不同于SH算法,而是在timeout
时间内始终把同一客户端IP请求分发给某一Real Server。根据需求,LVS可实现以下3种类型的持久连接:
-
每端口持久:每集群服务单独定义,各自持久
-
每FWM持久:基于防火墙标记定义持久连接,可实现将多个端口上的应用统一调度,即所谓的port Affinity;
-
每客户端持久:基于
0端口
定义集群服务,将客户端对所有应用请求都调度至Real Server,且可使用持久连接进行Session绑定
#每端口持久
ipvsadm -A -t 10.1.253.11:80 -s rr -p 60
ip -a -t 10.1.253.11:80 -r 10.1.253.51-g -w 1
ip -a -t 10.1.253.11:80 -r 10.1.253.69-g -w 1
#每FWM持久
ipvsadm -A -f 01 -s rr -p 360
ip -a -t 10.1.253.11:80 -r 10.1.253.51-g -w 1
ip -a -t 10.1.253.11:80 -r 10.1.253.69-g -w 1
#每客户端持久
ipvs -A -t 10.1.253.11:0 -s wrr -p
ip -a -t 10.1.253.11:80 -r 10.1.253.51-g -w 1
ip -a -t 10.1.253.11:80 -r 10.1.253.69-g -w 1
规则保存与恢复
#获取帮助
man ipvsadm-save
cat /usr/lib/systemd/system/ipvsadm.service
#保持保存
ipvsadm -S > /etc/sysconfig/ipvsadm
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl stop ipvsadm.service #自动保存规则
#规则恢复
ipvsadm -R < /etc/sysconfig/ipvsadm
ipvsadm-restore < /etc/sysconfig/ipvsadm
systemctl start ipvsadm.service
附录
DR方法的Director配置脚本
#/bin/bash
#
#setting for the Director.
iface='eth0:0'
vip='10.1.253.11'
rs1='10.1.253.51'
rs2='10.1.253.69'
mask='255.255.255.255'
scheduler=$2
method='-g'
port='3306'
weight=$3
case $1 in
start)
ifconfig $iface $vip netmask $mask broadcast $vip up
iptables -F #don't compatibility with Netfilter
ipvsadm -A -t ${vip}:$port -s ${scheduler:=wlc}
ipvsadm -a -t ${vip}:$port -r ${rs1} $method -w ${weight:=1}
ipvsadm -a -t ${vip}:$port -r ${rs2} $method -w 1
;;
stop)
ipvsadm -C
ifconfig $iface down
;;
*)
echo "Usage $(basename $0) start|stop [scheduler] [weight]"
exit 1
;;
esac
运行帮助
[root@cent7]~>bash dr_vs.sh
Usage dr_vs.sh start|stop [scheduler] [weight]
DR方法的Real Server配置脚本
#!/bin/bash
#setting for real server.
vip='10.1.253.11'
mask='255.255.255.255'
case i 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
route add -host $vip dev lo:0
;;
stop)
ifconfig lo:0 down
route del -host $vip
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 "Usage start|stop"
;;
esac
原创文章,作者:helloc,如若转载,请注明出处:http://www.178linux.com/56303