Lvs 理论知识和实践


LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
 
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
 
1,Cluster 理论
 
1.1,系统拓展的方式:
 
 scale up:向上发展;
 
 scaleout:向外发展;
 
1.2,集群类型:
 
LB:负载均衡集群 -->将一个系统上所面临的诸多负载load Banlancing另外一个主机上;
硬件: F5 Big-ip
Citrix Netscaler
A10 A10
 
软件:Lvs(大型网站)除了负载均衡没有其他的健康检测状态;
haproxy, nginx (居多),httpd(proxy模块) ,varnish
ats (apache traffic server)发展需要;
 perlbal
 
基于工作协议层划分:
 
传输层: Lvs,haproxy(模拟出TCP层可调度mode tcp);
 
应用层:haproxy(个别协议),nginx,ats,perlbal
 
HA:高可用集群,high availability
 
HP:高性能集群,high performancing
 
分布式存储及并行处理集群,
 
1.3,系统:
 
可扩展性;
 
可用性;
 
容量;例如高速公路,可以跑多少汽车; 单位时间内完成的总量;
 
性能;例如车速,单位时间内通过的汽车数量;响应时间;
 
注意,系统运维:可用性-->做好标准化-->自动化运维 (稳定性高于一切);
#################################################################################
 
2,构建高可用扩展性系统的重要原则,在系统内部尽量避免穿行和交互;
GSLB: Global serviceload balancing全局负载均衡
 SLB:service load balancing 服务负载平衡
 
 分层:负载均衡层静态内容层 数据存储层
 动态内容层
 
 分割:功能上分割,把不同的请求分布到不同的server;
 分布式:
分布式应用;
分布式静态资源;
分布式数据和存储;
分布式计算;
 
2.1,四层交换,四层路由
 
根据请求报文的目标IP和port将其转发至后端主机集群中的某一台主机(根据负载均衡算法);
netfilter:
入站: prerouting------>input;
转发:prerouting---> forward--->postrouting;
出站:output---->postrouting;
 
2.2,Lvs :
 
ipvsadm (写规则)/ipvs(定义规则) 工作在netfilter的内核中;
ipvsadm:用户空间的命令行工具,用于管理集群服务;
ipvs:工作在内核中netfilter INPUT 钩子协议上;
支持TCP、UDP、AH、EST、AH_EST、SCTP等协议;
 
2.3,Centos 7 查看调度模块信息;
# grep -i -A 10 'IPVS'/boot/config-3.10.0-229.el7.x86_64
 
2.4,Lvs arch :
 调度器:director(导演)、dispatcher(调度员)、
RS:Real server,
client IP:cip
directorvirutal ip:vip
director ip:dip
real serverip:rip
 
2.5,Lvs type:
A, Lvs-nat:基于Dnat模式masquerade(地址伪装)类型
B,Lvs-dr:直接路由directrouting,gateway类型
C,Lvs-tun:ip隧道 ip tunnelingIPIP 隧道类型
D,Lvs-fullnat:非标准类型 请求报文转发时修改源、目标地址
 
 A,Lvs-nat:
 
多目标的DNAT(iptables);
 
 通过修改请求报文的目标IP地址和端口,完成端口映射,至挑选出某RS的RIP地址实现转发;
 
(1) RS应该和DIP使用私网地址,且RS的网关需要指向DIP;
 
(2)请求和响应报文都要经由director转发;极高负载的场景中,director可能会成为系统瓶颈;
 
(3)RS 可以使用任意OS,支持端口映射;
 
(4)RS的RIP和director的DIP必须在同一IP网络;
 
如图1.1所示:
 
B,Lvs-dr:direct routing
 
通过修改请求报文的目标mac地址进行转发;
 director:VIP ,DIP
 RSs:RIP,VIP
 
(1)必须保证前段路由器将目标IP为VIP的请求报文发送给director;
 
 解决方案:
 
 静态绑定;director MAC地址绑定
 
arptables;在每个real server 启用arptables,
 
 修改RS主机内核参数(linux 主机);
 
 (2)RS的RIP可以使用私有地址,但也可以使用公网地址;
 
 (3)RS根director必须在同一物理网络;
 
 (4)请求报文经由director调度,但响应报文不一定能经由director(由RS直接转发);
 
 (5)不支持端口映射
 
 (6)RS可以大多数OS;
 
 (7)RS的网关不能指向DIP;
#################################################################################
3,Lvs -type
Lvs-nat:RIP与DIP必须在同一网段;
Lvs-dir: director与RS必须在同一网段;
Lvs-tun:
 
 不修改请求报文的IP首部,而是通过原有的IP首部之外,在封装一个IP首部;
 
 (1)RIP、DIP、VIP都是公网地址;
 
 (2)RS网关不能指向DIP,
 
 (3)请求报文经由director调度,响应报文必须不经由director;
 
 (4)不支持端口映射,RS的OS必须支持隧道功能;
 
 Lvs-fullnat:可以跨机房设置
 
请求报文到达时,director同时修改报文的源地址和目标地址;
 
 (1)VIP是公网地址,DIP和RIP可以不在同一网段;
 
 (2)RS接收到的请求报文源地址为DIP,因此要响应给DIP;
 
 (3)请求报文和响应报文必须经由director;
 
 (4)支持端口映射,RS的OS可以使用任意OS;
 
 4,http:stateless
 
 追踪每一客户端,需要给每一个客户端发放一个cookie;
 
 session保持:将来自于同一个用户的请求,调用到同一个RS;
 
 session绑定:请求报文插入cookie, (nginx可以,lvs不可以
 
 session集群;session主从机制会浪费内存、cpu等消耗;
 
 session服务器;共享存储服务器,KV机制存储;
 
5,Lvs scheduler:
 
 静态方法:仅根据算法本身进行调度,不考虑负载状态;起点公平
 
RR: roundrobin ,轮询
 
WRR:weighted rr ,加权
 
SH:source hash 源地址hash 实现session保持;损害负载均衡的效果;
 
 将来自同一个IP的请求始终调度至同一RS;反向代理
 
DH:destination hash,目标地址hash,不管来自哪一个的请求,请求同一个目标时,都会调度至同一个RS, 正向代理
 
 动态方法:根据算法及各RS的当前负载状态进行调度;sh
 LC:least connection 最少连接数;
 overhead=active(活跃的链接数量)*256+inactive(不活跃的连接数)
WLC:weighted least connection 加权最少连接;
 overhead=(active(活跃的)*256+inactive(不活跃的))/weight 服务器权重 
SED:最短期望延迟 shortest expection delay
 overhead=(active+1)*256/weight
 NQ:never queue
SED算法改进
LBLC:locality-based lc,动态DH算法,实现正向代理时;
LBLCR:带复制的的LBLC
 权重大的响应请求,分配延迟
#######################################################################################
静态
局部性:空间 + 时间
制作缓存时,基于内存的缓存方式
 
动态内容:时间 + 特定
制作缓存时,根据用户时长判断;
 
 
######################################################################
 
6,Lvs的集群服务:TCP、UDP、ah、esp
 
 (1)一个ipvs主机可以同时定义多个clusterserver;
根据tcp,udp
(2)一个cluster server上至少有一个real server;
定义时:指明lvs-type 以及lvs scheduler(程序机);
 
7,ipvsadm的用法:
A,管理集群服务;
ipvsadm-A|E -t|u|f service-address [-s scheduler]
增加和修改
ipvsadm-D -t|u|f service-address
 删除
ipvsadm-C删除
ipvsadm -L | l [options]
 service-address:
tcp:-t ip:port
 udp:-u ip:port
fwm:-f mark 数字防火墙标记;
-sscheculer:默认为wlc 非活动链接数量
 
 
B,管理集群服务中的RS;
 ipvsadm -a|e -t|u|f service-address -rserver-address [-g|i|m] [-wweight]
 ipvsadm -d -t|u|f service-address -r server-address
 
server-address;
 ip [:port] 支持端口映射;大多数端口可省略;
 Lvs-type:
 -g:gateway,dr
-i:ipip, tun
-m:masquerade,nat nat模型
 
C, 清空和查看:
ipvsadm -C
ipvsadm -L | l[options]
 -n:numberic 基于数字格式显示地址和端口;
 -c:connection 显示ipvs连接数;
 --stats:统计数据;pkts:总包数
 --rate:速率; pps 每秒的包个数
 --exact:精确值;
 --sort:排序;
D, 保存和重载:
ipvsadm -R重载
ipvsadm -S [-n] 保存
 E,置零计数器:
ipvsadm -Z[-t|u|f service-address]
 
 
######################################################################################################
二,实操部分
Lvs-nat
 
1,DIP 设置:director准备两个网口,一个是网桥,一个是虚拟网卡2;
 # cd /etc/sysconfig/network-scripts/
 # vimifcfg-eno16777736
 #ifconfig -a
查看eno16777736地址
设置另外一个端口vmnet2:
 # cpifcfg-eno16777736 ifcfg-eno33554984
 # vim ifcfg-eno33554984删除UUID更改NAME、DEVICE参数;
 
2,接下来我们配置另外两台web机器:
分别配置两台web服务器的IP地址,和web服务;
然后在director上面测试两个页面;并关闭iptables防护墙;
#curl http://192.168.20.7
#curl http://192.168.20.8
#iptables -F
 在director上转发功能打开
# cat /proc/sys/net/ipv4/ip_forward
# vim /etc/sysctl.conf编辑添加"net.ipv4.ip_forword = 1"
 
3,现在在director上面设置规则:
 # ipvsadm -A -t 172.16.100.117:80 -s rr
 # ipvsadm -a -t 172.16.100.117:80 -r192.168.20.7 -m
 # ipvsadm -a -t 172.16.100.117:80 -r192.168.20.8 -m
 
 4,保存配置永久有效:
]# ipvsadm -S > /etc/sysconfig/ipvsadm
5,如果不小心删除规则,可以及时修复;
 
6,重读配置文件,并修复;
# ipvsadm -R < /etc/sysconfig/ipvsadm
7,开始验证Lvs-nat 效果:
 http://172.16.100.117来查看;
8,使用"-E"选项修改调度器:
#ipvsadm -E -t 172.16.100.117:80 -s sh
9,基于web修改RS端口映射;
# ipvsadm -e -t172.16.100.117:80 -r 192.168.20.7:8080 -m
# ipvsadm -e -t172.16.100.117:80 -r 192.168.20.8:8080 -m
或者修改 #vim/etc/sysconfig/ipvsadm 里的参数;然后重读信息。
wKioL1Yfm3XyKQg_AAEPFaaq0qQ904.jpg
 
这样web服务又恢复了正常;
 
10,删除一个real server;
#ipvsadm -d -t 172.16.100.117:80 -r192.168.20.7:8080
 
删除集群服务:
#ipvsadm -D -t 172.16.100.117:80
 
修复ipvsadm
#ipvsadm -R < /etc/sysconfig/ipvsadm
 
11,Lvs-dr 内核参数配置arp_ignore对请求是否响应/ arp_announce 接不接受请求通告
arp_announce(通告)-INTEGER请求
0 默认,不保留通告
 1 尽量不通告
2只能、总是避免通告
 arp_announce = 1 尽量避免,
 arp_announce = 2 只能、总是避免,
 
 arp_ignore -INTEGER 响应
0 -默认 通告全场
1 -仅通告报文请求的入口,
Lvs-dr实操图:
A,修改DIP
配置director主机地址和回环地址:
# ifconfigeno16777736:0 172.16.100.118/32 broadcast 172.16.100.118 up
# route add -host 172.16.100.118 deveno16777736:0限定接口-->目标地址响应
 
 B,配置real server *参数配置--->配置VIP
配置两台real server内核参数;
 # echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
 # echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
 # echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
 # echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce
 # ifconfig lo:0 172.16.100.118/32broadcast 172.16.100.118 up添加回环Vip地址
 # route add -host 172.16.100.118 devlo:0端口限定
 
C,请求RIP地址验证;curl 命令;
D,director上添加集群服务;
#ipvsadm -C 删除之前的配置
# ipvsadm -A -t172.16.100.118:80 -s rr
 # ipvsadm -a-t 172.16.100.118:80 -r 172.16.100.21 -g
 # ipvsadm -a-t 172.16.100.118:80 -r 172.16.100.22 -g

相关内容