运维ipvsadm配置负载均衡2
一、什么是lvs
1、lvs的定义
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。是由章文嵩博士开发的一款开源软件,1998年5月发布,是中国国内最早出现的自由软件项目之一。
LVS工作在一台server上提供Directory(负载均衡器)的功能,本身并不提供服务,只是把特定的请求转发给对应的realserver(真正提供服务的主机),从而实现集群环境中的负载均衡。LVS的核心组件ipvs工作在kernel中,是真正的用于实现根据定义的集群转发规则把客户端的请求转发到特定的realserver。而另一个组件ipvsadm是工作在用户空间的一个让用户定义ipvs规则的工具。故我们只要在server上装了ipvsadm软件包就可以定义ipvs规则,而在linux kernel的2.6版本之后kernel是直接支持ipvs的。
2、LVS的模型中的主要角色:
调度器:Director,又称为Dispatcher,Balancer,调度器主要用于接受用户请求。
真实主机:Real Server,简称为RS,用于真正处理用户的请求。
Director Virtual IP:调度器用于与客户端通信的IP地址,简称为VIP
Real Server : 后端主机的用于与调度器通信的IP地址,简称为RIP。
3、lvs的三种模式:
在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation),大多数商品化的IP负载均衡调度器产品都是使用此方法,如Cisco的LocalDirector、F5的Big/IP和Alteon的ACEDirector。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。所以,IPVS软件实现了这三种IP负载均衡技术,它们的大致原理如下:
1)Virtual Server via Network Address Translation(VS/NAT)
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
2)Virtual Server via IP Tunneling(VS/TUN)
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报 文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。
3)Virtual Server via Direct Routing(VS/DR)
VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上。
4、LVS 的负载调度算法:
在内核中的连接调度算法上,IPVS 已实现了以下八种调度算法:
1)轮叫调度(Round-Robin Scheduling )
轮叫调度(Round Robin Scheduling)算法就是以轮叫的方式依次将请求调度不同的服务器,即每次调度执行 i = (i + 1) mod n,并选出第 i 台服务器。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。
2)加权轮叫调度(Weighted Round-Robin Scheduling )
加权轮叫调度 (Weighted Round-Robin Scheduling)算法可以解决服务器间性能不一的情况,它用相应的权值表示服务器的处理性能,服务器的缺省权值为 1。假设服务器 A 的权值为 1,B 的 权值为 2,则表示服务器 B 的处理性能是 A 的两倍。加权轮叫调度算法是按权值的高低和轮叫方式分配请求到各服务器。权值高的服务器先收到的连接,权值高的服务器比权值低的服务器处理更多的连接,相同权值的服务器处理相同数目的连接数。
3)最小连接调度(Least-Connection Scheduling )
最小连接调度(Least- Connection Scheduling)算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态调度算法,它通过服务器当前所活跃的连接数来估计服务器的负载情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加 1;当连接中止或超时,其连接数减一。
4)加权最小连接调度(Weighted Least-Connection Scheduling)
加权最小连接调 度(Weighted Least-Connection Scheduling)算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为 1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。
5)基于局部性的最少链接(Locality-Based Least Connections Scheduling)
基于局部性的最少链接调度(Locality-Based Least Connections Scheduling,以下简称为LBLC)算法是针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率,从而整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址 找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于其一半的工作负载,则用 “最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
6)带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
带复制的基于局部性最少链接调度(Locality-Based Least Connections with Replication Scheduling,以下简称为 LBLCR)算法也是针对目标IP地址的负载均衡,目前主要用于Cache 集群系统。它与LBLC算法的不同之处是它要 维护从一个目标IP地址到一组服务器的映射,而 LBLC 算法维护从一个目标IP地址到一台服务器的映射。对于一个“热门”站点的服务请求,一台Cache服务器可能会忙不过来处理这些请求。这时,LBLC调度算法会从所有的Cache 服务器中按“最小连接”原则选出一台Cache服务器,映射该“热门”站点到这台Cache服务器,很快这台Cache服务器也会超载,就会重复上述过程选出新的Cache服务器。这样,可能会导致该“热门”站点的映像会出现在所有的Cache服务器上,降低了Cache服务器的使用效率。LBLCR调度算法将“热门”站点映射到一组Cache服务器(服务器集合),当该“热门”站点的请求负载增加时,会增加集合里的Cache服务器,来处理不断增长的负载;当该“热门”站点的请求负载降低时,会减少集合里的Cache服务器数目。这样,该“热门”站点的映像不太可能出现在所有的Cache服务器上,从而提供Cache集群系统的使用效率。LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服 务器从服务器组中删除,以降低复制的程度。
7)目标地址散列调度(Destination Hashing Scheduling )
目标地址散列调度(Destination Hashing Scheduling)算法也是针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否
则返回空。
8)源地址散列调度(Source Hashing Scheduling)
源地址散列调度(Source Hashing Scheduling)算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。它的算法流程与目标地址散列调度算法的基本相似,除了将请求的目标IP地址换成请求的源IP地址,所以这里不一一叙述。在实际应用中,源地址散列调度和目标地址散列调度可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口。
二、LVS-DR模式简介
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模式下的负责均衡
实验环境:
物理机:172.25.16.250
vip:172.25.16.100
server1(主VS):172.25.16.3
server2(从VS):172.25.16.4
server3(RS):172.25.16.1
server4(RS):172.25.16.2
1.调度器
【vm3:172.25.16.3】
1)配置yum源,安装[LoadBalancer]组包
[root@vm3 ~]# vim /etc/yum.repos.d/rhel-source.repo
[LoadBalancer]
name = LoadBalancer
baseurl=http://172.25.16.250/rhel6.5/LoadBalancer
gpgcheck=0
[root@vm3 ~]# yum repolist
2)下载负载均衡添加策略软件
[root@vm3 ~]# yum install ipvsadm.x86_64
[root@vm3 ~]# ipvsadm -l
3)添加目的IP:vip
[root@vm3 ~]# ip addr add 172.25.16.100/24 dev eth0
[root@vm3 ~]# ip addr show
4)配置后端服务器策略
[root@vm3 ~]# ipvsadm -A -t 172.25.16.100:80 -s rr ###使用的调度算法,算法为rr(round robin)
[root@vm3 ~]# ipvsadm -a -t 172.25.16.100:80 -r 172.25.16.2:80 -g
##给vip添加rip,-g指定LVS工作模式为DR直接路由模式;-m NAT模式;-t说明虚拟服务器提供的是tcp服务
[root@vm3 ~]# ipvsadm -a -t 172.25.16.100:80 -r 172.25.16.1:80 -g
[root@vm3 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.16.100:http rr
-> server1:http Route 1 0 0 ##这里会显示调度次数
-> server2:http Route 1 0 0
[root@vm3 ~]# /etc/init.d/ipvsadm save
注:如果配置策略出错,用ipvsadm -C 命令清空
2.后端服务器1
【vm2:172.25.15.2】
1)添加vip(D类ip) -------->>>私有IP,不对外
[root@vm2 ~]# ip addr add 172.25.16.100/32 dev eth0
[root@vm2 ~]# ip addr show
2)httpd服务
[root@vm2 ~]# cd /var/www/html/
[root@vm2 html]# vim index.html
vm2
mac地址:52:54:00:fc:12:0c
[root@vm2 html]# /etc/init.d/httpd start
3.后端服务器2
【vm2:172.25.15.1】
1)添加vip(D类ip) ------->>>IP不对外
[root@vm1 ~]# ip addr add 172.25.16.100/32 dev eth0
[root@vm1 ~]# ip addr show
2)httpd服务
[root@vm1 ~]# cd /var/www/html/
[root@vm1 html]# rm -fr *
[root@vm1 html]# vim index.html
vm1
mac地址:52:54:00:1d:a8:1c
[root@vm1 html]# vim /etc/httpd/conf/httpd.conf #将端口改回除时80端口
[root@vm1 html]# /etc/init.d/httpd restart
测试:
此时,两个后端服务器已经开始轮询,但mac地址是随机的,ARP协议在数据链路层广播vip时,谁应答快就是谁的MAC
[root@foundation16 ~]# arp -d 172.25.16.100 ###清空之前调度
[root@foundation16 ~]# curl 172.25.16.100
vm1
mac地址:52:54:00:1d:a8:1c
[root@foundation16 ~]# curl 172.25.16.100
vm2
mac地址:52:54:00:fc:12:0c
[root@foundation16 ~]# curl 172.25.16.100
vm1
mac地址:52:54:00:1d:a8:1c
[root@foundation16 ~]# arp -an | grep 100
? (172.25.16.100) at 52:54:00:10:67:2a [ether] on br0
[root@foundation16 ~]# arp -an | grep 100
? (172.25.16.100) at 52:54:00:1d:a8:1c [ether] on br0 #随机,谁应答就是谁的mac地址
四、DR模式的ARP协议在数据链路层广播vip时,后台服务器不响应,不接受请求。由调度器分配
1.后台服务器vm2:
[root@vm2 html]# yum search arptable
[root@vm2 html]# yum install arptables_jf.x86_64 -y
[root@vm2 html]# arptables -A IN -d 172.25.16.100 -j DROP ##当访问虚拟IP172.25.16.100时,扔掉,不相应
[root@vm2 html]# arptables -A OUT -s 172.25.16.100 -j mangle --mangle-ip-s 172.25.16.2 ##当访问172.25.16.100时返回本机ip
##由于tcp三次握手,出去时仍要以vip地址形式才会握手,而真正将数据传输给客户端的就是真实服务器,mangle就是这个功能
[root@vm2 html]# /etc/init.d/arptables_jf save ##保存策略
2.后台服务器vm1
[root@vm1 html]# yum install arptables_jf.x86_64 -y
[root@vm1 html]# arptables -A IN -d 172.25.16.100 -j DROP
[root@vm1 html]# arptables -A OUT -s 172.25.16.100 -j mangle --mangle-ip-s 172.25.16.1
[root@vm1 html]# /etc/init.d/arptables_jf save
测试:
[root@foundation16 ~]# arp -d 172.25.16.100
[root@foundation16 ~]# curl 172.25.16.100
vm1
mac地址:52:54:00:1d:a8:1c
[root@foundation16 ~]# curl 172.25.16.100
vm2
mac地址:52:54:00:fc:12:0c
[root@foundation16 ~]# curl 172.25.16.100
vm1
mac地址:52:54:00:1d:a8:1c
[root@foundation16 ~]# arp -an | grep 100
? (172.25.16.100) at 52:54:00:10:67:2a [ether] on br0
[root@vm3 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.16.100:http rr
-> server1:http Route 1 0 2
-> server2:http Route 1 0 1
五、对后台服务器健康检查
调度器可对后端服务器进行健康检查。哪台挂了,调度器就不再给他分配。若所有服务器都坏了,则调度器自己顶上
1.首先要清空ipvsadm
[root@vm3 ~]# ipvsadm -C
[root@vm3 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
2.配置高可用yum源
[root@vm3 ~]# vim /etc/yum.repos.d/rhel-source.repo
[HighAvailability]
name = HighAvailability
baseurl=http://172.25.16.250/rhel6.5/HighAvailability
gpgcheck=0
[root@vm3 ~]# yum repolist
3.取包
[root@foundation16 Desktop]# lftp 172.25.0.250
lftp 172.25.0.250:~> cd pub/
lftp 172.25.0.250:/pub> cd lvs/
lftp 172.25.0.250:/pub/lvs> get ldirectord-3.9.5-3.1.x86_64.rpm
[root@foundation16 Desktop]# scp /home/kiosk/Desktop/ldirectord-3.9.5-3.1.x86_64.rpm root@172.25.16.3:/root
4.安装可健康检查的软件
[root@vm3 ~]# yum install ldirectord-3.9.5-3.1.x86_64.rpm -y
[root@vm3 ~]# rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm ###看软件的配置文件
5.编辑配置文件
[root@vm3 ~]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
[root@vm3 ~]# vim /etc/ha.d/ldirectord.cf
virtual=172.25.16.100:80 ###vip
real=172.25.16.2:80 gate ###真实服务器
real=172.25.16.1:80 gate ###真实服务器
fallback=127.0.0.1:80 gate ###调度器自己
service=http
scheduler=rr
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=80
request="index.html"
# receive="Test Page"
# virtualhost=www.x.y.z
[root@vm3 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@vm3 ~]# /etc/init.d/ldirectord start ###开软件
[root@vm3 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.16.100:http rr
-> server1:http Route 1 0 0
-> server2:http Route 1 0 0
测试1:vm1挂,vm2好
[root@vm1 html]# /etc/init.d/httpd stop
[root@vm3 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.16.100:http rr
-> server2:http Route 1 0 0 ###只有vm2好
[root@foundation16 Desktop]# curl 172.25.16.100
vm2
mac地址:52:54:00:fc:12:0c
[root@foundation16 Desktop]# curl 172.25.16.100
vm2
mac地址:52:54:00:fc:12:0c
[root@foundation16 Desktop]# arp -an | grep 100
? (172.25.16.100) at 52:54:00:10:67:2a [ether] on br0
测试2:vm1和vm2都挂
[root@vm2 html]# /etc/init.d/httpd stop
[root@vm3 ~]# /etc/init.d/httpd start
[root@vm3 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.16.100:http rr
-> localhost:http Local 1 0 0 ##两个都挂了,调度器顶上
[root@foundation16 Desktop]# curl 172.25.16.100
vm3 /www
[root@foundation16 Desktop]# curl 172.25.16.100
vm3 /www
[root@foundation16 Desktop]# arp -an | grep 100
? (172.25.16.100) at 52:54:00:10:67:2a [ether] on br0
测试3:vm2挂,vm1好
[root@vm1 html]# /etc/init.d/httpd start
[root@vm3 html]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.16.100:http rr
-> server1:http Route 1 0 0 ##当有一个服务器好了,立马替换掉调度器
[root@foundation16 Desktop]# curl 172.25.16.100
vm1
mac地址:52:54:00:1d:a8:1c
[root@foundation16 Desktop]# curl 172.25.16.100
vm1
mac地址:52:54:00:1d:a8:1c
[root@foundation16 Desktop]# arp -an | grep 100
? (172.25.16.100) at 52:54:00:10:67:2a [ether] on br0
六、用keepalived实现服务高可用(主从lvs调度器)
1.取包
[root@foundation16 Desktop]# lftp 172.25.0.250
lftp 172.25.0.250:~> cd pub/lvs/
lftp 172.25.0.250:/pub/lvs> get keepalived-2.0.6.tar.gz
853859 bytes transferred
lftp 172.25.0.250:/pub/lvs> get libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm
[root@foundation16 Desktop]# scp /home/kiosk/Desktop/keepalived-2.0.6.tar.gz root@172.25.16.3:/root
[root@foundation16 Desktop]# scp /home/kiosk/Desktop/libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm root@172.25.16.3:/root
2.keepalived软件的依赖性
[root@vm3 html]# cd /root
[root@vm3 ~]# tar zxf keepalived-2.0.6.tar.gz
[root@vm3 ~]# cd keepalived-2.0.6
[root@vm3 keepalived-2.0.6]# ./configure --with-init=SYSV --prefix=/usr/local/keepalived
##源码编译;--with-init启动脚本;--prefix放在哪
[root@vm3 keepalived-2.0.6]# yum install gcc -y ##解决依赖
[root@vm3 keepalived-2.0.6]# yum install openssl-devel -y ##解决依赖
[root@vm3 keepalived-2.0.6]# yum install libnl libnl-devel -y ##解决依赖
[root@vm3 ~]# yum install libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm -y ##解决依赖
3.完成编译、安装
[root@vm3 keepalived-2.0.6]# cd keepalived-2.0.6 ##必须切换到keepalived-2.0.6目录下,才可编译
[root@vm3 keepalived-2.0.6]# ./configure --with-init=SYSV --prefix=/usr/local/keepalived
[root@vm3 keepalived-2.0.6]# make && make install ##必须编译成功再安装
4.关闭原有调度,因keepalived软件配置文件中写有调度策略
[root@vm3 keepalived-2.0.6]# /etc/init.d/ldirectord stop
[root@vm3 keepalived-2.0.6]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
5.创建链接
[root@vm3 keepalived-2.0.6]# cd keepalived
[root@vm3 keepalived]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ ##可通过/etc/init.d/keepalived开关服务
[root@vm3 keepalived]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@vm3 keepalived]# ln -s /usr/local/keepalived/etc/keepalived /etc
[root@vm3 keepalived]# ln -s /usr/local/keepalived/sbin/keepalived /sbin
[root@vm3 keepalived]# chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived
6.对备调度器vm4进行相同设置
[root@vm3 keepalived]# scp /etc/yum.repos.d/rhel-source.repo root@172.25.16.4:/etc/yum.repos.d/rhel-source.repo
[root@vm4 ~]# yum repolist
[root@vm3 local]# scp -r /usr/local/keepalived/ root@172.25.16.4:/usr/local/
[root@vm4 ~]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@vm4 ~]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@vm4 ~]# ln -s /usr/local/keepalived/etc/keepalived /etc
[root@vm4 ~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin
[root@vm4 ~]# chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived
7.取消原设置的vip,因keepalived软件配置文件中写有自动设置vip
[root@vm3 local]# ip addr del 172.25.16.100/24 dev eth0
[root@vm3 local]# ip addr show
8.配置主调度器vm3的keepalived软件的主配置文件,并开启软件
[root@vm3 local]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost ###节点宕机给谁发邮件
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 66 ###自己独有,与同一vlan内其他不同
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.16.100
}
}
virtual_server 172.25.16.100 80 {
delay_loop 3 #当rs报错时,尝试多少次后才邮件告知
lb_algo rr
lb_kind DR
# persistence_timeout 50
protocol TCP
real_server 172.25.16.1 80 {
TCP_CHECK {
weight 1
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.16.2 80 {
TCP_CHECK {
weight 1
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
[root@vm3 local]# /etc/init.d/keepalived start
9.配置从调度器vm4的keepalived软件的主配置文件,并开启软件
[root@vm3 local]# scp -r /etc/keepalived/keepalived.conf root@172.25.16.4:/etc/keepalived/
[root@vm4 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 66
priority 50 ##小于主调度器
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.16.100
}
}
[root@vm4 ~]# yum install ipvsadm -y
[root@vm4 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@vm4 ~]# /etc/init.d/keepalived start
检测1:当主vm3好时,vm4不起作用
[root@vm3 local]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:10:67:2a brd ff:ff:ff:ff:ff:ff
inet 172.25.16.3/24 brd 172.25.16.255 scope global eth0
inet 172.25.16.100/32 scope global eth0 ###keepalived软件自动设置vip
inet6 fe80::5054:ff:fe10:672a/64 scope link
valid_lft forever preferred_lft forever
[root@vm3 local]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.16.100:http rr
-> server1:http Route 1 0 0
-> server2:http Route 1 0 0
[root@vm4 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:25:c4:7c brd ff:ff:ff:ff:ff:ff
inet 172.25.16.4/24 brd 172.25.16.255 scope global eth0 ##不启用的调度器,未自动配vip
inet6 fe80::5054:ff:fe25:c47c/64 scope link
valid_lft forever preferred_lft forever
You have mail in /var/spool/mail/root ###提醒有邮件
[root@foundation16 Desktop]# curl 172.25.16.100
vm2
mac地址:52:54:00:fc:12:0c
[root@foundation16 Desktop]# curl 172.25.16.100
vm1
mac地址:52:54:00:1d:a8:1c
检测2:当vm3坏时,vm4立马自动接上
[root@vm3 local]# /etc/init.d/keepalived stop
[root@vm3 local]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:10:67:2a brd ff:ff:ff:ff:ff:ff
inet 172.25.16.3/24 brd 172.25.16.255 scope global eth0
inet6 fe80::5054:ff:fe10:672a/64 scope link
valid_lft forever preferred_lft forever
[root@vm4 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:25:c4:7c brd ff:ff:ff:ff:ff:ff
inet 172.25.16.4/24 brd 172.25.16.255 scope global eth0
inet 172.25.16.100/32 scope global eth0 ##########ip飘移
inet6 fe80::5054:ff:fe25:c47c/64 scope link
valid_lft forever preferred_lft forever
[root@foundation16 Desktop]# curl 172.25.16.100
vm2
mac地址:52:54:00:fc:12:0c
[root@foundation16 Desktop]# curl 172.25.16.100
vm1
mac地址:52:54:00:1d:a8:1c
检测3:当主vm3好后,自动接替vm4
[root@vm3 local]# /etc/init.d/keepalived start
[root@vm3 local]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:10:67:2a brd ff:ff:ff:ff:ff:ff
inet 172.25.16.3/24 brd 172.25.16.255 scope global eth0
inet 172.25.16.100/32 scope global eth0 #########ip飘移
inet6 fe80::5054:ff:fe10:672a/64 scope link
valid_lft forever preferred_lft forever
[root@foundation16 Desktop]# curl 172.25.16.100
vm2
mac地址:52:54:00:fc:12:0c
[root@foundation16 Desktop]# curl 172.25.16.100
vm1
mac地址:52:54:00:1d:a8:1c
注意:keepalived带有后台服务器健康检测功能
注 :若想看发送的邮件
[root@vm3 local]# yum install mailx -y
[root@vm3 local]# mail