企业级负载均衡集群—四层LVS(DR模式、TUN模式)
1、lvs集群
LVS(Linux Virtual Server)是Linux虚拟服务器,是一个虚拟的服务器集群系统
LVS集群中实现的IP负载均衡的三种技术:VS/NAT、VS/TUN和VS/DR
VS/NAT技术(Virtual Server via Network Address Translation):网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器;
VS/TUN (Virtual Server via IP Tunneling):针对于VS/NAT的缺点和网络服务的非对称性,通过IP隧道方法实现虚拟服务器;
VS/DR(Virtual Server via Direct Routing):通过直接路由实现虚拟服务器的方法
它们可以极大地提高系统的伸缩性
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
集群采用三层结构
一般来说,LVS集群采用三层结构,其主要组成部分为:
A、负载调度器(loadbalancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
2、lvs工作原理
lvs是工作在防火墙的INPUT链上,用户请求访问从PREROUTING到INPUT,lvs在INPUT链上强行改变数据流向,从而实现调度
当用户向负载均衡器(DS)发出请求时,调度器首先会把请求发往内核空间,然后PREROUTING链会接收到用户请求,路由前它会判断你这个ip是不是访问的我本机,确定是本机,把数据包发到INPUT链上。这时,ipvs其实就是工作在INPUT链上,当用户的请求到达INPUT链时,ipvs会把用户的请求和自己已经定义好的服务集群(server2、server3上的服务)进行比对,如果用户请求的就是我们定义的服务集群,这时ipvs会强行修改数据包的目的ip地址、端口,并且更新数据包,然后发往POSTROUTING链,接收到数据包之后,发现ip地址刚好是我们后端自己的服务器,它通过再一次路由把请求发往真正的后端web服务器(RS)
3、实现lvs调度器的DR模式
DR模式原理过程:
client—>DS(调度器)—>PREROUTIN—>INPUT—>POSTROUTING—>RS—>lo(回环接口)—>网卡eth0—>client
lvs分为两个组件:ipvs、ipvsadm
ipvs是真正的lvs生效的部分,是在内核里的一段代码
ipvsadm是策略的一个编写工具,是用来编写调度策略的
(1)安装ipvsadm服务
(2)列出当前所存在的策略(当前没有任何策略)
命令lsmod查看内核支持的模块(ip_vs基于内核路由的模块)
(3)编辑ipvsadm服务配置文件
IPVS_SAVE_ON_RESTART = “yes” 表示重启时会把你所编写的ipvs策略保存在/etc/sysconfig/ipvsadm文件中
IPVS_SAVE_ON_RESTART = “no” 表示服务在停止时不会把你所编写的ipvs策略保存在/etc/sysconfig/ipvsadm文件中
系统中没有/etc/sysconfig/ipvsadm文件,需要手动建立,若不建立,在开启ipvsadm服务时,会出错,不能开启
(4)设置DR模式的访问策略
ipvsadm -A -t 172.25.254.100:80 -s rr ##-A表示vs,设置客户端进入lvs调度器的入口地址(对外公开),-s rr调度算法为轮询
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.2:80 -g ##-a表示rs, -r真实的后端服务器地址, -g表示lvs调度器工作在DR模式(后端第一台服务器)
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.3:80 -g ##后端第二台服务器
查看策略文件,重启服务时保存策略
(5)给eth0设备上添加172.25.254.100/24ip地址(给入口添加ip100供用户访问)
在另一台主机上ping172.25.254.100,可以ping通
(6)在web1服务器(server2)与web2服务器(server3)eth0设备上也添加172.25.254.100/24ip
在web服务器上设置用户访问入口地址是为了web服务器可以直接给客户端发送资源,不需要再返回给调度器,如果不添加,用户在curl 172.25.254.100访问时会要不到资源,因为DR工作模式是client—>vs—>rs—>client,由后端服务器直接将资源返回给客户端,所以添加100ip后客户端要的资源,后端服务器直接把资源给客户端
测试:物理机上进行
先要作本地解析(之前实验已经做过)
客户端在访问时,没有实现轮询,是因为DR模式是通过修改MAC地址进行访问的,调度器和两台web服务器上都有172.25.254.100入口地址ip,所以客户端在访问时,三台主机都有可能回复它的访问,这样的情况是不被允许的,因为如果请求全部发往后端某一台真正的服务器时,这台服务器会因为访问量过大导致宕机,类似于DDOS攻击,可能会导致后端服务器瘫痪,使用户不能正常访问
第一次访问,直接访问到web2后端服务器上
用MAC地址匹配比对,查看用户访问到哪台服务器
在客户端删除刚才记录的MAC地址,再次访问,这次访问到的是调度器主机,可以轮询
如何使客户端不能直接访问到后端的两台服务器,而是必须用调度器,调度到后端两台服务器
在后端两台服务器上安装arptables服务,设置规则
(1) yum install -y arptables安装防火墙管理工具(在server2主机)
(2)arptables -L 查看设置的访问规则,当前没有规则
(3)添加规则,开启服务
arptables -A INPUT -d 172.25.254.100 -j DROP ##丢弃客户端的直接访问
arptables -A OUTPUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.2 ##让自己以172.25.254.100身份发送资源给客户端
arptables-save > /etc/sysconfig/arptables ##保存策略
cat /etc/sysconfig/arptables ##查看规则
(4)server3同server2一样设置
测试:在物理机上进行
web2和web3后端服务器不会再接收客户端的请求,客户端的访问只会由调度器接收,通过调度器访问时因为调度器中已经设置了调度规则,所以可以实现轮询(达到负载均衡效果)
清除缓存,再次访问,依然是轮询,客户端此时访问的MAC地址是lvs调度器的MAC地址
4、实现lvs调度器的TUN模式(隧道模式)
TUN模式原理:隧道模式是在原有ip报文请求的首部再封装一层ip首部([DIP:RIP]CIP:VIP)
请求流程:
Client --> DS(调度器) —>PREROUTING—> INPUT —>POSTROUTING—>RS(真正的服务器)—>lo 回环接口—> 网卡eth0 —>Client
数据包从客户端发往DS服务器,DS服务器根据调度策略确定把请求给到哪台RS,会在数据包外面再加一层IP报文首部
此时源IP从CIP(172.25.254.250)变为VIP(DIP172.25.254.100),目的IP从VIP(172.25.254.100)变为RIP(172.25.254.2/3)
数据包的请求来源就是DS调度器(172.25.254.100),请求的目的地是RS(172.25.254.2/3),RS在接收到数据包之后,请求包的来源本来是CIP(172.25.254.250),但是加了一层数据包之后变为VIP(172.25.254.100),而RS服务器上也有172.25.254.100这个ip
所以RS会把IP包的首部拆开,发现请求的数据包访问的还是自己的ip(172.25.254.2/3),这时RS就会回复客户端的请求
(1)清除DR模式的策略,添加隧道模块(tunl0当前状态是DOWN)
(2)添加VIP,**tunl0网卡
(3)添加策略,重启服务,使策略生效
ipvsadm -A -t 172.25.254.100:80 -s rr ##-A表示vs,设置客户端进入lvs调度器的入口地址(对外公开),-s rr调度算法为轮询
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.2:80 -i ##-a表示rs, -r真实的后端服务器地址, -i表示lvs调度器工作在隧道模式(后端第一台服务器)
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.3:80 -g ##后端第二台服务器
(4)在web1和web2后端服务器主机上添加隧道模块、RIP(只要状态不是DOWN,就说明已经开启)
(5)关闭反向过滤规则(rp_filter)
如果开启反向过滤规则,会对流入的数据包进行反向校验,数据包不符合反向路径规则的话,它就会把这个数据包丢弃,入包的数据是100,如果出包的数据不是100,这个数据就会被丢弃,所以将=1的项都设置为0
0:不开启源地址校验
1:开启严格的反向路径校验
关闭反向过滤规则,是为了防止web服务器不认识发来的拆包后的源ip把数据包给丢掉,导致web服务器丢包,客户端访问不到数据
sysctl -a | grep rp_filter ##查看过滤表
sysctl -w (规则)=0 ##将所有的过滤规则都关闭
sysctl -p ##使设置生效
sysctl -a | grep rp_filter ##再次查看
(6)测试:物理机上进行
隧道模式下,实现轮询效果
上一篇: 求教大大们。该如何处理
下一篇: 自动恢复MySQL数据库中日志文件实操
推荐阅读
-
LVS四层负载均衡器原理和DR模式的搭建
-
四层负载均衡LVS DR模式配置
-
企业级负载均衡集群—四层LVS(DR模式、TUN模式)
-
keepalived的原理、LVS负载均衡之DR模式+KeepAlived双机热备架构【原理和配置】
-
lvs(DR模式)高可用负载均衡
-
lvs+keepalive实现双主模式(采用DR),同时实现TCP和UDP检测实现非web端的负载均衡,同时实现跨网段的通讯
-
负载均衡集群 之 LVS (2) DR模式搭建 和 keepalived+lvs
-
应用负载均衡之LVS(三):使用ipvsadm以及详细分析VS/DR模式
-
LVS+keepalived实现高可用的DR模式负载均衡的搭建过程
-
企业级负载均衡集群——lvs之DR模式下的健康检测(二)