一.LVS的基本概念
1.lvs的定义
-
LVS的全称是Linux virtual server,即Linux虚拟服务器,它是封装在linux的内核中的。之所以是虚拟服务器,是因为LVS自身是个负载均衡器,不接受处理请求,而是将请求转发至位与它后端真正的服务器realserver上。
-
LVS是四层(传输层tcp/udp),七层(应用层)的负载均衡工具,只不过大众一般都使用它的四层负载均衡功能ipvs,而七层的内容分发负载工具ktcpvs(kernel tcp virtual server)不怎么完善,使用的人并不多。
-
ipvs是集成在内核中的框架,可以通过用户空间的程序ipvsadm工具来管理,该工具可以定义一些规则来管理内核中的ipvs。就像iptables和netfilter关系一样。
2.LVS-ipvs相关的几种IP
- VIP:virtual IP:LVS服务器上接收外网数据包的网卡IP地址
- DIP:director IP:LVS服务器上转发数据包到realserver的网卡IP地址
- RIP:realserver(简称RS)上接收Director转发数据包的IP,即提供服务的服务器的IP。
- CIP:客户端的IP
二.LVS模式(DR)
1.DR模式的基本概念
- DR(Direct Routing)模式为直接路由模式
- 调度器对数据包的处理是改写数据帧的目标MAC地址,通过链路层来负载均衡。
- DR通过改写请求报文的目标MAC地址,将请求发送到真实服务器,而真实服务器则将响应直接返给用户。
- 要求调度器与真实服务器都有一块网卡连在同一物理网段上,以便使用MAC地址通信转发数据包。
2.DR模式工作原理
- (1)客户端发送请求被director接收后,director根据负载均衡算法改写数据帧的目标MAC地址为后端某RS的MAC地址,并将该数据包转发给该RS(实际上是往整个局域网发送,但只有该MAC地址的RS才不会丢弃)
- (2)RS接收到数据包后,发现数据包的目标IP地址为VIP,而RS本身已经将VIP配置在了自身的某个接口上,因此RS会接收这个数据包并进行处理。
- (3)处理完毕后,RS直接将响应报文响应给客户端。此时数据包源IP为VIP,目标IP为CIP。
3.DR模式时的基本属性和要求
- Realserver的RIP和Director的DIP必须处于同一网段中,以便使用MAC地址进行通信。
- realserver上必须配置VIP地址,以便接收director转发过来的数据包,以及作为响应报文的源IP。
- realserver响应给客户端的数据包的源和目的IP为VIP—>CIP
- director只处理入站请求,响应请求由realserver完成。
三.模拟DR模式的实现
1.实验环境
主机(IP) | 服务 |
---|
server1(172.25.254.1) | lvs调度器(Virulserver) |
server2(172.25.254.2) | realserver |
server3(172.25.254.3) | realserver |
2.实现如下
server1:
[root@server1 yum.repos.d]# vim rhel-source.repo
文件后面添加:
[LoadBalancer]
name = LoadBalancer
baseurl = http://172.25.13.250/file/LoadBalancer ##默认的安装软件是在镜像下的Package安装包里面,所以在yun源需要加入lvs的安装包
gpgcheck = 0
[root@server1 yum.repos.d]# yum install -y ipvsadm
[root@server1 yum.repos.d]# ipvsadm -l ##查看策略
[root@server1 yum.repos.d]# lsmod #内核模块,如果没有该模块可以安装该模块
modprobe 模块名 #安装该模块
[root@server1 yum.repos.d]# ipvsadm -A -t 172.25.254.100:80 -s rr ##添加轮询策略
[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.2 -g ##-g表示给真实服务器添加DR策略
[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.3 -g
[root@server1 yum.repos.d]# /etc/init.d/ipvsadm save ##保存策略
[root@server1 yum.repos.d]# ip addr add 172.25.13.100/24 dev eth0 ##添加VIP网卡
- (4)如果开了varnish则要关掉该服务,因为varnish使用的也是80端口,会与ipvsadm冲突
server2,server3:
server2:
[root@server2 html]# ip addr add 172.25.13.100/32 dev eth0 ##设置32位是为了防止别人链接到服务器,则调度器就没有意义了
server3:
同server2的配置相同
3.检测如下:
- 在server1上(ipvsadm)
- 在物理机上(IP为172.25.254.77与realserver的IP处于同一网段)
发现没有在server2,和server3上轮询。
原因如下:
a.以上情况server1,server2,server3都能被访问到
b.如果绑定i的MAC地址为server1也就是lvs服务器,则在server2,server3上轮询是没有错的
c.如果绑定的MAC地址是server2或者server3则就会出现上述情况,即在测试端不会形成论叫而是直接去了MAC绑定的后端服务器,这在企业当中也是不被允许的。
a.查看发现物理机的MAC地址与server2的相同
3.解决绑定MAC地址只为virtualserver即只为server1如下:
(1)解决如下:
需要配置server2,server3的路由策略
yum install arptables_jf -y #server2,server3都需要下载
#当网络1广播需要172.25.254.100时它丢弃所有的网内请求
[root@server2 html]# arptables -A IN -d 172.25.254.100 -j DROP
#当它自身需要在网内发包时,伪装为自己原来的Ip172.25.254.2
[root@server2 html]# arptables -A OUT -s 172.25.13.100 -j mangle --mangle-ip-s 172.25.13.2
[root@server2 html]# arptables -nL
[root@server2 html]# /etc/init.d/arptables_jf save#保存策略
[root@server2 html]# /etc/init.d/arptables_jf start#开启服务
配置同server2相同
(2)再次测试如下:
[root@foundation13 yum.repos.d]# arp -d 172.25.254.100 #把该模式关掉
[root@foundation13 yum.repos.d]# curl 172.25.13.100 ##再次访问发现是轮询调度,并且查看MAC地址的话也是server1上的虚拟IP的MAC
发现在server2和server3之间轮询调度
- 在server1上查看,发现有server2和server3的访问次数
- 物理机的MAC地址与server1的MAC地址一致