一、集群分类:高可用集群,负载均衡;也可以从硬件上和软件上区分
硬件:F5,BIG IP;Citrix,Netscaler;A10
软件:LVS,Nginx,haproxy
二、LVS工作原理
LVS工作在四层协议,不能与iptables同时使用;LVS由前端的负载均衡器(Load Balancer,LB)和后端的真实服务器(Real Server,RS)群组成。RS间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS群。当用户的请求发往虚拟服务器,LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。
LVS术语:
vs:Virtual server,Director
rs:Real server
CIP:Client IP //客户端IP地址
VIP:Virtual Server IP //面向客户提供服务
DIP:Director IP //调度器、转发器
RIP:Real Server IP //内部服务器
1.当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。
2.当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
3.LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将被放行至用户空间。
4.如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
5.最后经由POSTROUTING链发往后端服务器
三、LVS工作模式有3种:LVS-NAT(地址转换)、LVS-DR(直接路由)、LVS-TUN(隧道)
1.LVS-NAT模式
(a). 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b). PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c). IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
(d). POSTROUTING链通过选路,将数据包发送给Real Server
(e). Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
(f). Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP
LVS-NAT模型的特性
- RS应该使用私有地址,RS的网关必须指向DIP
- DIP和RIP必须在同一个网段内
- 请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈
- 支持端口映射
- RS可以使用任意操作系统
- 缺陷:对Director Server压力会比较大,请求和响应都需经过director server,因此对于高并发的场景并不适合
2.LVS-DR模型
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c) IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
(d) 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
(e) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
LVS-DR模型的特性
特点1:保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
- RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
- RS跟Director Server必须在同一个物理网络中
- 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
- 不支持地址转换,也不支持端口映射
- RS可以是大多数常见的操作系统
- RS的网关绝不允许指向DIP(因为我们不允许他经过director)
- RS上的lo接口配置VIP的IP地址
- 缺陷:RS和DS必须在同一机房中
特点1的解决方案:
- 在前端路由器做静态地址路由绑定,将对于VIP的地址仅路由到Director Server
- 存在问题:用户未必有路由操作权限,因为有可能是运营商提供的,所以这个方法未必实用
- arptables:在arp的层次上实现在ARP解析时做防火墙规则,过滤RS响应ARP请求。这是由iptables提供的
- 修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。
3.LVS-Tun模型
在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IIP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c) IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP
(d) POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP
(e) RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
- LVS-Tun模型特性
-
RIP、VIP、DIP全是公网地址
-
RS的网关不会也不可能指向DIP
-
所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
-
不支持端口映射
-
RS的系统必须支持隧道
其实企业中最常用的是 DR 实现方式,而 NAT 配置上比较简单和方便,后边实践中会总结 DR 和 NAT 具体使用配置过程。
四、LVS调度算法
- 静态方法:仅根据算法本身进调度
RR:轮叫调度
WRR:加权轮叫
SH:source hash,实现session保持的机制,将来自同一个IP的请求始终调度至一RS
DH:将对同一个目标的请求始终发给同一个RS;与SH不同的是,一个基于源,一个基于目的
- 动态方法:根据算法及各RS的当前负载情况进行高度
LC:最少链接算法
WLC:加权最少链接算法
SED:最短延迟调度; 在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。
NQ:永不排队/最少队列调度(Never Queue Scheduling NQ);基于SED算法,刚开始,先将为空的RS都分配一次,再根据SED算法去分配。
LBLC:基于局部性的最少链接
五、ipvsadm是LVS在应用层的管理命令
- 基本用法
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
-A|E表示添加或者修virtual service
-t|u|f用来表示提供什么服务,t表示tcp,u表示udp,f表示说明是经过iptables标记过的服务类型
ipvsadm -D service-address 删除内核虚拟服务器表中的一条虚拟服务器记录
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-a|e 在内核虚拟服务器表的一条记录里添加或者修改一条真实服务器记录
-r sever-address 某RS的地址,在NAT模型中,可以用IP:PROT实现端口映射
-g|i|m 表示LVS类型,g:DR,i:TUN,m:NAT
ipvsadm -d -t|u|f service-address -r server-address 删除虚拟服务里的一条真实服务
ipvsadm -L|-l 查看
-n:数字格式显示主机地址和端口
--stats:统计数据
--rate:速率
--timeout:显示tcp tcpfin和udp的会话超时时长
-c:显示当前 的ipvs连接状况
ipvsadm -S > /path/to/somefile #保存规则
ipvsadm -R < /path/to/somefile #载入此前保存的规则
六、实践LVS的NAT模式
grep -i -A 10 'IPVS' /boot/config-3.10.0-693.2.2.el7.x86_64 #查看系统是否支持IPVS
lsmod | grep ip_vs #查看ipvs模块是否加载
1、实验环境
三台服务器,一台作为 director,两台作为 real server,director 有一个外网网卡(172.16.254.200) 和一个内网ip(192.168.0.8),两个 real server 上只有内网 ip (192.168.0.18) 和(192.168.0.28),并且需要把两个 real server 的内网网关设置为 director 的内网 ip(192.168.0.8)
2、安装和配置
两个 real server 上都安装 nginx 服务 # yum install -y nginx
Director 上安装 ipvsadm # yum install -y ipvsadm
Director 上编辑 nat 实现脚本
# vim /usr/local/sbin/lvs_nat.sh
# 编辑写入如下内容:
#! /bin/bash
# director服务器上开启路由转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭 icmp 的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects
# director设置 nat 防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
# director设置 ipvsadm
IPVSADM='/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 172.16.254.200:80 -s wrr
$IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.18:80 -m -w 1
$IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.28:80 -m -w 1
保存后,在 Director 上直接运行这个脚本就可以完成 lvs/nat 的配置
/bin/bash /usr/local/sbin/lvs_nat.sh
查看ipvsadm设置的规则
ipvsadm -ln
3、测试LVS的效果
通过浏览器测试2台机器上的web内容 http://172.16.254.200 。为了区分开,我们可以把 nginx 的默认页修改一下:
在 RS1 上执行
# echo "rs1rs1" >/usr/share/nginx/html/index.html
在 RS2 上执行
# echo "rs2rs2" >/usr/share/nginx/html/index.html
注意,切记一定要在两台 RS 上设置网关的 IP 为 director 的内网 IP。另外就是要开启路由的转发功能。
七、实践LVS的DR模式
1、实验环境
三台机器:
- Director节点: (eth0 192.168.0.8 vip eth0:0 192.168.0.38)
- Real server1: (eth0 192.168.0.18 vip lo:0 192.168.0.38)
- Real server2: (eth0 192.168.0.28 vip lo:0 192.168.0.38)
2、Director 上配置脚本
# vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/sbin/ipvsadm
vip=192.168.0.38
rs1=192.168.0.18
rs2=192.168.0.28
ifconfig eth0:0 down
ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eth0:0
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 3
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
或者执行以下命令
[root@bogon ~]#echo 1 > /proc/sys/net/ipv4/ip_forward
[root@bogon ~]# ipvsadm -C
[root@bogon ~]# ipvsadm -A -t 192.168.0.38:80 -s rr #添加虚拟服务指定VIP
[root@bogon ~]#
[root@bogon ~]# ipvsadm -a -t 192.168.0.38:80 -r 192.168.0.18:80 -g #针对虚拟服务添加RS节点
[root@bogon ~]# ipvsadm -a -t 192.168.0.38:80 -r 192.168.0.28:80 -g
[root@bogon ~]# ipvsadm -L -n #查看VIP和RS是否已经配置成功
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.38:80 rr
-> 192.168.0.18:80 Route 1 0 0
-> 192.168.0.28:80 Route 1 0 0
执行脚本# bash /usr/local/sbin/lvs_dr.sh
在2台 rs 上配置脚本:
# vim /usr/local/sbin/lvs_dr_rs.sh
#! /bin/bash
vip=192.168.0.38
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
执行脚本
bash /usr/local/sbin/lvs_dr_rs.sh
参考来源:肖邦Linux
http://www.cnblogs.com/liwei0526vip/p/6370103.html