1. Keepalived介绍linux
Keepalived 是一个基于 vrrp 协议来实现的服务器高可用解决方案,能够利用其实现避免IP单点故障,相似的工具还有 heartbeat 、 corosync 。不过其不会单独出现,而是搭配着 LVS、Nginx、HAproxy,一块儿协同工做达到高可用的目的。nginx
VRRP 全称Vritual Router Redundancy Protocol,虚拟路由冗余协议。经过把几台提供路由功能的设备组成一个虚拟路由设备,使用必定的机制保证虚拟路由的高可用,从而达到保持业务的连续性与可靠性。服务器
在这组成的一个虚拟路由器中,有 master 和 backup 之分。master是主节点,在一个虚拟路由器中,只能有一个master,但能够有多个backup;backup是备用节点,也就是当master挂掉以后,backup接手master节点的全部资源,当有多个backup节点时,根据其 priority (优先级)的值的大小,来选择谁做为master的替代者。当backup节点的优先级值相同时,根据其IP地址的大小,来决定。网络
2.1 各节点时间必须同步测试
可使用 ntp 、 chrony 等工具进行时间同步spa
2.2 确保iptables和selinux规则清空3d
实验环境下,咱们直接将防火墙规则清空,关闭selinux
iptables -F systemctl stop firewalld.service setenforce 0
在vrrp协议中咱们要将咱们虚拟路由器中各节点的优先级进行广播,这样在咱们故障时,其余节点发如今多播域内本身的优先级最高,能够实现故障切换。
多播地址(组播): 224.0.0.0 -- 239.255.255.255
查看是否支持多播
ifconfig | grep MULTICAST #查看是否支持多播 ip link set multicast on dev eth0 #开启多播功能
3.配置Keepalived+Nginx
3.1 拓扑结构
MASTER keep alived BACKUP
+-------------+ +------------+ +--------------+
| Nginx-1 |--------| virtualIP |--------| Nginx-2 |
+-------------+ +------------+ +--------------+
172.31.208.91 172.31.208.95 172.31.208.92
3.2 安装Keepalived
yum install keepalived keepalived -v
3.3 keepalive配置文件
Keepalvie配置文件路径为:/etc/keepalived/keepalived.conf
如下为 MASTER 配置文件示例:请注意 MASTER 与 BACKUP 不一样, 须要更改的地方,多余配置请删除
! Configuration File for keepalived global_defs { notification_email { #定义通知邮箱 yangchao@chucloud.com.cn } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 #定义SMTP服务器地址 smtp_connect_timeout 30 router_id lb01 #定义id为lb01,ID要惟一 } vrrp_script chk_ngx { #定义vrrp脚本,检测nginx服务状态 script "/etc/keepalived/chk_ngx.sh" #具体脚本位置,当nginx服务有问题时停掉keepalive服务 interval 2 #间隔两秒 weight 2 } vrrp_instance VI_1 { #实例名字为VI_1,相同的实例的备节点名字要和这个相同 state MASTER #状态为MASTER,备节点状态须要改成BACKUP interface ens192 #定义通讯接口为eth0,此参数备节点和主节点相同 virtual_router_id 55 #实例ID为55.惟一 priority 150 #优先级为150,备节点的优先级必须比此数字低 advert_int 1 #通讯检查检查间隔时间为1秒 authentication { auth_type PASS #认证类型,此参数备节点设置和主节点设置相同 auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同 } virtual_ipaddress { #虚拟机IP,即VIP为172.31.208.95/24,绑定接口为eth0,别名为eth0:1,此参数备节点设置和主节点相同 172.31.208.95/24 dev ens192 label ens192:1 } track_script { chk_ngx #触发检查 } }
如下为BACKUP的配置文件
! Configuration File for keepalived global_defs { notification_email { yangchao@chucloud.com.cn } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb02 } vrrp_script chk_ngx { #定义vrrp脚本,检测nginx服务状态 script "/etc/keepalived/chk_ngx.sh" #具体脚本位置,当nginx服务有问题时停掉keepalive服务 interval 2 #间隔两秒 weight 2 } vrrp_instance VI_1 { state BACKUP interface ens192 virtual_router_id 55 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.31.208.95/24 dev ens192 label ens192:1 } track_script { chk_ngx #触发检查 } }
说明:
一、vrr_instance实例,名字是VI_1,每一个实例能够认为是keepalived服务的一个或者多个业务服务,能够有多个,注意,主节点的中的vrrp
二、state MASTER表明当前实例VI_1的角色状态,当前角色为MASTER,只有MATER和BACKUP两个状态,必须大写
三、interface 为网络通讯接口
四、virtual_router_id为虚拟机路由id表示,最好是数字,并且是配置文件中惟一的,MASTER和BACKUP配置中相同的实例id又必须一致
五、priority优先级,数字越大,优先级越高,MASTER必须高于BACKUP
六、advert_int 同步时间,默认1秒
七、authentication,认证, MASTER和BACKUP须要配置一致
八、virtual_ipaddress虚拟IP,注意,此IP能够配置多个,一般为须要跟域名绑定
九、vrrp_script,定义的脚本
3.4监控脚本编写
默认状况下,keepalived软件仅仅在对方机器宕机或者keepalive停掉的时候才会接管业务。可是有时候nginx服务停掉,可是keepalived服务还在工做,此时就会致使用户的访问的vip没法找到对应的服务,因此须要编写脚本,检测nginx服务状态,当服务中断时,keepalive服务也中断,脚本以下
#!/bin/bash if [ `netstat -lntup|grep nginx|wc -l` -ne 1 ];then systemctl stop keepalived fi
记得设定可执行权限
四、测试
开启keepalived
systemctl start keepalived systemctl enable keepalvied
注意,当配置文件有任何错误的时候,systemctl 不会提示keepalived启动失败,须要使用systemclt status检查服务
当配置正确,MASTER会主机会有VIP
BACKUP上不会有vip
当模拟nginxi服务中止,MASTER的keepalived服务由于脚本会中止,这时BACKUP会争抢使用vip
能够看到MASTER上keepalived服务中止,没有vip
而在BACKUP上争抢到了vip
五、keepalived的裂脑的脚本
因为某些缘由,致使两台高可用服务器对在指定时间内,没法检测到对方的心跳消失,各自取得资源及服务的全部权,而此时的两台高可用服务器对都还活着而且在正常运行,
此时就会致使一个IP或者服务存在冲突,两个服务器都会占用同一个VIP,此时就被称为裂脑。
若是出现了裂脑状况,则须要尽快接入中间仲裁,关闭一台服务器或者keepalived服务
脚本思路:
在BACKUP上执行脚本,若是能够ping通MASTER,而且BACKUP有VIP就报警。
#!/bin/sh MASTER_VIP=172.31.208.95 MASTER_IP=172.31.208.91 while true do ping -c 2 -W 3 $MASTER_IP &>/dev/null if [ $? -eq 0 -a `ip addr|grep "$MASTER_IP"|wc -l` -eq 1 ] then echo "HA is split brain.warning." else echo "HA is OK!" fi sleep 5 done
加上可执行权限