keepalived是集群管理中保证集群高可用(HA)的一个服务软件,其功能类似于heartbeat,用于防止单点故障。
keepalived的两大核心功能是失败切换(高可用)和健康检查。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。
keepalived是以虚拟路由冗余协议VRRP为基础来实现高可用功能的,当backup收不到vrrp包时就认为master宕掉了,这时就需要 根据VRRP的优先级来选举一个backup当master,这样我们就能保证集群的高可用。
VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议,可以认为是实现路由器高可用的协议。就是将N台提供相同功能的路由器组成一个路由组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的VIP,master会发送组广播,当backup收不到VRRP包就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,从而保证路由器的高可用。
如何判断谁是master:看vip在哪台服务器,谁就是master
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的
什么是脑裂?
脑裂(split-brain):指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,backup抢资源,master不认为自己会死,他俩抢着为客户端服务,结果会导致系统混乱,数据损坏。
1)实验环境:
共需要五台虚拟机:
虚拟机1,虚拟机2:安装nginx.。
使用nginx的web服务器功能,作为真正的web服务器提供服务。
虚拟机3,虚拟机4:安装nginx和keepalived。
作用有两个:1、使用nginx的负载均衡功能,作为负载均衡服务器转发用户请求到真实服务器中。2、安装keepalived实现负载均衡的高可用,虚拟机3作为master,虚拟机4作为backup。
虚拟机5:作为客户端,用于集群的测试,无需任何配置。
为了省时间,直接在nginx默认发布目录/usr/share/nginx/html/index.htm中写入测试内容,没有重新编写配置文件。
虚拟机1进行如下操作:
安装并开启nginx,并在nginx默认发布目录中写入测试内容
[root@web-1 ~]# yum -y install nginx
[root@web-1 ~]# systemctl start nginx
[root@web-1 ~]# echo web-1 > /usr/share/nginx/html/index.html
虚拟机2进行如下操作:
同虚拟机1 的操作一样
[root@web-2 ~]# yum -y install nginx
[root@web-2 ~]# systemctl start nginx
[root@web-2 ~]# echo web-2 > /usr/share/nginx/html/index.html
虚拟机5进行如下操作
虚拟机3实现负载均衡进行如下操作:
[root@nginx-master ~]# vim /etc/nginx/nginx.conf
[root@nginx-master ~]# vim /etc/nginx/conf.d/default.conf
[root@nginx-master ~]# nginx -s reload
#重建加载配置文件
虚拟机4实现负载均衡进行如下操作:
与虚拟机3的配置一样,只需改变地址池的名称即可
[root@nginx-backup ~]# vim /etc/nginx/nginx.conf
[root@nginx-backup ~]# vim /etc/nginx/conf.d/default.conf
[root@nginx-backup ~]# nginx -s reload
#重建加载配置文件
虚拟机5进行如下操作:
验证负载均衡
虚拟机3,虚拟机4进行如下操作:
1)安装keepalived
[root@nginx-master ~]# yum -y install keepalived
2)备份keepalived的配置文件
[root@nginx-master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
3)修改配置文件
[root@nginx-master ~]# vim /etc/keepalived/keepalived.conf
将文件内容全部清空,添加如下配置
! Configuration File for keepalived
global_defs { #全局配置
router_id director1 #用于识别master与backup,在backup服务器中,此项改为director2
}
vrrp_instance VI_1 { #vrrp协议配置,用于实现高可用
state MASTER #定义此台服务器的角色
interface ens33 #指定VIP地址绑定的接口,设置为网卡名称
virtual_router_id 80
priority 100 #设置优先级,master设置为100,backup设置为50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.58.140/24 #设置虚拟IP,即VIP,需要与服务器ip在同一网段
}
}
4)虚拟机4与虚拟机3进行相同操作,只有配置文件的内容不同
[root@nginx-master ~]# systemctl enable keepalived
#设置开机自启
[root@nginx-master ~]# systemctl start keepalived
#启动keepalived
[root@nginx-backup ~]# systemctl enable keepalived
#设置开机自启
[root@nginx-backup ~]# systemctl start keepalived
#启动keepalived
1)模拟keepalived集群出现故障,master宕机,验证高可用是否生效
master服务器关闭keepalived
[root@nginx-master ~]# systemctl stop keepalived
2)当master恢复正常,查看高可用集群的vip
由于master的优先级为100,backup的优先级为50,当master服务器恢复正常后,vip会迅速的重新回到master中,master服务器重新成为Keepalived集群中的master
在本实验中keepalived高可用可以解决负载均衡的单点故障,但是不能解决Nginx的web服务器故障。
为了解决这个问题,启用Keepalived的健康检测功能,让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived
1)编写健康检测脚本(两台keepalived服务器都做如下操作)
[root@nginx-master ~]# vim /etc/keepalived/check_nginx_status.sh
脚本内容如下:
#!/bin/bash
/usr/bin/curl -I http://localhost &> /dev/null
if [ $? -ne 0 ];then
systemctl start nginx
if [$? -ne 0 ];then
systemctl stop keepalived
fi
fi
2)在keepalived中引入健康监测模块并调用
脚本升级
1)使用进程的方式来判断nginx是否可以用,如下:
ps -C nginx --no-heading | wc -l
在nginx正常运转时,使用此命令,回显2;当nginx不运转时,此命令回显0,故可以采用此命令来判断nginx是否宕机。
脚本内容如下:
counter=`ps -C nginx --no-heading | wc -l`
if [ ${counter} -eq 0 ];then
systemctl start nginx
counter=`ps -C nginx --no-heading | wc -l`
if [ ${counter} -eq 0 ];then
systemctl stop keepalived
fi
fi
有人提出在此脚本中基础上实现当nginx能够正常开启的时候自动开启keepalived的功能,其实没有这个必要。此脚本的逻辑是:
①当nginx服务宕机后,首先先尝试重新开启nginx服务,若能够重新开启,就不会进入到stop keepalived的判断语句中。
②若重启nginx不成功,就会停止keepalived,实现VIP漂移,重新选举master。
③需要明白的是:有人说在nginx宕机后,经过排错后nginx可以正常使用的情况下,应该在脚本里边加上此种情况下重新启动keepalived的功能。但是我们应该明白,当nginx宕机后,又不能重新启动的情况下,脚本就会停止keepalived,这时keepalived就不会检测脚本了,就算后来将nginx修复好,此时keepalived也已经停止,也不能实现检测脚本功能。目前我们还不能做到nginx的自动排错,需要人工排错,当我们为nginx排完错,手动开启nginx和keepalived就好。
3)验证
1、关闭nginx,模拟nginx宕机,但是vip没有漂移,说明脚本生效又重新开启了nginx
2、故意向nginx.conf配置文件添加错误,使nginx不能重新启动