keepalived
高可用
概念:当一台服务器宕机,另一台能快速接管。
工具:keepalived
原理:通过vrrp协议,虚拟路由冗余协议;在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
VRRP
原理:
master在工作状态会不断群发一个广播包
backup与 master进行优先级对比
由虚拟IP进行连接选举出的master
keeplived 应用
#1.安装
[root@lb01 ~]# yum install -y keeplived
#2.配置
#(1)lb1配置
[root@lb01 ~]# vim /etc/keeplived/keeplived.conf
globoal_defs {
router_id lb1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
#(2)lb2配置
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
globog_defs {
router_id lb2
}
vrrp_instance VI 1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
#3.启动测试
[root@lb02 ~]# systemctl start keepalived
[root@lb02 ~]# systemctl enable keepalived
抢占式与非抢占式
#master故障--->backup顶上--->master恢复--->backup 抢占式
#master故障--->backup顶上--->master恢复--->backup工作 非抢占式
#两个节点的state都必须配置为BACKUP(官方建议)
#两个节点都在vrrp_instance中添加nopreempt参数
#其中一个节点的优先级必须要高于另外一个节点的优先级。
#两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级。
1.抢占: 硬件配置不一
2.非抢占: 硬件配置一致,业务不允许多次切
#[keepalived vip漂移基本原理及选举算法]
keepalived可以将多个无状态的单点通过虚拟IP(以下称为VIP)漂移的方式搭建成一个高可用服务,常用组合比如 keepalived+nginx,lvs,haproxy和memcached等。它的实现基础是VRRP协议,包括核心的MASTER竞选机制都是在[VRRP协议](http://tools.ietf.org/html/rfc3768)所约定的。
一、配置说明:
keepalived的配置位于/etc/keepalived/keepalived.conf,配置文件格式包含多个必填/可选的配置段,部分重要配置含义如下:
global_defs: 全局定义块,定义主从切换时通知邮件的SMTP配置。
vrrp_instance: vrrp实例配置。
vrrp_script: 健康检查脚本配置。
细分下去,vrrp_instance配置段包括:
state: 实例角色。分为一个MASTER和一(多)个BACKUP。
virtual_router_id: 标识该虚拟路由器的ID,有效范围为0-255。
priority: 优先级初始值,竞选MASTER用到,有效范围为0-255。
advert_int: VRRP协议通告间隔。
interface: VIP所绑定的网卡,指定处理VRRP多播协议包的网卡。
mcast_src_ip: 指定发送VRRP协议通告的本机IP地址。
authentication: 认证方式。
virtual_ipaddress: VIP。
track_script: 健康检查脚本。
vrrp_script配置段包括:
script: 一句指令或者一个脚本文件,需返回0(成功)或非0(失败),keepalived以此为依据判断其监控的服务状态。
interval: 健康检查周期。
weight: 优先级变化幅度。
fall: 判定服务异常的检查次数。
rise: 判定服务正常的检查次数。
这里有[MASTER](https://gist.github.com/fengchj/66f5c6e5afc4603942aa#file-master)和[BACKUP](https://gist.github.com/fengchj/66f5c6e5afc4603942aa#file-backup)的参考配置。
二、选举算法
keepalived中优先级高的节点为MASTER。MASTER其中一个职责就是响应VIP的arp包,将VIP和mac地址映射关系告诉局域网内其 他主机,同时,它还会以多播的形式(目的地址224.0.0.18)向局域网中发送VRRP通告,告知自己的优先级。网络中的所有BACKUP节点只负责 处理MASTER发出的多播包,当发现MASTER的优先级没自己高,或者没收到MASTER的VRRP通告时,BACKUP将自己切换到MASTER状 态,然后做MASTER该做的事:1.响应arp包,2.发送VRRP通告。
MASTER和BACKUP节点的优先级如何调整?
首先,每个节点有一个初始优先级,由配置文件中的priority配置项指定,MASTER节点的priority应比BAKCUP高。运行过程中keepalived根据vrrp_script的weight设定,增加或减小节点优先级。规则如下:
1. 当weight > 0时,vrrp_script script脚本执行返回0(成功)时优先级为priority + weight, 否则为priority。当BACKUP发现自己的优先级大于MASTER通告的优先级时,进行主从切换。
2. 当weight < 0时,vrrp_script script脚本执行返回非0(失败)时优先级为priority + weight, 否则为priority。当BACKUP发现自己的优先级大于MASTER通告的优先级时,进行主从切换。
3. 当两个节点的优先级相同时,以节点发送VRRP通告的IP作为比较对象,IP较大者为MASTER。 以上文中的配置为例:
HOST1: 10.15.8.100, priority=91, MASTER(default)
HOST2: 10.15.8.101, priority=90, BACKUP VIP: 10.15.8.102 weight = 2
抓包命令: tcpdump -nn vrrp
示例一:HOST1和HOST2上keepalived和nginx均正常。
事故模拟
如果nginx宕机,keepalived并不会进行切换,会导致用户请求失败,如何解决
思路:如果nginx宕机,如果keepalived启动,通过写脚本使二者相依相存。
第一种:当nginx停止,keepalived也立即停止,进行切换
缺点:停止切换需要一定的时间
第二种:当nginx,keepalived其中一个启动,就拉起另一个服务;
缺点:当nginx配置有误,怎样都起不来该怎么办
第三种:结合第一第二种;当nginx起不来时在去kill 掉keepalived
判断nginx存活的方法
1.判断nginx进程是否存在 ps aux|grep nginx|grep -v grep
2.判断nginx的端口是否存在 netstat -lntp|grep :80|wc -l
3.通过curl来模拟访问,判断访问结果是否ok curl -H Host:url.oldxu.com http://10.0.0.3
#1.编写脚本
[root@lb01 ~]# vim /script/check.sh
#!/usr/bin/bash
nginx_prot=$(netstat -lntp |grep :80|wc -l)
if [ $nginx_prot -ne 1 ];then
systemctl start nginx
rc=$?
sleep 3
if [ $rc -ne 0 ];then
systemctl stop keepalived
fi
fi
#2.调用脚本
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
globog_defs {
router_id lb1
}
vrrp_script check_web {
script "/script/check.sh"
interval 5
}
vrrp_instance VI 1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
track_script {
check_web
}
脑裂
#1.概念
指在一个高可用系统,当联系着的两个节点断开联系时,本来一个整体的系统,分裂为两个独立的节点,此时节点会互抢共享资源,对无状态的无影响
#2.解决方法
通过能ping通主并且备节点还有VIP的话则认为产生了脑列
#3.方案
[root@lb02 ~]# vim /scripts/check_spilt.sh
#!/usr/bin/bash
vip=10.0.0.3
master=10.0.0.5
ping -c2 $master_ip &>/dev/null
if [ $? -eq 0]; then
ip_check=$(ip addr|grep "$vip" |wc -l)
if [ $ip_check -eq 1 ]; then
echo "naolie"
systemctl stop keepalived
fi
fi
#4.调用脚本
[root@lb02 conf.d]# vim /etc/keepalived/keepalived.conf
globog_defs {
router_id lb2
}
vrrp_script check_spilt {
script "/scripts/check_spilt.sh"
interval 3
}
vrrp_instance VI 1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
track_script {
check_spilt
}