1.LVS简介
LVS的是Linux Virtual Server的简写,翻译为Linux虚拟服务器,即一个虚拟的服务器集群系统,
是由我国章文嵩博士在1998年5月所研究成立,也是中国国内最早出现的自由软件项目之一。
2.LVS的组成
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm
1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
3.LVS相关的几种IP
VIP :(virtual IP) LVS服务器上接收外网数据报文的网卡IP地址
DIP: (director IP) LVS服务器上发送数据报文到real server的网卡IP地址
RIP :(real server) 真实服务器上的IP,即提供服务的服务器IP(常简称为RS)
CIP :(client IP ) 客户端的IP
1.DR模式原理
图解:
原理简述:
每个RS(Real Server)上都有两个IP:VIP和RIP,但是VIP是隐藏的,即不能提供解析等功能,
只是用来做请求回复的源IP的,Director(VS)上只需要一个网卡,在该网卡上配置两个IP:VIP和DIP,
在VS接收到客户端的请求后,VS根据负载算法选择一台RS的网卡mac作为客户端请求包中的目标mac,
通过arp转交给后端RS处理,后端RS再通过自己的路由网关回复给客户端client。
工作模式:
client ----> vs ----> rs ----> clientvs: virtual server (虚拟服务器)
rs: real server (真实服务器)
2.DR模式特点
1.各DIP(VS)必须与 RIP(RS) 在同一局域网内(即具有相同的广播域),且两个有相同的目标地址(vip);
2.RS的RIP可以使用私有地址,也可以使用公网地址,以方便配置;不支持支持端口映射;
3.RS可以使用必须为uninx操作系统(OS);且RS需要配置vip但不做响应;
4.Director(VS)仅负责处理入站请求,响应报文由RS( Real server) 直接发往客户端;
5.Real server(RS)不能将网关指向DIP(DS),而直接使用前端网关响应请求报文;
3.DR模式优缺点
优点:
负载均衡器VS只负责将请求包分发给物理服务器RS,而物理服务器RS将应答包直接发给用户。所以,负载均衡器VS能处理很巨大的请求量。
这种方式,一台负载均衡能为超过100台的物理服务器服务,负载均衡器不再是系统的瓶颈。
使用LVS/DR方式,如果你的负载均VS拥有100M的全双工网卡的话,就能使得整个Virtual Server能达到1G的吞吐量,甚至更高;
缺点:
这种方式需要所有的DIR和RIP都在同一广播域;不支持异地容灾。
总结:
LVS/DR是三种模式中性能最高的一种模式,比LVS-NAT模式下负载的RS serve更多,通常在100台左右,对网络环境要求更高,也是日常应用的最多的一种工作模式。
实验环境:
vs: server1 172.25.66.1
rs: server2 172.25.66.2
rs: server3 172.25.66.3
VIP:172.25.66.100
DIP:172.25.66.1
RIP:172.25.66.2,172.25.66.3
CIP:172.25.66.254
1.配置虚拟服务器(vs)
#安装编写调度策略工具,报错,因为用到了高可用,故需要更改yum源
[root@server1 ~]# yum install -y ipvsadm -y
Loaded plugins: product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
rhel-source | 3.9 kB 00:00
Setting up Install Process
No package ipvsadm available.
Error: Nothing to do
# 查看高可用yum源
[root@foundation66 ~]# cd /var/www/html/rhel6.5/
[root@foundation66 rhel6.5]# ls
#1.配置高可用yum源
[root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo
#################
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.66.254/rhel6.5/LoadBalancer
enabled=1
# 清理缓存
[root@server1 ~]# yum clean all
# 查看yum源详细信息,检查配置高可用yum源是否配置成功
[root@server1 ~]# yum repolist
#2.安装编写调度策略工具
[root@server1 ~]# yum install -y ipvsadm -y
# 查看调度策略(开始什么也没有)
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@server1 ~]# lsmod
#3.添加策略:vip(virtual ip:虚拟ip) -s表示算法(rr:轮询)
[root@server1 ~]# ipvsadm -A -t 172.25.66.100:80 -s rr
# 查看调度策略
[root@server1 ~]# 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.66.100:http rr
#4.添加策略: 真实ip(real ip),-a表示添加策略, -g表示直连模式(DR模式)
[root@server1 ~]# ipvsadm -a -t 172.25.66.100:80 -r 172.25.66.2:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.66.100:80 -r 172.25.66.3:80 -g
#查看调度策略
[root@server1 ~]# 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.66.100:http rr-> server2:http Route 1 0 0 -> server3:http Route 1 0 0
#5.保存策略,默认保存在/etc/sysconfig/ipvsadm文件中
[root@server1 ~]# /etc/init.d/ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
注意:1.若策略添加错误,该怎么办?
#1).清除策略,-C表示clean
[root@server1 ~]# ipvsadm -C
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#2).若已经保存了策略,直接打开保存策略的文件,删除添加错误的策略即可
[root@server1 ~]# /etc/init.d/ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
[root@server1 ~]# ifconfig
#6.给eth1网卡添加vip, 注意:vip和调度器ip要在同一局域网内
[root@server1 ~]# ip addr add 172.25.66.100/24 dev eth1
[root@server1 ~]# ip addr show eth1
2.配置真实后端服务器(rs)
在server2上:
#1.查看是否安装了apache,若是没有需要安装
[root@server2 ~]# rpm -q httpd
httpd-2.2.15-29.el6_4.x86_64
#2.编写apahce默认发布文件
[root@server2 ~]# cat /var/www/html/index.html www.westos.org ---- server2
#3.开启apache
[root@server2 ~]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.2 for ServerName[ OK ]
在server3上:
#1.查看是否安装了apache,若是没有需要安装
[root@server3 ~]# rpm -q httpd
httpd-2.2.15-29.el6_4.x86_64
#2.编写默认发布文件
[root@server3 ~]# cat /var/www/html/index.html www.westos.org ---- server3
#3.开启apache
[root@server3 ~]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.3 for ServerName[ OK ]
测试:
#发现此时无法轮询
[root@foundation66 ~]# curl 172.25.66.100
^C
[root@foundation66 ~]# curl 172.25.66.100
^C
[root@foundation66 ~]# curl 172.25.66.100
^C
[root@foundation66 ~]# curl 172.25.66.100
^C
[root@foundation66 ~]# curl 172.25.66.100
^C
[root@foundation66 ~]# curl 172.25.66.100
^C
为何此时无法实现轮询呢?
(1)检查虚拟服务器
#查看策略,发现可以调度,说明调度器没有问题,问题出在后端
[root@server1 ~]# 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.66.100:http rr-> server2:http Route 1 0 2 -> server3:http Route 1 0 2
(2)检查后端服务器
#发现没有vip,此时vs和rs无法进行通信(vs:virtual server rs: real server)
[root@server2 ~]# ip addr show eth1
解决方案:给后端服务器添加vip
在server2上:
#给eth1网卡添加vip,32表示ip仅自己可用
[root@server2 ~]# ip addr add 172.25.66.100/32 dev eth1
[root@server2 ~]# ip addrshow eth1
在server3上:
[root@server3 ~]# ip addr show eth0
#给eth1网卡添加vip,32表示ip仅自己可用
[root@server3 ~]# ip addr add 172.25.66.100/32 dev eth1
[root@server3 ~]# ip addr show eth1
测试:
发现此时便可以轮询
[root@foundation66 ~]# curl 172.25.66.100
www.westos.org ---- server3
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
查看策略,发现确实它通过vs调度器的调度算法实现了轮询
#查看策略
[root@server1 ~]# 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.66.100:http rr-> server2:http Route 1 0 4 -> server3:http Route 1 0 4
但发现当客户访问vip时,它会随机调转到调度器VS(server1)或是后端服务器RS(server2 / server3),显然这样很不合理
#1).查看mac地址,发现访问的是调度器:server1,所以可以实现轮询
[root@foundation66 ~]# arp -an | grep 100
? (172.25.66.100) at 52:54:00:70:34:55 [ether] on br0
[root@server1 ~]# ip addr show eth1
##2).清理缓存
[root@foundation66 ~]# arp -d 172.25.66.100
[root@foundation66 ~]# arp -an | grep 100
#发现此时无法实现轮询
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
#3).查看mac地址,发现此时访问的是server2(后端服务器),所以无法实现轮询
[root@foundation66 ~]# arp -an | grep 100
? (172.25.66.100) at 52:54:00:e0:50:76 [ether] on br0
[root@server2 ~]# ip addr show eth1
当访问vip,调度的是后端服务器VS时,由于不是调度器,便没有办法根据调度算法实现轮询
## 多清理机次缓存,发现访问vip时,它是随机转到调度器或是后端服务器上,这样显然是不合理的
[root@foundation66 ~]# arp -d 172.25.66.100
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# arp -d 172.25.66.100
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
那么怎样才能实现访问vip时,只能调转到调度器上呢?
解决方案:给真实后端服务器添加arp火墙策略
在server2上:
#1.安装arp火墙管理工具
[root@server2 ~]# yum install -y arptables_jf
#2.添加火墙策略
#1).当数据流进来时,直接拒绝vip,DROP表示丢弃
[root@server2 ~]# arptables -A IN -d 172.25.66.100 -j DROP
# 查看策略
[root@server2 ~]# arptables -L
#2).当数据流出去时,以本机ip返回
[root@server2 ~]# arptables -A OUT -s 172.25.66.100 -j mangle --mangle-ip-s 172.25.66.2
#查看策略
[root@server2 ~]# arptables -L
#3.保存策略
[root@server2 ~]# /etc/init.d/arptables_jf save
Saving current rules to /etc/sysconfig/arptables: [ OK ]
在server3上:
#1.安装arp工具
[root@server3 ~]# yum install -y arptables_jf
#2.添加策略
[root@server3 ~]# arptables -A IN -d 172.25.66.100 -j DROP
[root@server3 ~]# arptables -A OUT -s 172.25.66.100 -j mangle --mangle-ip-s 172.25.66.3
#查看策略
[root@server3 ~]# arptables -L
#3.保存策略
[root@server3 ~]# /etc/init.d/arptables_jf save
Saving current rules to /etc/sysconfig/arptables: [ OK ]
注意:如果策略添加错误,只需刷新策略即可
# 刷新策略
[root@server2 ~]# arptables -F
[root@server3 ~]# arptables -L
测试:
此时便实现了稳定的轮询(当客户访问vip时,每次访问的都是调度器,无论清理多少次缓存,这样便实现了一直轮询)
#注意:在清理缓存前必须是访问的是调度器才可以
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# arp -d 172.25.66.100
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# arp -d 172.25.66.100
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
如果某个后端服务器(RS)出现故障,我们该怎么办呢?
#1.模拟后台服务器:server3出现故障(关闭apache服务)
[root@server3 ~]# /etc/init.d/httpd stop
Stopping httpd: [ OK ]
若不设定健康检查,此时某个后端服务器挂了,客户在访问时便会出现一会儿报错,一会儿访问正常的现象,这样显然不合理
#2.此时客户在访问vip时,发现时而可以访问,时而不能访问,这样很不合理
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100
curl: (7) Failed connect to 172.25.66.100:80; Connection refused
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100
curl: (7) Failed connect to 172.25.66.100:80; Connection refused
解决方案:设定健康检查
安装包:
ldirectord-3.9.5-3.1.x86_64.rpm
实验前提:
#当访问vip时,已经实现了稳定的轮询
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
#1.下载安装包
[root@server1 mnt]# ls
ldirectord-3.9.5-3.1.x86_64.rpm
#安装健康检查工具,报错,有依赖性
[root@server1 mnt]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm
#查看高可用yum源,/var/www/html/rhel6.5/为6.5镜像的挂载目录
[root@foundation66 ~]# cd /var/www/html/rhel6.5/
[root@foundation66 rhel6.5]# ls
#2.配置高可用yum源
[root@server1 mnt]# vim /etc/yum.repos.d/rhel-source.repo
###################
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.66.254/rhel6.5/HighAvailability
enabled=1
#清理缓存
[root@server1 mnt]# yum clean all
#查看yum源的详细信息
[root@server1 mnt]# yum repolist
#3.安装健康检查工具
[root@server1 mnt]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm
#列出包含ldirec字段的软件的信息;q代表query,a代表all
[root@server1 mnt]# rpm -qa | grep ldirec
ldirectord-3.9.5-3.1.x86_64
#查看主配置文件
[root@server1 mnt]# rpm -qc ldirectord
/etc/logrotate.d/ldirectord
#查看所有配置文件(包括帮助文档)
[root@server1 mnt]# rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm
[root@server1 mnt]# cd /etc/ha.d
[root@server1 ha.d]# ls
resource.d shellfuncs
[root@server1 ha.d]# pwd
/etc/ha.d
#4.拷贝文件
[root@server1 ha.d]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf .
[root@server1 ha.d]# ls
ldirectord.cf resource.d shellfuncs
#5.设定健康检查
[root@server1 ha.d]# vim ldirectord.cf
######################
virtual=172.25.66.100:80 #vip(虚拟ip)real=172.25.66.2:80 gate #rip(真实ip)real=172.25.66.3:80 gatefallback=127.0.0.1:80 gate #若是后端服务器都出现了故障,就报错#receive="Test Page"#virtualhost=www.x.y.z
#6.重启ldirectord服务
[root@server1 ha.d]# /etc/init.d/ldirectord start
Starting ldirectord... success
测试:
#1.模拟后端服务器:server3出现故障(关闭apache服务)
[root@server3 ~]# /etc/init.d/httpd stop
Stopping httpd: [ OK ]
#2.查看策略,发现调度器自动将坏掉的后端服务器:server3移除了
[root@server1 ha.d]# 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.66.100:http rr-> server2:http Route 1 0 6
#3.此时客户端访问时,只能访问server2,也就解决了客户在访问vip时,时而成功时而失败的窘况
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
那若是两个后端服务器(RS)都出现故障了,又该再怎么解决呢?
#模拟后端服务器:server2也出现故障
[root@server2 ~]# /etc/init.d/httpd stop
Stopping httpd:
#此时客户便无法访问,但没有给客户返回任何信息,这样显然不友好
[root@foundation66 ~]# curl 172.25.66.100
curl: (7) Failed connect to 172.25.66.100:80; Connection refused
[root@foundation66 ~]# curl 172.25.66.100
curl: (7) Failed connect to 172.25.66.100:80; Connection refused
解决方案:当两个后端服务器都出现故障时,代理服务器(vs)自动给客户一个错误信息反馈
#1.查看是否安装了apache,若没有需要自己安装
[root@server1 ha.d]# rpm -q httpd
httpd-2.2.15-29.el6_4.x86_64
#2.删除默认发布目录中的所有文件
[root@server1 ha.d]# cd /var/www/html/
[root@server1 html]# rm -rf *
[root@server1 html]# ls
#3.编写默认发布文件
[root@server1 html]# vim index.html
####################网站正在维护.....
# 4.将pache的端口改为默认端口:80
[root@server1 html]# vim /etc/httpd/conf/httpd.conf
####################
136 Listen 80
#查看apache的端口是否为默认端口:80
[root@server1 html]# netstat -antlup
测试:
#此时客户再访问vip时,便会友好的给客户返回一个报错信息
[root@foundation66 ~]# curl 172.25.66.100网站正在维护.....
[root@foundation66 ~]# curl 172.25.66.100网站正在维护.....
[root@foundation66 ~]# curl 172.25.66.100网站正在维护.....
总结:
当后台服务器中有一台挂掉,这台服务器就会自动从调度器上删除,所以当访问挂调的这台服务器时,另一台服务器就会自动接替工作,此时访问便不会出错。
当两台服务器都挂了,本机自己便会接替工作,但由于它是一台服务器,在访问数据过大时,不能独自承担,所以发布站点正在维护,防止服务器崩溃。
那如果调度器出现故障了,该怎么办呢?
一旦调度器损坏,所有的机制都将被破坏,为了防止这种情况的发生,需要进行添加备用调度器
解决方案:配置主备调度器,即再添加一个调度器server4 ,再用Keepalived实现lvs的高可用
Keepalived简介:
Keepalived是Linux下一个轻量级别的高可用解决方案。高可用:广义来讲,是指整个系统的高可用行;狭义的来讲就是主机的冗余和接管。
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,
如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,当提供该服务器结点恢复并且正常提供服务后,
keepalived又会自动将TCP服务的节点加入到集群中。这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,
通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。健康检查和失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式
对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,
利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。
Keepalvied的工作原理:
Keepalived工作在TCP/IP参考模型的三层、四层、五层:网络层(3): Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),
如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。传输层(4): Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。
或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,
然后强制将这些端口所对应的节点从服务器集群中剔除掉。应用层(5): Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,
例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,
如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。
安装包:
keepalived-2.0.6.tar.gz
实验环境:
server1 主调度器 172.25.66.1
server4 备用调度器 172.25.66.4server2 后端服务器 172.25.66.2
server3 后端服务器 172.25.66.3
1.配置主调度器
#1.下载安装包
[root@server1 html]# cd /mnt
[root@server1 mnt]# ls
keepalived-2.0.6.tar.gz ldirectord-3.9.5-3.1.x86_64.rpm
#2.解压
[root@server1 mnt]# tar zxf keepalived-2.0.6.tar.gz
[root@server1 mnt]# ls
keepalived-2.0.6 keepalived-2.0.6.tar.gz ldirectord-3.9.5-3.1.x86_64.rpm
[root@server1 mnt]# cd keepalived-2.0.6
[root@server1 keepalived-2.0.6]# pwd
/mnt/keepalived-2.0.6
#3.源码编译三部曲:报错,有依赖性
[root@server1 keepalived-2.0.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV
#解决依赖性:安装 openssl-devel
[root@server1 keepalived-2.0.6]# yum install -y openssl-devel
#再次编译,没有error即可
[root@server1 keepalived-2.0.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV
注意:出现 no acceptable C compiler found in $PATH报错,如何解决?
[root@server1 keepalived-2.0.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV
.........
configure: error: in `/mnt/keepalived-2.0.6':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
安装gcc即可
[root@server1 keepalived-2.0.6]# yum install -y gcc
[root@server1 keepalived-2.0.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV
[root@server1 keepalived-2.0.6]# make && make install
[root@server1 keepalived-2.0.6]# cd /usr/local/keepalived/etc/rc.d/init.d
[root@server1 init.d]# ls
keepalived
#4.给脚本一个可执行权限
[root@server1 init.d]# chmod +x keepalived
[root@server1 init.d]# ll
total 4
-rwxr-xr-x 1 root root 1308 Jan 25 16:05 keepalived
#5.制作软链接
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/keepalived /etc/
[root@server1 init.d]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
#6.关闭健康检查服务,因为高可用自带健康检查
[root@server1 init.d]# /etc/init.d/ldirectord stop
Stopping ldirectord... success
#开机不启动
[root@server1 init.d]# chkconfig ldirectord off
#查看vip
[root@server1 init.d]# ip addr show eth1
#7.移除vip,因为keepalived会自动添加vip,实现vip的漂移
[root@server1 init.d]# ip addr del 172.25.66.100/24 dev eth1
RTNETLINK answers: Cannot assign requested address
[root@server1 init.d]# ip addr show eth1
#8.编写配置文件
[root@server1 init.d]# cd /etc/keepalived/
[root@server1 keepalived]# ls
keepalived.conf samples
[root@server1 keepalived]# vim keepalived.conf
##########################
! Configuration File for keepalivedglobal_defs {notification_email { #邮件报警root@localhost}notification_email_from keepalived@localhost #何种身份报警smtp_server 127.0.0.1 #本机smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {state MASTER #指定该节点为主节点interface eth1 #绑定虚拟IP的网络接口,根据实际设置接口(我这里只有eth1接口!)virtual_router_id 51 #VRRP组名,两个节点设置一样,以指明各个节点同属一VRRP组priority 100 #优先级,数值在1~254,注意从节点必须比主节点的优先级别低advert_int 1 #组播信息发送间隔,两个节点需一致authentication { #设置验证信息,两个节点需一致 auth_type PASSauth_pass 1111}virtual_ipaddress { #指定虚拟IP,两个节点需设置一样172.25.66.100 #vip}
}
virtual_server 172.25.66.100 80 { #虚拟IP服务delay_loop 6 #设定检查间隔lb_algo rr #指定LVS算法lb_kind DR #指定LVS模式#persistence_timeout 50 #持久连接设置,会话保持时间 protocol TCP #转发协议real_server 172.25.66.2 80 { #后端实际TCP服务配置(rip)TCP_CHECK { #健康检查weight 1 #权重connect_timeout 3 #延迟3秒retry 3 #尝试3次delay_before_retry 3 #若还是不成功,则报错 }real_server 172.25.66.3 80 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}}}
}
#9.开启keepalived服务
[root@server1 keepalived]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
#发现keepalived会自动添加vip
[root@server1 ~]# ip a
#10.将编译好的脚本文件发送给辅调度器
[root@server1 keepalived]# scp -r /usr/local/keepalived/ root@172.25.66.4:/usr/local
2.配置备用调度器
#配置负载均衡yum源
[root@server4 ~]# vim /etc/yum.repos.d/rhel-source.repo
#################
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.66.254/rhel6.5/LoadBalancer
enabled=1
[root@server4 ~]# yum clean all
[root@server4 ~]# yum repolist
[root@server4 ~]# yum install -y ipvsadm -y
[root@server4 ~]# ipvsadm -l
[root@server4 ~]# ipvsadm -A -t 172.25.66.100:80 -s rr
[root@server4 ~]# ipvsadm -a -t 172.25.66.100:80 -r 172.25.66.2:80 -g
[root@server4 ~]# ipvsadm -a -t 172.25.66.100:80 -r 172.25.66.3:80 -g
[root@server4 ~]# ipvsadm -l
#1.查看年脚本是否有可执行权限,若是没有需要自己添加
[root@server4 ~]# cd /usr/local/keepalived/etc/rc.d/init.d
[root@server4 init.d]# ll
total 4
-rwxr-xr-x 1 root root 1308 Jan 25 16:40 keepalived
#2.制作软链接
[root@server4 init.d]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server4 init.d]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server4 init.d]# ln -s /usr/local/keepalived/etc/keepalived /etc/
[root@server4 init.d]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
#3.更改配置文件
[root@server4 init.d]# cd /etc/keepalived/
[root@server4 keepalived]# ls
keepalived.conf samples
[root@server4 keepalived]# vim keepalived.conf
##########################
18 state BACKUP #备用调度器
21 priority 50 #更改优先级,只需比主调度器低即可
#4.开启keepalived服务
[root@server4 keepalived]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
测试:
1.检测能否自动添加vip,实现调度
#keepalived会自动添加vip
[root@server1 ~]# ip a
[root@server4 ~]# ip a
#实现负载均衡
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server2
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
2.模拟某个后端服务器出现故障,检测高可用是否能实现健康检查
#模拟server3出现故障
[root@server3 ~]# cat /var/www/html/index.htmlwww.westos.org ---- server3
#发现有报错,以为没有实现健康检查?不不不,这是因为有延迟
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
[root@foundation66 ~]# curl 172.25.66.100
curl: (7) Failed connect to 172.25.66.100:80; Connection refused
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
[root@foundation66 ~]# curl 172.25.66.100
curl: (7) Failed connect to 172.25.66.100:80; Connection refused
#等待一会儿发现,没有报错。即说明keepalived自带健康检查
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
[root@foundation66 ~]# curl 172.25.66.100www.westos.org ---- server3
3.模拟主调度器出现故障,检测高可用是否能实现vip的漂移
[root@server2 ~]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.2 for ServerName[ OK ]
#模拟主调度器出现故障
[root@server1 ~]# /etc/init.d/keepalived stop
Stopping keepalived: [ OK ]
#发现vip发生了漂移
[root@server1 ~]# ip a
[root@server4 ~]# ip a
4.恢复主调度器,检测vip是否会漂移回来(会飘回来,因为主调度器的优先级高)
#恢复主调度器
[root@server1 ~]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
#发现vip飘回来了
[root@server1 ~]# ip a
[root@server4 ~]# ip a