LVS-DR(Direct Routing)直接路由模式实现负载均衡

一、LVS的背景

Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大量并发访问服务的能力,因此对于大负载的服务器来讲,CPU、I/O处理能力很快会成为瓶颈。由于单台服务器的性能总是有限的,简单的提高硬件性能并不能真正解决这个问题。为此,必须采用多服务器和负载均衡技术才能满足大量并发访问的需要。Linux虚拟服务器(Linux Virtual Servers,LVS)使用负载均衡技术将多台服务器组成一个虚拟服务器。它为适应快速增长的网络访问需求提供了一个负载能力易于扩展,而价格低廉的解决方案。

二、LVS的结构和工作原理

LVS工作在一台server上提供Directory(负载均衡器)的功能,本身并不提供服务,只是把特定的请求转发给对应的realserver(真正提供服务的主机),从而实现集群环境中的负载均衡。LVS的核心组件ipvs工作在kernel中,是真正的用于实现根据定义的集群转发规则把客户端的请求转发到特定的realserver。而另一个组件ipvsadm是工作在用户空间的一个让用户定义ipvs规则的工具。

三、LVA的模式:

三种主要模式:

nat模式(LVS/NAT):LB收到用户请求包后,LB将请求包中虚拟服务器的IP地址转换为某个选定RS的IP地址,转发给RS;RS将应答包发给LB,LB将应答包中RS的IP转为虚拟服务器的IP地址,回送给用户。

直接路由模式(LVS/DR):LB收到请求包后,将请求包中目标MAC地址转换为某个选定RS的MAC地址后将包转发出去,RS收到请求包后,可直接将应答内容传给用户。此时要求LB和所有RS都必须在一个物理段内,且LB与RS群共享一个虚拟IP。

ip隧道模式(LVS/TUN):LB收到用户请求包后,根据IP隧道协议封装该包,然后传给某个选定的RS;RS解出请求信息,直接将应答内容传给用户。此时要求RS和LB都要支持IP隧道协议。

四、DR模式的原理

DR模式下调度器和服务器组都必须在物理上有一个网卡通过不分段的局域网相连,即通过交换机或者高速的HUB相连,中间没有隔有路由器。VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。

LVS-DR(Direct Routing)直接路由模式实现负载均衡

五、搭建DR模式的LVS

实验环境:

物理机:172.25.88.250

VIP:172.25.88.100

server1:172.25.88.1             #负载均衡器

server2:172.25.88.2             #后端服务器

server3:172.25.88.3             #后端服务器

1、在server1上

编辑yum源,将LoadBalancer(负载均衡)添加进去,进行特定解析

LVS-DR(Direct Routing)直接路由模式实现负载均衡

清除缓存并查看生成的yum包

yum    clean     all

yum    repoplist

LVS-DR(Direct Routing)直接路由模式实现负载均衡

安装ipvsadm(调度器)

ipvsadm是管理集群服务的命令行工具,用于管理LVS的策略规则

LVS-DR(Direct Routing)直接路由模式实现负载均衡

ipvsadm -L              #显示调度次数

LVS-DR(Direct Routing)直接路由模式实现负载均衡

ipvsadm -A -t 172.25.88.100:80 -s rr             #临时添加vip,rr轮询模式

ipvsadm -a -t 172.25.88.100:80 -r 172.25.88.2:80 -g          #给vip添加rip,使用DR模式,-g为DR模式

ipvsadm -a -t 172.25.88.100:80 -r 172.25.88.3:80 -g         

LVS-DR(Direct Routing)直接路由模式实现负载均衡

ipvsadm   -ln                 #查看策略

LVS-DR(Direct Routing)直接路由模式实现负载均衡

添加VIP到eth0上

LVS-DR(Direct Routing)直接路由模式实现负载均衡

4、启动network服务

LVS-DR(Direct Routing)直接路由模式实现负载均衡

server1上负载均衡器的配置就完成了

2、在server2上:

配置好apache,编写测试页

yum install -y httpd
vim /var/www/html/index.html
<h1>server2</h1>
/etc/init.d/httpd start

LVS-DR(Direct Routing)直接路由模式实现负载均衡

LVS-DR(Direct Routing)直接路由模式实现负载均衡

LVS-DR(Direct Routing)直接路由模式实现负载均衡

LVS-DR(Direct Routing)直接路由模式实现负载均衡

3、在server3中:

配置好apache,编写测试页

yum install -y httpd
vim /var/www/html/index.html
<h1>server3</h1>
/etc/init.d/httpd start

LVS-DR(Direct Routing)直接路由模式实现负载均衡

LVS-DR(Direct Routing)直接路由模式实现负载均衡

LVS-DR(Direct Routing)直接路由模式实现负载均衡

LVS-DR(Direct Routing)直接路由模式实现负载均衡

4、测试:

物理机中curl 172.25.88.100 访问失败

LVS-DR(Direct Routing)直接路由模式实现负载均衡

在server1中:
ip addr add 172.25.88.100/24 dev eth0
在物理机中curl 172.25.88.100 访问失败

LVS-DR(Direct Routing)直接路由模式实现负载均衡

LVS-DR(Direct Routing)直接路由模式实现负载均衡

LVS-DR(Direct Routing)直接路由模式实现负载均衡

在server1中 ipvsadm -ln 可以发现随着物理机访问172.25.88.100失败次数增多
ipvsadm -ln中InActConn数值增加,此时说明调度器配置成功。

在server2中:
ip addr add 172.25.88.100/32 dev lo

LVS-DR(Direct Routing)直接路由模式实现负载均衡

在server3中:
ip addr add 172.25.88.100/32 dev lo

LVS-DR(Direct Routing)直接路由模式实现负载均衡

在物理机中for i in {1..10};do curl 172.25.88.100;done查看轮询结果
LVS-DR(Direct Routing)直接路由模式实现负载均衡

在物理机中:
arp -an | grep 100                            #得到vip的vmac地址,此时vmac地址为server1中eth0网卡的mac地址
arp -d 172.25.88.100                        #删除现有绑定mac地址

ping 172.25.88.100                           # 重新获得ip和mac地址
arp -an | grep 100                            #查看新得到的vmac为server2或server3的eth0网卡mac地址
for i in {1..10};do curl 172.25.88.100;done      # 查看结果均为之前的server2或server3中相应的index.html文件内容

LVS-DR(Direct Routing)直接路由模式实现负载均衡

LVS-DR(Direct Routing)直接路由模式实现负载均衡

在server1中:
ipvsadm -ln 发现server2与server3两个后端仍然存在,但是物理机中访问172.25.88.100次数
增加后InActConn数值不变,此时说明没有使用调度器,直接去后端server2或server3上读取相应的index.html文件内容

LVS-DR(Direct Routing)直接路由模式实现负载均衡

5、在server2和server3中下载yum install -y arptables_jf,防止在物理机中测试时直接访问server2和server3

在server2上:

LVS-DR(Direct Routing)直接路由模式实现负载均衡

arptables   -A   -d   IN   -d    172.25.88.100    -j   DROP   #当网内广播需要这个ip时,它丢弃所有网内的请求

arptables   -A   -d   OUT    -s   172.25.88.100   -j    mangle   --mangle-ip-s   172.25.88.2  #当它自身在网内发包时,伪装为自己原本的ip172.25.88.2

LVS-DR(Direct Routing)直接路由模式实现负载均衡

/etc/init.d/arptables_jf   save      #保存添加的两条策略

LVS-DR(Direct Routing)直接路由模式实现负载均衡

/etc/init.d/iptables_jf    start       #打开iptables_jf服务

LVS-DR(Direct Routing)直接路由模式实现负载均衡

在server3上:

.安装arptables_jf工具
yum install -y arptables_jf

LVS-DR(Direct Routing)直接路由模式实现负载均衡

配置网络

LVS-DR(Direct Routing)直接路由模式实现负载均衡

LVS-DR(Direct Routing)直接路由模式实现负载均衡

保存添加的两条策略

LVS-DR(Direct Routing)直接路由模式实现负载均衡

6、测试:

在物理机中:
arp -an |grep 100                      #查看vip的mac地址
arp -d 172.25.88.100                 #删除现有绑定mac地址
for i in {1..10};do curl 172.25.88.100;done
发现循环得到server2与server3中相应的index.html文件内容

LVS-DR(Direct Routing)直接路由模式实现负载均衡

六、DR模式下LVS的健康检查

如果后端真实服务器出现问题,那么在测试端测试的时候,会返回给我们一个错误的页面,那么我们需要对后端服务器做健康检查,只返回正确的页面。

1、在server1上:

下载ldirectord安装包,使用yum安装

LVS-DR(Direct Routing)直接路由模式实现负载均衡

更改ldirectord配置文件

rpm -ql ldirectord
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
cd /etc/ha.d
ls

修改ldirectord配置文件
vim ldirectord.cf

LVS-DR(Direct Routing)直接路由模式实现负载均衡

virtual=172.25.88.100:80                   #网内向外暴露的vip
        real=172.25.88.2:80 gate          #后端真实服务器server1
        real=172.25.88.3:80 gate          #后端真实服务器server2
        fallback=127.0.0.1:80 gate       #如果后端服务器全部挂掉,只剩本机提醒用户在维护
        service=http
        scheduler=rr                                #采用round-robin轮叫算法
        #persistent=600
        #netmask=255.255.255.255
        protocol=tcp
        checktype=negotiate
        checkport=80
        request="index.html"
        #receive="Test Page"
        #virtualhost=www.x.y.z

 

LVS-DR(Direct Routing)直接路由模式实现负载均衡

安装并开启apache

当ipvsadm的后端全部down掉后可以使用自身的lo充当后端设备

LVS-DR(Direct Routing)直接路由模式实现负载均衡

开启httpd服务

LVS-DR(Direct Routing)直接路由模式实现负载均衡

编辑apache共享网页

LVS-DR(Direct Routing)直接路由模式实现负载均衡

LVS-DR(Direct Routing)直接路由模式实现负载均衡

ipvsadm   -C          #清除之前的后端服务器策略ipvsadm    -C

ipvsadm    -ln          #重新显示策略

LVS-DR(Direct Routing)直接路由模式实现负载均衡

打开健康检查服务

LVS-DR(Direct Routing)直接路由模式实现负载均衡

2、测试:物理机中 for i in {1..10};do curl 172.25.9.100;done 查看轮询结果

LVS-DR(Direct Routing)直接路由模式实现负载均衡

down掉server2的httpd,在server1上ipvsadm   -l  发现没有了server3的后端

LVS-DR(Direct Routing)直接路由模式实现负载均衡

LVS-DR(Direct Routing)直接路由模式实现负载均衡

在物理机中 for i in {1..10};do curl 172.25.88.100;done 查看轮询结果

LVS-DR(Direct Routing)直接路由模式实现负载均衡

down掉server2和server3的httpd

LVS-DR(Direct Routing)直接路由模式实现负载均衡

LVS-DR(Direct Routing)直接路由模式实现负载均衡

查看策略

LVS-DR(Direct Routing)直接路由模式实现负载均衡

在测试端测试:for  i  in  {1..10};do   curl   172.25.88.100;done查看轮询结果

LVS-DR(Direct Routing)直接路由模式实现负载均衡