实现(VS/DR)负载均衡及LVS的高可用(keepalived)

一、LVS的基础知识

1、LVS的概念

  • LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。使用集群技术和Linux操作系统实现一个高性能、高可用的服务器

2、LVS的包转发策略

  • 1.NAT (Network Address Translation)模式。LB收到用户请求包后,LB将请求包中虚拟服务器的IP地址转换为某个选定RS的IP地址,转发给RS;RS将应答包发给LB,LB将应答包中RS的IP转为虚拟服务器的IP地址,回送给用户。
  • 2.IP隧道 (IP Tunneling)模式。LB收到用户请求包后,根据IP隧道协议封装该包,然后传给某个选定的RS;RS解出请求信息,直接将应答内容传给用户。此时要求RS和LB都要支持IP隧道协议。
  • 3.DR(Direct Routing)模式。LB收到请求包后,将请求包中目标MAC地址转换为某个选定RS的MAC地址后将包转发出去,RS收到请求包后,可直接将应答内容传给用户。此时要求LB和所有RS都必须在一个物理段内,且LB与RS群共享一个虚拟IP。 

3、lvs的三种模式:

  • 1.VS/NAT
  • 通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的    响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
  • 2.VS/TUN
  • 采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报 文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。
  • 3.VS/DR
  • VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上。

 

二、LVS-DR模式简介

 

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

DR模式(直接路由模式)是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求

注:要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境中

DR模式原理过程简述:

VS/DR模式的工作流程图,它的连接调度和管理与NAT和TUN中的一样,它的报文转发方法和前两种不同。DR模式将报文直接路由给目标真实服务器。在DR模式中,调度器根据各个真实服务器的负载情况,连接数多少等,动态地选择一台服务器,不修改目标IP地址和目标端口,也不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址。然后再将修改的数据帧在服务器组的局域网上发送。因为数据帧的MAC地址是真实服务器的MAC地址,并且又在同一个局域网。那么根据局域网的通讯原理,真实复位是一定能够收到由LB发出的数据包。真实服务器接收到请求数据包的时候,解开IP包头查看到的目标IP是VIP。此时只有自己的IP符合目标IP才会接收进来,所以我们需要在本地的回环借口上面配置VIP。由于网络接口都会进行ARP广播响应,但集群的其他机器都有这个VIP的lo接口,都响应就会冲突。所以我们需要把真实服务器的lo接口的ARP响应关闭掉。然后真实服务器做成请求响应,之后根据自己的路由信息将这个响应数据包发送回给客户,并且源IP地址还是VIP。

 

三、LVS-DR模式下的负责均衡

1、在server1中:

1.配置yum仓库

vim /etc/yum.repos.d/rhel-source.repo

添加

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

2.安装ipvsadm工具

yum install -y ipvsadm                                                  管理集群服务的命令行工具

 

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

3.添加vip

ipvsadm -A -t 172.25.56.156:80 -s rr                             临时添加vip,rr轮询模式
ipvsadm -a -t 172.25.56.156:80 -r 172.25.56.3:80 -g     给vip添加rip,使用DR模式 -g为DR模式
ipvsadm -a -t 172.25.56.156:80 -r 172.25.56.4:80 -g
ipvsadm -l                                                                        显示内核虚拟服务器表
ipvsadm -ln                                                                      ip方式显示内核虚拟服务器表

 

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

2、在server3中

配置apache

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

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

3、在server4中

配置好apache

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

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

4、测试

物理机中curl 172.25.56.156 访问失败

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

在server1中:ip addr add 172.25.56.156/24 dev eth0
在物理机中curl 172.25.56.156 访问失败
但此时在server1中 ipvsadm -ln 可以发现随着物理机访问172.25.56.156失败次数增多
ipvsadm -ln中InActConn数值增加,此时说明调度器配置成功

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

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

 

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

在server4中:
ip addr add 172.25.56.156/32 dev lo

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

在物理机中测试:出现轮询即成功

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

在物理机中:
arp -an | grep 156            得到vip的vmac地址,此时vmac地址为server1中eth0网卡的mac地址
arp -d 172.25.56.156       清除vmac
ping 172.25.56.156          获得新vmac
arp -an | grep 156            查看新获得的vmac
for i in {1..10};do curl 172.25.56.156;done 查看

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

在server1中:
ipvsadm -ln 发现server3与server4两个后端仍然存在,但是物理机中访问172.25.56.156次数增加后InActConn数值不变,此时说明没有使用vm调度器

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

5、隐藏RS上的VIP

DR模式工作在链路层,采用了arp协议,rs表示realserver,vs表示vitrualserver,假设client的ip为cip,mac地址为m1,调度器vs的ip为vip,mac地址为m2,后端服务器的ip为rip,mac地址为m3,由于DR模式工作在数据链路层,没有经过路由器,所以vs和rs必须在同一个网段,当client访问vip时,在DR模式下,vs通过它本身的一些算法m2改为m3,这样就可以实现直接将数据包丢给rs(这里rs上必须有vip,因为客户端访问的是vip),rs通过解封,得到了vip,通过与自己vip匹配判断数据包确实是给自己的,rs在通过封装,直接将数据发给client,数据包不用原路返回)。由于vs和rs上都有vip,会有冲突,因此这里我们应用arptables协议,在rs上添加策略,控制数据传输

 

此时有两种方法可以解决,本次实验采用第二种方法

通过arptables_jf工具更改网络

在server3中:

1.安装arptables_jf工具

yum install -y arptables_jf  -y

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

2.配置网络

arptables -A IN -d 172.25.56.156 -j DROP  

注:由于在同一个Vlan中不同机器中相同ip会冲突,此时使用arp火墙将vip拦截

arptables -A OUT -s 172.25.56.156 -j mangle --mangle-ip-s 172.25.56.3    将rip伪装成vip

arptables -L

 

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

3.保存配置

/etc/init.d/arptables_jf save    保存arp火墙配置信息

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

在server4中:

1.安装arptables_jf工具
yum install  arptables_jf   -y

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

2.配置网络

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

3.保存配置

/etc/init.d/arptables_jf save

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

6、测试:

在物理机中:
arp -an |grep 156          查看vip的vmac
arp -d 172.25.56.156    清除vip的vmac

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

四、健康检查

ldirectord是专门为LVS监控而编写的,用来监控lvs架构中服务器池(server pool) 的服务器状态。 
ldirectord 运行在 IPVS 节点上, ldirectord作为一个守护进程启动后会对服务器池中的每个真实服务器发送请求进行监控,如果服务器没有响应 ldirectord 的请求,那么ldirectord 认为该服务器不可用, ldirectord 会运行 ipvsadm 对 IPVS表中该服务器进行删除,如果等下次再次检测有相应则通过ipvsadm 进行添加

 

1、在server1中:

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

yum install  ldirectord-3.9.5-3.1.x86_64.rpm  -y

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

2.更改ldirectord配置文件

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

更改其中virtual内容如下:

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

3.安装并开启apache

yum install httpd -y

/etc/init.d/httpd start

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

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

4.配置apache共享网页

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

5.清除ipvsadm缓存

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

6.启动ldirectord工具

/etc/init.d/ldirectord start
ipvsadm -l

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

2、测试

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

在server3中:down掉server3, /etc/init.d/httpd stop
在server1中: ipvsadm -l 可发现无后端server3
在物理机中 for i in {1..10};do curl 172.25.56.156;done 查看轮询结果
仅有server4中index.html文件内容

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

3、server4中

在server4中:down掉server3, /etc/init.d/httpd stop
在server1中: ipvsadm -l 可发现无后端server4,仅存在server1中的lo
在物理机中 for i in {1..10};do curl 172.25.56.156;done 查看轮询结果
仅有server1中文件内容

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

4、server3中

/etc/init.d/httpd start
在server1中: ipvsadm -l 可发现后端server3出现,无sever1中的lo
在物理机中 :for i in {1..10};do curl 172.25.56.156;done 查看轮询结果
仅有server3中index.html文件内容

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

5、server4中

/etc/init.d/httpd start
在server1中: ipvsadm -l 可发现后端server4出现
在物理机中: for i in {1..10};do curl 172.25.56.156;done 查看轮询结果
循环得到server3与server4中的index.html文件内容

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

五、lvs(keepalived)实现服务高可用

Keepalived主要有如下3个功能: 
1)管理LVS负载均衡软件 
2) 实现对LVS集群节点的健康检查功能 
3)作为系统网络服务的高可用功能 

LVS ‐ ACTIVE:    172.25.56.1
LVS ‐ BACKUP:  172.25.56.4
LVS ‐ VIP:   172.25.56.156
Realsever:  172.25.56.2     172.25.56.3

 

1、server1中关闭ldirectord

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

2、主备机上的软件包安装与配置

1.在server1中:

yum install  openssl-devel  -y

yum install  openssl-devel mailx -y

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

./configure --prefix=/usr/local/keepalived --with-init=SYSV        转换成二进制可执行文件

make                编译

make install     安装

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

vim /etc/keepalived/keepalived.conf

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

/etc/init.d/keepalived start

cat /var/log/messages

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

scp -r /usr/local/keepalived/ server4:/usr/local

scp /etc/yum.repos.d/rhel-source.repo server4:/etc/yum.repos.d/

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

2.server4中:

yum install ipvsadm  mailx -y

chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived

ln -s /usr/local/keepalived/sbin/keepalived /sbin/
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/etc/keepalived /etc/

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

vim /etc/keepalived/keepalived.conf

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

/etc/init.d/keepalived start
cat /var/log/messages

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

3、测试:

1. 高可用测试:停止 master 上的 keepalived 服务,看 backup 是否接管

 

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

2. 负载均衡测试

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

3. 故障测试:关闭 realserver 上的 httpd 服务,Keepalived 监控模块是否能及时发现,
然后屏蔽故障节点,同时将服务转移到正常节点来执行

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

六、lvs(keepalived)应用

1、一个vip拥有两个端口在两台主机上负载均衡

1.在server2中:

yum install vsftpd -y

/etc/init.d/vsftpd star

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

2.在server3中:

yum install vsftpd -y

/etc/init.d/vsftpd start

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

 

3.在server1中:

vim /etc/keepalived/keepalived.conf

在之前配置好文件中的最后添加如下内容:

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

/etc/init.d/keepalived restart

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

4.在server4中:

vim /etc/keepalived/keepalived.conf

添加与server1中/etc/keepalived/keepalived.conf同样的内容

/etc/init.d/keepalived restart

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

5.测试:

物理机中查看是否达到负载均衡并且物理机lftp vip,查看是否能够查看共享目录

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

高可用测试:停止 master 上的 keepalived 服务,观察 backup 是否接管

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

2、在两台主机上二个vip拥有两个端口互为主备实现负载均衡

1.server1中:

vim /etc/keepalived/keepalived.conf

修改

将ip172.25.56.156更改为172.25.56.200  以便lftp 172.25.56.200时可以成功共享目录

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

添加

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

2.server4中:

vim /etc/keepalived/keepalived.conf

修改

将ip172.25.56.156更改为172.25.56.200  以便lftp 172.25.56.200时可以成功共享目录

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

添加

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

3.server2中

ip addr add 172.25.56.200/32 dev lo

arptables -A IN -d 172.25.56.200 -j DROP

arptables -A OUT -s 172.25.56.200 -j mangle --mangle-ip-s 172.25.56.2

/etc/init.d/arptables_jf save

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

vim  /etc/sysconfig/arptables

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

4.server3中:

ip addr add 172.25.56.200/32 dev lo

arptables -A IN -d 172.25.56.200 -j DROP

arptables -A OUT -s 172.25.56.200 -j mangle --mangle-ip-s 172.25.56.3

/etc/init.d/arptables_jf save

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

vim  /etc/sysconfig/arptables

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

5.测试:

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

 

高可用测试:停止 master 上的 keepalived 服务,观察backup 是否接管

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)

实现(VS/DR)负载均衡及LVS的高可用(keepalived)