基于DR模式的LVS
1 引入
集群是为解决某个特定问题将多台计算机组合起来形成的单个系统,有以下三种类型:
LB:Load Balancing,负载均衡集群HA:High Availiablity,高可用集群
HPC:High-performance computing,高性能计算集群
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一款可实现负载均衡集群的开源软件。
2 lvs集群类型中的术语
VS:Virtual Server, Director, Dispatcher(调度器)、Load Balancer
RS:Real Server(lvs), upstream server(nginx)、backend server(haproxy)
CIP:Client IP
VIP:Virtual serve IPVS外网的IP
DIP:Director IPVS内网的IP
RIP: Real server IP
3 lvs集群的类型
(1)LVS-NAT
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某RS的RIP和PORT实现转发
(2)LVS-DR
即直接路由,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
(3)LVS-TUN
不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
(4)LVS-FULLNAT
通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --> DIP
VIP --> RIP RS的RIP和PORT实现转发
4 lvs调度算法
根据其调度时是否考虑各RS当前的负载状态可以分为静态调度算法和动态调度算法
静态方法:仅根据算法本身进行调度
(1)RR:roundrobin,轮询
(2)WRR:Weighted RR,加权轮询
(3)SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
(4)DH:Destination Hashing;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
(1)LC:least connections 适用于长连接应用
Overhead=activeconns*256+inactiveconns
(2)WLC:Weighted LC,默认调度方法
Overhead=(activeconns*256+inactiveconns)/weight
(3)SED:Shortest Expection Delay,初始连接高权重优先
Overhead=(activeconns+1)*256/weight
(4)NQ:Never Queue,第一轮均匀分配,后续SED
(5)LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
(6)LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
本节将重点介绍LVS-DR模式:
假设本实验中192.168.25.0/24、172.18.0.0/16网段的ip为公网ip,即vip、dip、rip、cip都是公网ip
实验环境:
客户端:172.18.254.21
VS:192.168.25.107(vip)、192.168.25.7(dip)
rs路由器:172.18.100.100、192.168.25.146
RS1(Apache服务器):192.168.25.106(rip1)、192.168.25.107(vip)
RS2(Apache服务器):192.168.25.108(rip2)、192.168.25.107(vip)
实验准备:清空防火墙策略、禁用防火墙(临时禁用、开机禁用)、禁用selinux(临时禁用、开机禁用)
客户端的路由记录:
172.18.0.0 0.0.0.0
0.0.0.0 172.18.100.100
路由器的路由记录:
172.18.0.0 0.0.0.0
192.168.25.0 0.0.0.0
0.0.0.0 xxxx
vs的路由记录:
192.168.25.0 0.0.0.0
rs1的路由记录:
192.168.25.0 0.0.0.0
0.0.0.0 192.168.25.146
rs2的路由记录:
192.168.25.0 0.0.0.0
0.0.0.0 192.168.25.146
首先简单介绍一下arp广播的过程:主机A要向主机B发送数据包(主机A已知主机B的ip),首先会检查本机路由表,判断目标主机是否与本机在同一网段:若目标主机与本机在同一网段,主机A会向网络中发送arp广播:谁是ipB,请告诉我你的mac地址。主机B收到后回应自己的mac地址给A,二者开始进行数据传送;若目标主机与本机不在同一网段,主机A会arp广播寻找路由器的mac地址,然后通过路由器与主机B进行数据传送。
客户端发送请求数据包(源ip:172.18,254.21即cip,目标ip:192.168.25.107即vip)时,查询本机路由表后认为目标主机与本机不在一个网段,并由默认路由获得网关ip,就向网关发送arp广播:谁是172.18.100.100,请告诉我你的mac地址。172.18.100.100即路由器收到后就回复客户端自己的mac地址。然后客户端将请求数据包发送给路由器{源mac:客户端172.18,254.21所在网卡的mac,目标mac:路由器172.18.100.100所在网卡eth1的mac(源ip:172.18,254.21即cip,目标ip:192.168.25.107即vip)}。
路由器收到后,查询本机路由表后认为目标主机与本机在一个网段,就向网络中发送arp广播:谁是192.168.25.107,请告诉我你的mac地址。由于vs和rs上都配置有vip,且DR模式下vs与rs在同一物理网段,所以若不进行相关设置,拥有vip:192.168.25.107的主机都会响应路由器的arp广播,就会产生地址冲突。可以通过在各RS修改内核参数arp_ignore、arp_announce来限制arp响应和通告的级别:
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1: 仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告
arp_ignore为1时arp请求包的目标ip是eth0且请求包由eth0接收时,才响应该arp请求
arp_announce为2时eth0为某ip的arp广播只通过eth0接口发送出去。
在rs1,rs2、vs上配置vip192.168.25.107,并设置rs1,rs2的arp_ignore为1、arp_announce为2,目的是当路由器发送arp广播寻找192.168.25.107的mac地址时,只有vs响应,避免同时响应带来的地址冲突。
因为vs的eth0上有192.168.25.107/24,且eth0可以接收arp请求,所以eth0响应路由器的arp请求(即使目标ip不在eth0,由于vs未设置arp_ignore=1,也可以进行响应),回复本机eth0的mac给路由器;
rs1的lo上有192.168.25.107/32,由于lo无法接收arp请求,所以由eth0代为接收并转发给lo,但是设置了arp_ignore=1,因为目标ip不在接收请求的eth0上,所以虽然接收了请求,但是不进行响应。
于是路由器将数据包{源mac:路由器 192.168.25.146所在网卡eth0的mac,目标mac:vs 192.168.25.107/24所在网卡eth0的mac(源ip:172.18,254.21即cip,目标ip:192.168.25.107即vip)}发送给vs,vs收到后将数据包发送给eth0192.168.25.107:80,即集群服务,所以vs根据集群服务定义的策略向本网段发送arp广播:谁是192.168.25.106,请告诉我你的mac地址。192.168.25.106即rs1的eth0(eth0上有arp请求的目标ip192.168.25.106,必须由eth0接收该arp请求才能响应)收到该arp请求后回复本机192.168.25.106所在网卡eth0的mac地址给vs,于是vs将数据包{源mac:vs192.168.25.7/24所在网卡eth0的mac,目标mac:rs1
192.168.25.106/24所在网卡eth0的mac(源ip:172.18,254.21即cip,目标ip:192.168.25.107即vip)}发送给rs1。
rs1收到数据包{源mac:vs192.168.25.7/24所在网卡eth0的mac,目标mac:rs1 192.168.25.106/24所在网卡eth0的mac(源ip:192.168.25.107即vip,目标ip:172.18,254.21即cip)}后进行回复,因目标ip与本机不在同一网段,所以向网关发送arp广播:谁是192.168.25.146,请告诉我你的mac地址。路由器收到后将路由器 192.168.25.146所在网卡eth0的mac发送给rs1。rs1发送响应{源mac:rs1
192.168.25.106/24所在网卡eth0的mac,目标mac:路由器 192.168.25.146所在网卡eth0的mac(源ip:192.168.25.107即vip,目标ip:172.18,254.21即cip)}到路由器。
路由器收到响应{源mac:rs1 192.168.25.106/24所在网卡eth0的mac,目标mac:路由器 192.168.25.146所在网卡eth0的mac(源ip:192.168.25.107即vip,目标ip:172.18,254.21即cip)}后,根据本机路由表,发送arp广播:谁是172.18,254.21,请告诉我你的mac地址。客户端回复mac后路由器即将该包发送给客户端。
在rs1和rs2上的网页本应是相同的,但是为了观察lvs调度器的调度结果,将主页面设为不同的。
在rs上的配置:
(1)在lo上配置192.168.25.107/32
(2)配置主机路由:
destination netmask iface
192.168.25.107 255.255.255.0 lo
(3)修改内核参数:arp_ignore=1,arp_announce=2
(1)在eth0上配置192.168.25.107/24
(2)定义ipvs策略:
ipvsadm -A -t 192.168.25.107:80 -s wrr
ipvsadm -a -t 192.168.25.107:80 -r 192.168.25.106 -g -w 1
ipvsadm -a -t 192.168.25.107:80 -r 192.168.25.108 -g -w 1
-A 增加集群服务
-t 指定TCP协议的端口
-s 指定集群的调度算法
-a 增加集群上的RS
-r 指定rs的地址
-g 集群类型为dr类型
-w 权重
第一条规则定义了集群服务192.168.25.107:80,调度算法为wrr加权轮询
第二条规则在集群服务192.168.25.107:80上增加rs:192.168.25.106,集群类型为dr类型,该rs所占权重为1
第三条规则在集群服务192.168.25.107:80上增加rs:192.168.25.108,集群类型为dr类型,该rs所占权重为1
总结:
(1) RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
(2) RS和Director要在同一个物理网端
(3) 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
(4) 不支持端口映射(端口不能修败)
(5) RS可使用大多数OS系统