LVS概述
1.LVS:Linux Virtual Server全称叫做linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。四层路由器(交换),根据请求报文的目标IP和目标协议及端口将其调度转发至后端主机集群中的某台RealServer(真实服务器),根据调度算法来挑选RS;
主要有两个组件
VS: Virtual Server 虚拟服务器 RS: Real Server 真实服务器
2、lvs: 由ipvsadm/ipvs两部分组成
ipvsadm: 工作与用户空间的命令行工具,规则管理器,用于管理集群服务及RealServer(真实服务器); ipvs: 工作于内核空间的netfilter的INPUT钩子之上的框架;其集群功能依赖于ipvsadm定义的集群服务器规则; 工作模式:通过更改目标IP的方式或直接再次封装报文的mac地址的方式或者在网络层首部之外再此封装一个网络层首部(双ip首部及ipip隧道), 强行改变本该发往本机内部的报文,转而发往后方Real server主机,支持基于TCP、UDP、SCTP、AH、EST、AH_EST等协议的众多服务;
3、lvs集群类型中的术语:
vs:Virtual Server;虚拟服务,可称为Director、Dispatcher分发器、Balancer负载均衡器 rs:Real Server;真实服务器,可称为upstream server上游服务器, backend server后端主机 CIP:Client IP;客户端IP RIP:Real Server IP;真实服务器IP VIP: Virtual serve IP;等同于FIP(流动IP),负载均衡器虚拟IP DIP:Director IP;调度IP(第二张网卡IP地址) 真正的通信是; CIP <--> VIP 之间进行通信 DIP <--> RIP 之间进行通信
4、负载均衡集群中设计时的要点
1)session保持 session sticky (iphash):IP地址绑定,来源IP记录在ip hash表作统一调度 session cluster(multicast/broadcast/unicast):广播集群同步(复制)session,只适用于小规模场景 session server ():session服务器 2)数据共享(提供一致性存储) 1) 共享存储; NAS:Network Attached Storage (文件级别),网络附加存储,文件服务器 SAN:Storage Area Network (块级别),存储区域网络 DS:Distributed Storage,分布式春初 2) 数据同步:rsync … ...
lvs集群的类型:
1、lvs-nat:地址伪装模型
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发; 客户端主机发起请求报文CIP指向VIP,通过内核的核心网卡间转发功能,VIP会将请求交给DIP进行调度, DIP根据设定的算法进行负载均衡给后端的RS主机的RIP,在这个过程中DIP调度功能会将目标IP地址重写为RIP。 请求和返回请求读要调度DIP来进行转换操作。 须知: (1)RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP; (2)请求报文和响应报文都必须经由Director转发;Director易于成为系统瓶颈; (3)支持端口映射,可修改请求报文的目标PORT; (4)vs必须是Linux系统,rs可以是任意系统;
2、lvs-dr:
(direct routing直接路由):网关模型 通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变; 客户端发起请求,经过层层路由到达离VS服务器最近的交换机,通过交换机转发给VS服务器,此时因为每个RS真实主机的LO本地回环接口上都写了VIP地址,并且通过修改内核参数的操作禁止内核的arp请求响应级别和修改自己向外通告的模式,Real server主机不会相应arp请求。所有请求就会到达VS服务器并且由VS服务器负载均衡转发请求给RS服务器。在此过程中VIP修改MAC地址调度请求给真实主机。在此过程中通过ARP协议在一个局域网中广播寻找真实主机的MAC地址。实现全过程源地址为CIP,并且强行限制RS主机的响应报文必须经过LO以此实现目标地址为VIP不变。调度基于寻找MAC。网关模型中的所有主机均要能与外网通信。这样RS主机就能够直接响应客户机。 须知:Director和各RS都得配置使用VIP; (1) 确保前端路由器将目标IP为VIP的请求报文发往Director: 解决方案: (a) 在前端网关做静态绑定; (b) 在RS上使用arptables; (c) 在RS上修改内核参数以禁止RS响应VIP的ARP请求; 1) 修改各RS的内核参数,并把VIP配置在特定的接口上实现禁止其响应; arp_announce arp_ignore (2) RS的RIP可以使用私网地址,也可以是公网地址; RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director; (3) RS跟Director要在同一个物理网络; (4) 不支持端口映射; (5) RS的OS得支持隧道功能; (6) 各RS可以使用大多数的操作系统;
3、lvs-tun:在原请求IP报文之外新加一个IP首部;ipip隧道
转发方式: 不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS; 须知: (1) DIP, VIP, RIP都应该是公网地址; (2) RS的网关不能,也不可能指向DIP; (3) 请求报文要经由Director,但响应不能经由Director; (4) 不支持端口映射; (5) RS的OS得支持隧道功能;
4、lvs-fullnat:修改请求报文的源和目标IP完成转发;
通过同时修改请求报文的源IP地址(cip-->dip)和目标IP地址(vip--> rip)实现转发; 须知: (1) VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP; (2) RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client; (3) 请求和响应报文都经由Director; (4) 支持端口映射;
注意:
前三种为标准类型,第四种为后添加类型,内核默认可能不支持,需自编译内核
LVS scheduler调度算法
根据其调度时是否考虑各RS当前的负载状态,可分为静态方法和动态方法两种: 静态方法:仅根据算法本身进行调度; RR:roundrobin,轮询;依次分配请求,方式简单但时负载均衡的效果一般 WRR:Weighted RR,加权轮询;权重越大承担负载越大 SH:Source Hashing,实现session sticy,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定; 缺点:调度力度大,对负载均衡效果差;session黏性不同,连接时长保持不同 DH:Destination Hashing;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS;能实现连接追踪,但不考虑负载均衡效果 动态方法:主要根据每RS当前的负载状态及调度算法进行调度; Overhead:负载值,VS转发时记录每个RS的Active和Inactive数量(甚至权重)进行算法计算 Active:活动链接值,当发起新请求后保持在ESTABLISHED状态时,仍有请求响应 Inactive:非活动链接值,在ESTABLISHED状态时,尚未断开保持空闲等待状态 LC:least connections;最少连接 Overhead=activeconns*256+inactiveconns 后端的RS谁的连接少就分发请求至那台RS,若overhead一样则自上而下轮询列表中的RS WLC:Weighted LC;加权最小连接 Overhead=(activeconns*256+inactiveconns)/weight,计算结果小的将为选中的下一跳RS服务器 缺点:当Overhead一样时,自上而下轮询响应,权重小的若在列表上方则其会响应 SED:Shortest Expection Delay;最短期望延迟 Overhead=(activeconns+1)*256/weight 缺点:解决WLC问题,但时无法确保权重小的主机一定响应 NQ:Never Queue;永不排队,SED算法改进 RS权重大小排列,每台RS服务器先分配一个请求,其余的按照权重大小计算分配 LBLC:Locality-Based LC; 基于本地的最少连接,动态的 DH连接算法 LBLCR:LBLC with Replication; 带复制功能的LBLC
ipvs:
ipvs:工作在内核级别的,适用于服务器应用级别的服务器,如centos;查看是否已经编译进的方法如下; ~]# grep -i -C 10 "ipvs" /boot/config-3.10.0-327.el7.x86_64 支持的协议:TCP, UDP, AH, ESP, AH_ESP, SCTP; ipvs集群定义:两个级别的定义 1)集群服务 2)服务上的RS
ipvsadm命令:
1、管理集群服务:增、改、删;
增、改: ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] 删: ipvsadm -D -t|u|f service-address -A:添加、-E:修改、-D:删除 service-address:服务地址和 -t|u|f 结合使用,具体格式如下 -t|u|f: -t, tcp, vip:port ; TCP的ip和port -u, udp, vip:port ; UDP的ip和port -f:firewall MARK ; 是一个数字;防火墙标记 [-s scheduler]:指定集群的调度算法,默认为wlc; -p [timeout] :超出时长,持久连接相关,默认时长为300秒
2、管理集群上的RS:增、改、删;
增、改: 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 -a:添加一个RS、-e:修改一个RS、-d:删除一个RS server-address指的是rip[:port],端口可省表示与之前的service-address相同,只有nat模式支持端口映射才会使用 选项: lvs类型: -g: gateway(默认), dr类型 -i: ipip, lvs-tun隧道类型 -m: masquerade, lvs-nat类型 -w weight:权重;
3、查看:
ipvsadm -L|l [options] --numeric, -n:数字格式显示地址和端口; --exact:精确值,不经过单位换算的数值 --connection, -c:显示ipvs连接; --stats:显示统计数据; --rate :速率
4、保存和重载:
ipvsadm -S = ipvsadm-save ipvsadm -R = ipvsadm-restore
5、计数器清零:
pvsadm -Z [-t|u|f service-address]
6、清空定义的所有内容:
ipvsadm -C
lvs-nat模型构建
1、lvs-nat模型示意图
本次构建的lvs-nat模型的示意图如下,其中所有的服务器和测试客户端均使用VMware虚拟机模拟,所使用的CentOS 7
VS内核都支持ipvs功能,且安装ipvsadm控制书写lvs规则工具。
RS端两台服务器为httpd服务器做请求的负载均衡。
2、VS网卡配置
1、在"虚拟机设置"中增加一个网络适配器设备,并将其自定义特定网络为VMnet1模式,此处为了模拟负载均衡服务器的两张网卡处于不同网段
2、配置VS两张网卡的IP地址
网络适配器1(10.1.19.11)模拟为外网网卡,网络适配器2(192.168.25.135)模拟为内网,且该网卡的Ip地址要和RS服务器得ip在同一网段,DIP作为RIP的网络调度(网关),无需配置GATEWAY
3、RS网卡配置
此处使用两台CentOS 7虚拟机作为负载均衡后端真实响应主机,安装RPM包格式httpd服务,并启动服务。nmtui命令配置网卡信息,RS1的IP:192.168.25.129,RS2的IP:192.168.25.130,RIP和DIP在同一网段,虚拟机网卡和DIP同时匹配值为VMnet1模式,且两台RS服务器主机网关指向DIP:192.168.25.135
]# yum install -y httpd ]# systemctl start httpd.service 注意:安装完成后在各httpd服务器上配置测试页面,/var/www/html/index.html.
4、测试所有主机是否能够通信
用ping命令测试各节点的通信,例如RIP1和VIP、DIP、RIP2之间是否能够通信
]# ping IPADDR
5、同步所有主机的时间,这里使用chrony 也可以手动同步
]# vim /etc/chrony.conf 编辑文件添加一行如下; server 10.1.0.1 iburst ]# systemctl restart chronyd.service
6、测试两台RS的服务是否能正常访问
7、VS主机:核心转发和安装ipvsadm
1)安装ipvsadm组件:[root@localhost ~]# yum install -y ipvsadm 2)启动网卡间核心转发功能:[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1 也可以echo 1 到/proc/sys/net/ipv4/ip_forward ]# cat /proc/sys/net/ipv4/ip_forward
7、VS主机:定义配置lvs-nat服务(此处采用rr算法)
1)定义ipvsadm负载均衡集群规则,并查看 此处定义DIP是以-s指定为rr算法进行轮询调度,-m指定模式为lvs-nat,配置命令如下: ]# ipvsadm -A -t 10.1.19.11:80 -s rr ]# ipvsadm -a -t 10.1.19.11:80 -r 192.168.25.129 -m ]# ipvsadm -a -t 10.1.19.11:80 -r 192.168.25.130 -m ]# ipvsadm -L -n
2)Client客户机测试 在客户端主机上使用curl命令对VIP发起请求,负载均衡服务器会将请求按照rr算法依次将请求调度给不同的主机进行处理,依次请求给分发给192.168.25.129和192.168.25.130主机响应。
负载均衡集群的设计要点:
(1) 是否需要会话保持; (2) 是否需要共享存储; 共享存储:NAS, SAN, DS(分布式存储)
设计要点:
(1) RIP与DIP在同一IP网络, RIP的网关要指向DIP; (2) 支持端口映射;
lvs-dr模型构建
dr模型中,各主机上均需要配置VIP,解决地址冲突的方式有三种;
(1) 在前端网关做静态绑定; (2) 在各RS使用arptables; (3) 在各RS修改内核参数,来限制arp响应和通告的级别; 限制响应级别:arp_ignore 0:默认值,表示可使用本地任意接口上配置的任意地址进行响应; 1: 仅在请求的目标IP配置在本地主机的接收到请求报文接口上时,才给予响应; 限制通告级别:arp_announce 0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告; 1:尽量避免向非直接连接网络进行通告; 2:必须避免向非本网络通告;
1、lvs-dr模型示意图
三台主机为虚拟机CentOS 7,每台主机仅有一块网卡,且使用桥接方式都指向外部网络的网关172.18.19.1
2、RS服务器配置APR内核参数修改
[root@localhost~]# ll /proc/sys/net/ipv4/conf
1)ARP响应行为和ARP解析行为内核参数:
1)arp_annouce定义通告级别 0:默认级别,将本地的任何接口上的配置的地址都在网络中通告 1:尽量避免向本主机上的其他网卡进行网络通信,特殊情况下其他接口也可以 2:总是使用最佳网络地址接口(仅使用定义的网卡接口在同网络通信) 2)arp_ignore定义响应级别(0-8九个级别),响应时忽略方式 0:都全都响应 1:只对从本接口进入的请求响应,且本接口地址是个网络地址 … … 注释:一般使用arp_annouce=2,arp_ignore=1
2)配置各RS主机参数
注意:all必须配置、eno16777736(本地)和lo两个可以同时全部配置或者配置其中一个
RealServer内核参数: ]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore ]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce ]# echo 1 > /proc/sys/net/ipv4/conf/INTERFACE/arp_ignore ]# echo 2 > /proc/sys/net/ipv4/conf/INTERFACE/arp_announce 注意:INTERFACE为你的物理接口;此处网卡接口指的是eno16777736和lo
3、配置VS和RS服务器的VIP
此处的VIP均以别名的形式配置在往卡上,VS是配置在对外通信的DIP的网卡上;RS配置在lo本地回环网卡
注意:此时配置的VIP的子网掩码必须为255.255.255.255,广播地址为自己本身
VS:[root@localhost~]# ifconfig eno16777736:0 172.18.19.110 netmask 255.255.255.255 broadcast 172.18.19.110 up RS:[root@localhost~]# ifconfig lo:0 172.18.19.110 netmask 255.255.255.255 broadcast 172.18.19.110 up
4、RS服务器上配置路由
]# route add -host 172.18.19.110 dev lo:0 ]# route -n
5、VS主机:定义配置lvs-dr模式(此处采用rr算法)
1)配置和查看 [root@localhost~]# ipvsadm -A -t 172.18.19.110:80 -s rr [root@localhost~]# ipvsadm -a -t 172.18.19.110:80 -r 172.18.19.218 -g [root@localhost~]# ipvsadm -a -t 172.18.19.110:80 -r 172.18.19.184 -g [root@localhost~]# ipvsadm -L -n
2)测试 [root@localhost~]# curl http://172.18.19.110 因为基于rr算法调度,依次分发给RS主机
6、RS的预配置脚本:
#!/bin/bash # vip=10.1.0.5 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 route add -host $vip dev lo:0 ;; stop) ifconfig lo:0 down 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 $(basename $0) start|stop" exit 1 ;; esac
7、VS的配置脚本:
#!/bin/bash # vip='10.1.0.5' iface='eno16777736:0' mask='255.255.255.255' port='80' rs1='10.1.0.7' rs2='10.1.0.8' scheduler='wrr' type='-g' case $1 in start) ifconfig $iface $vip netmask $mask broadcast $vip up iptables -F ipvsadm -A -t ${vip}:${port} -s $scheduler ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1 ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1 ;; stop) ipvsadm -C ifconfig $iface down ;; *) echo "Usage $(basename $0) start|stop" exit 1 ;; esac
通过防火墙标记来定义lvs
1、FWM:FireWall Mark
防火墙标记可以实现多个集群服务绑定为同一个,实现统一调度;将共享一组RS的集群服务统一进行定义 FWM基于iptables的mangle表实现防护墙标记功能,定义标记做策略路由
2、FWM定义集群的方式
1)在director上netfilter的mangle表的PREROUTING定义用于"打标"的规则 ~]#iptables -t mangle -A PREROUTING -d $vip -p $protocol --dport $port -j MARK--set-mark # $vip:VIP地址 $protocol:协议 $port:协议端口 2)基于FWM定义集群服务: ~]#ipvsadm -A -f # -s scheduler
3、示例
[root@localhost~]# iptables -t mangle -A PREROUTING -d 172.18.19.110 -p tcp --dport 80 -j MARK --set-mark 5 [root@localhost~]# ipvsadm -A -f 5 -s rr [root@localhost~]# ipvsadm -a -f 5 -r 172.18.19.218 -g [root@localhost~]# ipvsadm -a -f 5 -r 172.18.19.184 -g
LVS持久连接功能:lvs persistence
1、lvs persistence功能
无论ipvs使用何种scheduler,其都能够实现在指定时间范围内始终将来自同一个ip地址的请求发往同一个RS;实现方式和lvs调度的十种算法无关,通过lvs持久连接模板(hash表)实现,当超过自定义的可持节连接时长候再根据LVS算法本身进行调度。
ipvsadm命令中-p选项实现,在-p后不指定具体数字(单位:秒),默认为300,到时候会自动延长2分钟,对于web本身就是15秒
2、模式
1)每端口持久(PPC)
客户端对同一服务端口发起请求,会基于该服务的端口实现请求在一段时间内对同一RS服务器持久连接;
例如:有两台主机做为RS服务器做http和hssh的两种服务的集群,仅http做每端口持久,Client请求会实现绑定在,但是22号端口请求不会绑定在同一台RS
2)每客户端持久(PCC):定义tcp或udp协议的0号端口为集群服务端口
director会将用户的任何请求都识别为集群服务,并向RS进行调度;同一客户端的请求任何端口都发往同一台第一次选定的RS服务器
3)每防火墙标记持久(PFWMC)
将两个或两个以上服务通过防火墙打标绑定在一起,这些服务的请求实现同时定向与同一台RS服务器,服务绑定同一RS
示例:
lvs-dr模式下以rr算法绑定http和https服务 ~]#iptables -t mangle -A PREROUTING -d 172.18.19.110 -p tcp --dport 80 -j MARK--set-mark 99 ~]#iptables -t mangle -A PREROUTING -d 172.18.19.110 -p tcp --dport 443 -j MARK--set-mark 99 ~]#ipvsadm -A -f 99 -s rr -p ~]#ipvsadm -a -f 99 -r 172.18.19.218 -g ~]#ipvsadm -a -f 99 -r 172.18.19.84 -g
保存及重载规则:
保存:建议保存至/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
考虑:
(1) Director不可用,整个系统将不可用;SPoF 解决方案:高可用 keepalived heartbeat/corosync (2) 某RS不可用时,Director依然会调度请求至此RS; 解决方案:对各RS的健康状态做检查,失败时禁用,成功时启用; keepalived heartbeat/corosync, ldirectord 检测方式: (a) 网络层检测; (b) 传输层检测,端口探测; (c) 应用层检测,请求某关键资源; ok --> failure failure --> ok
原创文章,作者:M20-1马星,如若转载,请注明出处:http://www.178linux.com/58150