keepalived 介绍
keepalived 是 Linux下一个轻量级的高可用解决方案
keepalived 主要通过虚拟路由冗余(VRRP)来实现高可用功能
优点:部署及使用简单,只需一个配置文件即可完成
功能:服务器状态检测和故障隔离功能;HA(High Available) cluster
keepalived 发展
keepalived起初是为LVS(Linux Virtual System)设计,专门监控集群系统中各个服务节点的状态
根据TCP/IP参考模型 第三、第四、第五层交换机制检测每个服务节点的状态
(详细见本页keepalived工作原理)
e.g: keepalived检测WEB服务器的状态;
如果一台WEB服务器死机/工作出现故障,keepalived检测到此状况后会将故障服务器从系统中剔除;
直至该服务器工作正常后keepalived自动将该服务器加入到服务器群中;
以上工作keepalived自动完成,无需人工干涉,人工干预仅是修复出现故障的服务节点;
keepalived 后续加入了VRRP功能
VRRP(Virtaul Router Redunadancy Protocol,虚拟路由器冗余协议)
目的:解决静态路由出现的单点故障问题,实现网络不间断稳定运行
VRRP 协议与工作原理 :
局域网组网:
网络内的所有主机会设置一条默认网关(10.100.10.1),当主机发出的目的地址不在本网段(10.100.10.0/24)的报文;
通过默认网关发往路由器A,从而实现主机与外部网络的通信
该组网缺点:当路由器A坏掉时,本网段内通过以RA为默认网关下一跳的主机将断掉与外界的通信,产生单点故障
VRRP组网:
RA:Master 活动路由器 10.100.10.2
RB:Backup 备份路由器 10.100.10.3
VRIP : 虚拟路由器IP 10.100.10.1
VRRP将局域网中的一组路由器【 RA和RB】组成一个虚拟路由器------>>>备份组
虚拟路由器拥有自己的IP地址 10.100.10.1
局域网内的主机仅知道虚拟路由器IP地址为10.100.10.1,不知道具体的Master与Backup路由器IP
局域网内的主机将默认网关下一跳的地址设置为该虚拟路由器IP地址,通过该地址与其他网络进行通信
该组网优点:当备份组内的Master路由器DOWN掉,会进行选举策略选出一个新的Master路由器,继续往网络内的主机提供路由服务,从而实现网络内的主机不间断地与外部网络进行通信
VRRP 协议 :
解决局域网中配置静态网关出现单点失效的路由协议
设计目标:网络发生故障时透明地进行设备切换而不影响主机间的数据通信
VRRP 工作原理:
VRRP协议将两台或多台路由器设备虚拟成一个虚拟路由器,对外提供虚拟路由器IP(一个或多个);
而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER, 或者是通 过算法选举产生;
MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;
其他设备不拥有该IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外 的网络功能。
当主机失效时,BACKUP将接管原先MASTER的网络功能。
如何判定多个路由器在同一组虚拟路由器中?
VRID(virtual_router_id):每个虚拟路由器都有一个唯一标识(VRID是一个0~255的正整数)
配置VRRP协议时需要配置每个路由器的虚拟路由器ID(VRID)和优先权值(priority),
使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组
BACKUP 为什么没有发生抢占?
VRRP通告:它使用IP多播数据包进行封装,组地址为224.0.0.18,发布范围只限于同一局域网内
在一个虚拟路由器中,只有处于MASTER角色的路由器会一直发送VRRP通告信息;
处于BACKUP状态的路由器只接收MASTER发过来的报文信息,用来监控MASTER运行状态, 除非它的优先级比MASTER更高
什么时候发生选举?
当MASTER不可用时,BACKUP无法收到MASTER发过来的报文信息;
认定MASTER出现故障,然后多台BACKUP就开始进行选举;
Master选举:
虚拟路由器IP=路由器本身配置IP
该路由器始终将是MASTER;IP地址所有者自动具有最高优先级:255
优先级选举主控路由器(优先级范围是0—255)
优先级0一般用在IP地址所有者主动放弃主控者角色时使用。可配置的优先级范围为1—254
优先级相等,则比较路由器的实际IP,IP值较大的优先权高
Keepalived 工作原理
根据TCP/IP参考模型各层所能实现的功能,Keepalived运行机制如下:
网络层
协议:
IP(Internet Protocol网际协议)
ARP(Address Resolution Protoco 地址转换协议)
RARP(Reverse Address Resolution Protocol 反向地址转换协议 )
ICMP(Internet Control Message Protocol 网络控制报文协议)
常用:通过ICMP协议向服务器集群中的每个节点发送一个ICMP的数据包(类似ping实现)
如果某个节点没有返回响应数据包,那么认为此节点发生了故障,keepalived将报告该节点失效,
并从服务器集群中剔除故障节点
传输层
协议:
TCP (传输控制协议)(三次握手、安全可靠)
UDP (用户数据协议)
------------------------------------------------------------------------------------
TCP提供可靠的数据传输服务、IP地址和端口,代表TCP的一个连接端
获取TCP服务,需要在发送机的一个端口上和接收机上一个端口上建立连接
-------------------------------------------------------------------------------------
常用:利用TCP协议的端口连接和扫描技术来判断集群节点是否正常
e.g: SSH服务默认22端口,WEB服务器80端口····Keepalived在传输层探测某端口没有响应数据
判定端口异常,强制将此端口对应的节点从服务器及群组中移除
应用层
协议:FTP、TELNET、SMTP、DNS ····
-----------------------------------------------------------------------
用户可以通过自定义Keepalived的工作方式
-----------------------------------------------------------------------
e.g:用户编辑程序运行Keepalived,而Keepalived 根据用户设定检测各种程序或服务是否允许正常
keepalived 结构体系
Keepalived采用是模块化设计,不同模块实现不同的功能,keepalived主要有三个模块,分别是core、check和vrrp。
core: 是keepalived的核心,负责主进程的启动和维护,全局配置文件的加载解析等
check:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析;可基于脚本检查对IPVS后端服务器健康状况进行检查。
vrrp: VRRPD子进程,VRRPD子进程就是来实现VRRP协议的
Keepalived启动后会有三个进程:
父进程:内存管理,子进程管理等等
子进程:vrrpd子进程
子进程:healthchecker子进程
keepalived 配置
keepalived-1:
! Configuration File for keepalived
global_defs { #全局配置标识,表面这个 区域{} 是全局配置
router_id lms-ngx-ha-91 #机器标识,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到
}
vrrp_script health-check { #VRRP脚本,在vrrp_script区域定义脚本名字
script "/root/tools/health_check.sh 192.168.0.92" #脚本存放路径及参数
interval 5 #脚本执行的间隔时间
fall 3 #转换为KO状态,所需的成功数量
rise 5 # 转换为OK状态,所需的成功数量
}
vrrp_instance NGX-HA-1 { # VRRP实例,定义对外提供服务的VIP区域及其相关属性
state BACKUP #state指定instance(Initial)的初始状态 MASTER/BACKUP
interface eth0 #实例绑定的网卡(非VIP网卡),用来发VRRP包
virtual_router_id 93 #设置VRID,取值在0~255之间,用来区分多个instance的VRRP组播,相同的VRID为一组,该值将决定多播的MAC地址
priority 100 #设置本节点的优先级,优先级高的为master,取值为1~255
advert_int 3 #检查间隔,默认为1秒
nopreempt #设置不抢占,这里只能设置在state为backup的节点上,而且这个节点的优先级必须特别的高
garp_master_delay 30 #在切换到master状态后,延迟进行免费的ARP
authentication { #这里设置认证
auth_type PASS #认证方式,可以是PASS或AH两种认证方式
auth_pass 51w162hy #认证密码(pass方式密码只识别前8位)
}
track_interface { #监控以下网卡,设置额外的监控,里面任意一块网卡出现问题,都会进入故障(FAULT)状态
eth0
}
virtual_ipaddress { #设置VIP,也就是虚拟IP地址(可设置多个VIP)
192.168.0.93/24 dev eth0
}
track_script { #实例(vrrp_instance)里面引用
health-check
}
}
keepalived-2:
! Configuration File for keepalived
global_defs { #全局配置标识,表面这个 区域{} 是全局配置
router_id lms-ngx-ha-92 #机器标识,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到
}
vrrp_script health-check { #VRRP脚本,在vrrp_script区域定义脚本名字
script "/root/tools/health_check.sh 192.168.0.91" #脚本存放路径及参数
interval 5 #脚本执行的间隔时间
fall 3 #转换为KO状态,所需的成功数量
rise 5 # 转换为OK状态,所需的成功数量
}
vrrp_instance NGX-HA-1 { # VRRP实例,定义对外提供服务的VIP区域及其相关属性
state BACKUP #state指定instance(Initial)的初始状态 MASTER/BACKUP
interface eth0 #实例绑定的网卡(非VIP网卡),用来发VRRP包
virtual_router_id 93 #设置VRID,取值在0~255之间,用来区分多个instance的VRRP组播,相同的VRID为一组,该值将决定多播的MAC地址
priority 95 #设置本节点的优先级,优先级高的为master,取值为1~255
advert_int 3 #检查间隔,默认为1秒
nopreempt #设置不抢占,这里只能设置在state为backup的节点上,而且这个节点的优先级必须特别的高
garp_master_delay 30 #在切换到master状态后,延迟进行免费的ARP
authentication { #这里设置认证
auth_type PASS #认证方式,可以是PASS或AH两种认证方式
auth_pass 51w162hy #认证密码(pass方式密码只识别前8位)
}
track_interface { #监控以下网卡,设置额外的监控,里面任意一块网卡出现问题,都会进入故障(FAULT)状态
eth0
}
virtual_ipaddress { #设置VIP,也就是虚拟IP地址(可设置多个VIP)
192.168.0.93/24 dev eth0
}
track_script { #实例(vrrp_instance)里面引用
health-check
}
}
说明:keepalived-1和keepalived-2的配置有两处不同
①、vrrp_script health-check中的检测对象IP
②、vrrp_instance中的 priority 权重不同
/root/tools/health_check.sh 脚本:
#!/bin/bash
# -------------------------------------------------------
# $Name: ha_check_health.sh
# $Version: v1.0
# $Function: keepalved检测逻辑
# $Author: Dengwei
# $Create Date: 2017-6-29 10:20:42
# $Description: 判断在什么情况下VIP在A/B二台主机上漂移
# 100 master
# 95 slave
# -------------------------------------------------------
health_check()
{
local datetime=$(date "+%F %T")
local logfile='/var/log/keepalived-check.log'
local keep_conf="/usr/local/services/keepalived-1.2.19/etc/keepalived/keepalived.conf"
local role=$(grep 'priority' $keep_conf |grep -v '#' |awk '{print $2}')
local ha_proc_nums=$(pidof haproxy |wc -l)
local vip=$(cat $keep_conf |grep 'dev eth0' |sed -r 's!\s+([^/]+)/.*!\1!')
local local_has_vip=$(ip addr show eth0 |grep -c "$vip")
local gateways=$(ip r l |awk '/^def|via/ {print $3}' |egrep '^(10|192|172)\.'|sort |uniq)
local another_keep_ip=$1
# 根据权重定义本地keepalived角色
if [ "$role" == "100" ]; then
role="master"
elif [ "$role" == "95" ]; then
role="slave"
fi
# 检查Nginx进程是否存活
ha_msg="$datetime Haproxy is shutdown"
if [ $ha_proc_nums -eq 0 ]; then
echo -e "${ha_msg}. $local_has_vip" >>$logfile
exit 1
fi
# 检查本地网络是否异常
network_msg="$datetime Gateway is unreachable"
for gateway in $gateways $another_keep_ip; do
ping -W 1 -c 1 $gateway >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "${network_msg}, ${gateway}. $local_has_vip" >>$logfile
stats="${stats}1"
fi
done
if [ "$stats" == "11" ]; then
exit 2
fi
# 若没提供IP则退回
# if [ -z $another_keep_ip ]; then
# return 0
# fi
#
# # A/B主机之间网络不通仲裁逻辑
# keep_msg="$datetime Network is unreachable"
# ping -w 1 -c 1 $another_keep_ip >/dev/null 2>&1
# if [ $? -ne 0 -a "$role" == 'slave' ]; then
# echo "$keep_msg, $another_keep_ip $local_has_vip" >>$logfile
# exit 3
# fi
return 0
}
health_check $1
实验常见问题:
1、Keepalived 设置master故障恢复后不重新抢回VIP(解决nopreempt无效)
问题现象:
master服务器在恢复正常后抢占VIP,配置文件配置的非抢占VIP无效(nopreempt无效)
master机器
backup机器
分析:
通过日志分析可以看到组播IPv4为:
VRRP IPv4 mcast group = 224.0.0.18
VRRP IPv6 mcast group = ff02::12
抢占VIP应该是两台keepalived 节点通信有问题,此时检查iptables是否开发224.0.0.18,
如果没开发,则在两台keepalived 节点开启iptables,允许组播:
iptables -A INPUT -d 224.0.0.18 -j ACCEPT
或修改:vim /etc/sysconfig/iptables
适当位置添加行:
-A INPUT -d 224.0.0.18 -j ACCEPT