Keepalived
keepalived是Linux的一个高可用解决方案。主要是通过VRRP协议来实现高可用功能,同时还可以对集群中服务器运行状态的监控及故障隔离。部署简单
虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议
keepalived分为user space用户空间和kernel space内核空间
kernel space用户空间组件:
IPVS主要实现基于IP的负载均衡集群
NETLINK主要负责接收用户空间中net reflector发送过来的网络请求,对网络请求进行处理
user space用户空间组件:
Scheduler IO Multiplexer这是一个IO复用分发调度器,它负责安装keepalived所有内部的任务请求
Memory Managment内存管理机制,这个框架提供了访问内存的一些通用方法
Control pane控制面板,可以实现对配置文件进行编译和解析; keepalived的配置文件比较特殊,只有在用到某个功能模块时才解析对应的配置
Core compoents
WatchDog是计算机可靠性领域中一个极为简单而且有效的检测工具。它的工作原理是针对被监控目标设置一个计数器和一个阈值,WatchDog会自动增加该计数器,然后等待被监控对象周期性的重置该计数期,一旦被监控对象发生错误,就无法重置该计数器,WatchDog就会检测到, 然后采取相应的动作keepalived就是使用WatchDog机制来监测checkers和VRRP进程的
Checkers通过该组件可实现对服务器的运行状态进行监测及故障隔离
VRRP Stack通过该组件实现失败切换(Fail Over)功能
IPVS wrapper可以将设置好的IPVS规则发送到内核空间并转交给IPVS模块,最终实现IPVS的负载均衡的功能
Netlink用于实现高可用集群中Failover时虚拟IP的转换及切换。
keepalived安装
该软件依赖 net-snmp-agent-libs net-snmp-libs
#yum install -y keepalived
查看配置文件
#rpm -qc keepalived
/etc/keepalived/keepalived.conf
/etc/sysconfig/keepalived
配置
主节点 (备用节点:state BACKUP)
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id director01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 88
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass redhat
}
virtual_ipaddress {
192.168.122.100
}
}
virtual_server 192.168.122.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.122.10 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.122.20 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
管理
启动
# systemctl start keepalived
# 停止 重启
systemctl stop keepalived
systemctl restart keepalived
# 开启启动
#chkconfig keepalived on
# 查看
#chkconfig --list keepalived
检测通信(抓包)注意防火墙
# tcpdump -i ens32 -nn vrrp
查看log
tail -f /var/log/messages
主备切换
通常情况下,利用keepalived做热备,其中一台设置为master,一台设置为backup。当master出现异常后,backup自动切换为master。当backup成为master后,master恢复正常后会再次抢占成为master,导致不必要的主备切换。因此可以将两台keepalived初始状态均配置为backup,设置不同的优先级,优先级高的设置nopreempt解决异常恢复后再次抢占的问题。
A,B同时启动后,由于A的优先级较高,因此通过选举会成为master。当A上的业务进程出现问题时,优先级会降低到60。此时B收到优先级比自己低的vrrp广播包时,将切换为master状态。那么当B上的业务出现问题时,优先级降低到50,尽管A的优先级比B的要高,但是由于设置了nopreempt,A不会再抢占成为master状态。
所以,可以在检测脚本中增加杀掉keepalived进程(或者停用keepalived服务)的方式,做到业务进程出现问题时完成主备切换。
高可用
keepalived宕机时vip会飘走,为了实现高可用,应该在该节点上的服务宕机时服务也飘走
方法一(关闭):
1.)准备一个检测服务脚本。
#vim /etc/keepalived/check_hax.sh
#!/bin/bash
# check haproxy nginx
curl 192.168.122.10:80 &>/dev/null
if [ $? -ne 0 ]; then
echo "haproxy down stop keepalived" >> /etc/keepalived/kpdown.txt
systemctl stop keepalived
# for test
#else
#echo "haproxy down stop keepalived" >> /etc/keepalived/kpup.txt
fi
#chmod a+x /etc/keepalived/check_hax.sh
2.)让keepalived执行脚本
# vim /etc/keepalived/keepalived.conf
vrrp_srcipt check_hax {
script "/etc/keepalived/check_hax.sh"
interval 1
}
vrrp_instance VI_1 {
state MASTER
interface ens32
virtual_router_id 30
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.200
}
track_script {
check_hax
}
}
方法二(降低优先级):
vrrp_script check_httpd {
script "killall -0 keepalive ">>>定义检测服务的运行状态,服务运行返回0,否则返回1
interval 2
weight -50 >>>定义服务状态检测失败后,该服务器优先级-50
}
vrrp_instance HA_1{
state MASTER
interface eth0
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass redhat
}
virtual_ipaddress {
192.168.122.100
}
track_script {
check_httpd >>>调用上面定义的check_httpd脚本
}
}