Lvs
一、lvs集群的类型:4类工作模式
1.1、lvs-nat
特点:通过将请求报文中的目标地址和目标端口修改为挑选出的某RS的RIP和PORT实现转发。
客户端访问lvs集群服务,此时报文的源地址为cip,目标地址为vip,通过lvs进行dnat转发后端服务器主机,此时,报文的源地址为cip,目标地址为rip;后端主机响应时,报文源地址为rip,目标地址为cip,后端的各个真实主机,必须把网关指向lvs集群服务的dip;这样,才能保证响应给lvs集群服务主机;响应报文到达lvs集群服务进行地址转换,此时,源地址为vip,目标地址为cip,最终,响应给客户端;其实,还支持端口映射,即可修改端口进行端口转换;
此lvs工作类型,由于使用nat,链接跟踪机制不可避免的启用;所以,并发数量是受限的;
注意:
(1)RIP和DIP必须在同一IP网络,且应该使用私有地址;RS的网关必须指向DIP
(2)请求报文和响应报文都经由Director转发,高负载下,vs易于成为系统性能瓶颈;
(3)支持端口映射;后端真实主机尽量为同一端口;
(4)VS必须是Linux,RS可以是任意OS(操作系统);
1.1.1、设计要点:
(1) RIP与DIP在同一IP网络, RIP的网关要指向DIP;
(2) 支持端口映射;
1.1.2、实验环境:
RS1:1.1.1.2 RS2:1.1.1.3 DIP:1.1.1.1
VIP:10.1.72.20
——————-VS服务器———————————
[root@centos6 ~]# ipvsadm -A -t 10.1.72.20:80 -s rr
[root@centos6 ~]# ipvsadm -a -t 10.1.72.20:80 -r 1.1.1.2 -m
[root@centos6 ~]# ipvsadm -a -t 10.1.72.20:80 -r 1.1.1.3 -m
[root@centos6 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@centos6 ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@centos6 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.72.20:80 rr
-> 1.1.1.2:80 Masq 1 0 1
-> 1.1.1.3:80 Masq 1 0 2
[root@centos6 ~]# ntpdate 10.1.0.1 //最好要同步时间
27 Oct 12:07:09 ntpdate[4088]: step time server 10.1.0.1 offset 41536.506821 sec
——————————-RS———————————
=====================使用sh调度算法==================
[root@centos6 ~]# ipvsadm -E -t 10.1.72.20:80 -s sh
[root@centos6 ~]# ipvsadm -e -t 10.1.72.20:80 -r 1.1.1.2 -m
[root@centos6 ~]# ipvsadm -e -t 10.1.72.20:80 -r 1.1.1.3 -m
[root@centos6 ~]# !curl
curl 10.1.72.20/index.html
this 1.1.1.3
[root@centos6 ~]# curl 10.1.72.20/index.html
this 1.1.1.3
[root@centos6 ~]# curl 10.1.72.20/index.html
this 1.1.1.3
===================使用wrr调度算法=====================
[root@centos6 ~]# ipvsadm -E -t 10.1.72.20:80 -s wrr
[root@centos6 ~]# ipvsadm -e -t 10.1.72.20:80 -r 1.1.1.2 -m -w 3
[root@centos6 ~]# ipvsadm -e -t 10.1.72.20:80 -r 1.1.1.3 -m -w 1
[root@centos6 ~]# curl 10.1.72.20/index.html
this is 1.1.1.2
[root@centos6 ~]# curl 10.1.72.20/index.html
this 1.1.1.3
[root@centos6 ~]# curl 10.1.72.20/index.html
this is 1.1.1.2
[root@centos6 ~]# curl 10.1.72.20/index.html
this is 1.1.1.2
[root@centos6 ~]# curl 10.1.72.20/index.html
this is 1.1.1.2
[root@centos6 ~]# curl 10.1.72.20/index.html
this 1.1.1.3
[root@centos6 ~]# curl 10.1.72.20/index.html
this is 1.1.1.2
[root@centos6 ~]# curl 10.1.72.20/index.html
this is 1.1.1.2
[root@centos6 ~]# curl 10.1.72.20/index.html
this is 1.1.1.2
[root@centos6 ~]# curl 10.1.72.20/index.html
this 1.1.1.3
1.1.3、利用防火墙标记配置lvs
借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度;
[root@centos6 ~]# iptables -t mangle -A PREROUTING -d 1.1.1.1 -p tcp –dport 80 -j MARK –set-mark 1
[root@centos6 ~]# ipvsadm -A -f 1 -s rr
[root@centos6 ~]# ipvsadm -a -f 1 -r 1.1.1.2 -m
[root@centos6 ~]# ipvsadm -a -f 1 -r 1.1.1.3 -m
1.2、lvs-dr
通过修改请求报文的MAC地址,重新封装一个MAC首部进行转发;源MAC是DIP所在接口的MAC地址,目标MAC是挑选出的某RS的RIP所在接口的MAC地址;IP首部不会发生变化(依然是CIP<–>VIP)
lvs服务主机与后端服务器主机接在同一交换机上,且每个后端主机都配有vip,为了避免地址冲突,把各后端主机配置的vip进行隔离;隔离的方法有3种:
方法一:可使用arptables命令,专门控制进行arp广播隔离;
方法二:在RS上修改内核参数以限制arp通告及应答级别;
arp_announce
arp_ignore
方法三:在前端lvs服务器上游的路由器上绑定lvs的MAC地址与lvs的vip地址;此方法,较为不便,一般路由器有运营商负责,且lvs服务器主机会有两个,所以绑定MAC后,当一台坏了时,另一台则不能通过路由器与外界通信;
特点:
(1)确保前端路由器将目标IP为VIP的请求报文转发往调度服务器;
(2)RS的RIP可以使用私有地址,也可以使用公网地址;
(3)RS跟Director必须在同一物理网络(基于MAC地址转发);RS的网关必须不能指向DIP;
(4)请求报文必须由Directory调度,但响应报文必须不能经由Director;
(5)不支持端口映射;
1.2.1、注意事项:
dr模型中,各主机上均需要配置VIP,解决地址冲突,方法:
在各RS修改内核参数,来限制arp响应和通告的级别;
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应;
1: 在请求的目标IP配置在本地主机的接收到请求报文接口上时,给予响应;
限制通告级别:arp_announce
0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告;
1:尽量避免向非直接连接网络进行通告;
2:必须避免向非本网络通告;
设计要点:
(1)各主机一个接口即可,但需要在同一物理网络中;
(2)RIP的网关不能指向DIP,RIP和DIP通常应在同一网络,但此二者未必会与VIP在同一网络;
(3)各RS需要先设置内核参数,再设置VIP和路由
1.2.2、实验环境
VS:VIP 10.1.72.21 DIP:10.1.72.20
RS1:VIP 10.1.72.21 RIP1 10.1.72.70
RS2:VIP 10.1.72.21 RIP2 10.1.72.10
—————————–RS1—————————–
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@localhost ~]# ifconfig lo:0 10.1.72.21 netmask 255.255.255.255 broadcast 10.1.72.21 up
[root@centos6 ~]# route add -host 10.1.72.21 dev lo
[root@localhost ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.1.72.21 0.0.0.0 255.255.255.255 UH 0 0 0 lo
10.1.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
0.0.0.0 10.1.0.1 0.0.0.0 UG 0 0 0 eth0
—————————RS2——————————
[root@centos6 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@centos6 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@centos6 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@centos6 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@centos6 ~]# ip addr add 10.1.72.21/32 broadcast 10.1.72.21 dev lo:0
[root@centos6 ~]# route add -host 10.1.72.21 dev lo
———————–VS——————————-
[root@centos6 ~]#ip addr add 10.1.72.21/32 broadcast 10.1.72.21 dev eth0
(地址16位掩码仍然可以成功) [root@centos6 ~]# ip addr add 10.1.72.21/16 dev eth0
[root@centos6 ~]# ipvsadm -A -t 10.1.72.21:80 -s rr
[root@centos6 ~]# ipvsadm -a -t 10.1.72.21:80 -r 10.1.72.10 -g
[root@centos6 ~]# ipvsadm -a -t 10.1.72.21:80 -r 10.1.72.70 –g
1.3、lvs-tun
转发方式:
不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是源IP首部之外再封装一个IP首部(源IP为DIP,目标IP为挑选出的RS的RIP);
请求报文源IP为cip,目标IP为vip,到到达lvs服务进入INPUT链上,在整个ip报文外又加了一层ip首部,即IP报文传输IP报文所以叫IP隧道,此时外层源IP为dip,目标IP为某一个被挑选出来远端的rip,远端的服务主机收到报文经过不断拆包后,将响应报文发给客户端,构建响应报文的源IP为cip,目标IP为cip;
特点:
(1)RIP,DIP,VIP全得是公网地址;
(2)RS网关不能指向也不可能指向DIP;
(3)请求报文经由Director转发,但响应报文将直接发往CIP;
(4)不支持端口映射;
(5)RS的OS必须支持隧道功能;
二、调度方法:
2.1、静态调度方法
2.1.1、RR:轮询,只考虑起点不考虑终点,一个一个交替向后发送
2.1.2、WRR:加权轮询,根据后端服务器性能,设置权重值,也就是可响应性能好的服务器,被选中的次数多;
2.1.3:SH:根据客户端请求的源地址调度,调度服务器中会有一个缓存表,当客户端请求来时,查询此表,如果与表中的ip一样,那就选择与上次分配的真是服务器相同的服务器,如果表中没有匹配项,那么根据wrr的方式,来调度
2.1.4、DH:当调度服务器后端为缓存服务器时,缓存服务器缓存着不同网站的内容,当有客户端请求到来时,查询客户端请求的地址,如果缓存服务器中有需要的缓存内容,那么不管客户端是谁,都调度到那个缓存服务器上,如果没有匹配到内容,则根据wrr调度算法,调度到后端,此时,这个调度服务器的表中会增加一条记录
2.2、动态调度方法:根据后端每个RS服务器的负载状态进行调度
2.2.1、LC:最少连接算法, 活动x256+非活动计算的值小的被选中;
2.2.2、WLC:加权最少连接算法,(活动连接*256+非活动连接)/权重 缺陷:权重小的服务器在前面,客户端第一次请求时会始终先调度给前面的服务器,而不是性能好、权重大的服务器;
2.2.3、SED:解决了WLC的缺陷,(活动连接+1)*256/权重,使得权重大的结果一定会小于权重小的,这样能保证权重大的先接受响应任务;缺陷:使得权重大的始终保持响应任务,而权重小的始终没有任务;
2.2.4:NQ:永不排队,改进了sed,开始时,保证每个服务器都轮询响应任务,之后再安装sed的方法进行计算;
2.2.5、LBLC(动态dh):基于本地的最少连接,其实就是动态的dh算法,做dh时会考虑后端服务器负载状态,结果是有可能新请求被发往负载较小的服务器上,如果没有任何匹配,使用WLC算法进行调度,但始终会影响负载均衡效果,因为dh算法就决定了,请求只要是同一目标地址就被绑定在一个RS上;
2.2.6:LBLCR:被调度的多台缓存服务器之间,可以复制部分内容,这样,在后端缓存服务器极不平衡的的状态下,通过复制部分内容来实现调度相对平衡的效果
三、配置命令格式
3.1、ipvsadm命令:
ipvsadm -A|E -t|u|f service-address [-s scheduler]
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]
3.2、管理集群服务:增、改、删;
增、改:ipvsadm -A|E -t|u|f service-address [-s scheduler]
service-address:VIP
-t|u|f:
-t: TCP协议的端口,VIP:TCP_PORT
-u: TCP协议的端口,VIP:UDP_PORT
-f:firewall MARK,是一个数字;
[-s scheduler]:指定集群的调度算法,默认为wlc;
删:ipvsadm -D -t|u|f service-address
3.3、管理集群上的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
server-address:
rip[:port]
选项:
lvs类型:
-g: gateway, dr类型
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight:权重;
清空定义的所有内容:
ipvsadm -C
3.4、查看:
ipvsadm -L|l [options]
–numeric, -n:numeric output of addresses and ports
–exact:expand numbers (display exact values)
–connection, -c:output of current IPVS connections
–stats:output of statistics information
–rate :output of rate information
保存和重载:
ipvsadm -S = ipvsadm-save
ipvsadm -R = ipvsadm-restore
原创文章,作者:landanhero,如若转载,请注明出处:http://www.178linux.com/55023