keepalive高可用
-------------------------------------------------------------------------------------------------------------------------------------------
一、集群Cluster
1、集群类型:
LB lvs/nginx(http/upstream, stream/upstream)
HA 高可用性
SPoF: Single Point of Failure
HPC
2、系统可用性的公式:A=MTBF/(MTBF+MTTR)
(0,1), 95%
几个9(指标): 99%, ..., 99.999%,99.9999%;
系统故障:
硬件故障:设计缺陷、wear out(损耗)、自然灾害……
软件故障:设计缺陷
3、提升系统高用性的解决方案之降低MTTR:
手段:冗余redundant
active/passive 主备
active/active 双主
active --> HEARTBEAT --> passive
active <--> HEARTBEAT <--> active
4、高可用的是“服务”:
HA nginx service:
vip/nginx process[/shared storage]
资源:组成一个高可用服务的“组件”
(1) passive node的数量
(2) 资源切换
5、shared storage:
NAS:文件共享服务器;
SAN:存储区域网络,块级别的共享
6、Network partition:网络分区
quorum:法定人数
with quorum: > total/2
without quorum: <= total/2
隔离设备: fence
node:STONITH = Shooting The Other Node In The Head,断电重启
资源:断开存储的连接
7、TWO nodes Cluster
辅助设备:ping node, quorum disk
8、Failover:故障切换,即某资源的主节点故障时,将资源转移至其它节点的操作
Failback:故障移回,即某资源的主节点故障后重新修改上线后,将之前已转移至其它节点的资源重新切回的过程
9、HA Cluster实现方案:
ais:应用接口规范 完备复杂的HA集群
RHCS:Red Hat Cluster Suite红帽集群套件
heartbeat
corosync
vrrp协议实现:虚拟路由冗余协议
keepalived
二、KeepAlived
1、keepalived:
vrrp协议:Virtual Router Redundancy Protocol,一种容错协议
2、术语:
虚拟路由器:Virtual Router
虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
物理路由器:
master:主设备,承担报文转发任务
backup:备用设备,主路由器故障时,能代替主路由器工作的备用路由器
priority:优先级
VIP:Virtual IP,虚拟路由器的IP地址,一个虚拟路由器可以拥有一个或多个IP地址
VMAC:Virutal MAC (00-00-5e-00-01-VRID),不能用来通信,只是一种标识而已
3、通告:心跳,优先级等;周期性
4、工作方式:抢占式,非抢占式
抢占式:发现优先级比自己低的设备在主设备,都会发起新一轮的选举,让自己做主设备
非抢占式:当格局已定,无论优先级如何,都不会发起选举
5、安全工作:
认证:
无认证
简单字符认证:预共享密钥
MD5
6、工作模式:
主/备:单虚拟路径器
主/主:主/备(虚拟路径器1),备/主(虚拟路径器2)
7、keepalived:
vrrp协议的软件实现,原生设计目的为了高可用ipvs服务
8、功能:
(1)vrrp协议完成地址流动
(2)为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
(3)为ipvs集群的各RS做健康状态检测
(4)基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务,以此支持作调度器的nginx、haproxy等服务
9、组件:
核心组件:
vrrp stack
ipvs wrapper
checkers
控制组件:配置文件分析器
IO复用器
内存管理组件
10、keepalived组成
checkers:健康性检查
VRRP Stack:vrrp协议的实现,判定主节点和从节点,并检测主节点可以和从节点发heartbeats
watch dog:内核中的组件
三、KeepAlived实现
1、HA Cluster 配置准备:
(1) 各节点时间必须同步
ntp, chrony
(2) 确保iptables及selinux不会成为阻碍
(3) 各节点之间可通过主机名互相通信(对KA并非必须)
建议使用/etc/hosts文件实现,如果DNS出现问题会使稳定性大打折扣
(4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信(对KA并非必须)
2、keepalived安装配置:
CentOS 6.4+ Base源
yum -y install keepalived
3、程序环境:
主配置文件:/etc/keepalived/keepalived.conf
主程序文件:/usr/sbin/keepalived
Unit File:/usr/lib/systemd/system/keepalived.service
Unit File的环境配置文件:/etc/sysconfig/keepalived
四、KeepAlived配置
1、配置文件组件部分:
2、TOP HIERACHY
GLOBAL CONFIGURATION
Global definitions
Static routes/addresses
VRRPD CONFIGURATION
VRRP synchronization group(s):vrrp同步组
VRRP instance(s):即一个vrrp虚拟路由器
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s):ipvs集群的vs和rs
3、配置语法:
(1)配置虚拟路由器:每一个虚拟路由器对应一个vrrp_instance(vrrp实例)
vrrp_instance
....
}
(2)专用参数:
state MASTER|BACKUP:当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP
interface IFACE_NAME:绑定为当前虚拟路由器使用的物理接口
virtual_router_id VRID:当前虚拟路由器惟一标识,范围是0-255
priority 100:当前物理节点在此虚拟路由器中的优先级;范围1-254
advert_int 1:vrrp通告的时间间隔,默认1s
authentication { #认证机制
auth_type AH|PASS
auth_pass
}
virtual_ipaddress { #虚拟IP
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
track_interface { #配置监控网络接口,一旦出现故障,则转为FAULT状态 实现地址转移
eth0
eth1
…
}
(3)nopreempt:定义工作模式为非抢占模式
(4)preempt_delay 300:抢占式模式,节点上线后触发新选举操作的延迟时长,默认模式
(5)定义通知脚本:
notify_master
当前节点成为主节点时触发的脚本
notify_backup
当前节点转为备节点时触发的脚本
notify_fault
当前节点转为“失败”状态时触发的脚本
notify
通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
五、单主配置示例:
! Configuration File for keepalived
global_defs {
notification_email { ----》定义目标收件人
root@localhost
}
notification_email_from keepalived@localhost ----》模拟发件人
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1 #主机名,在另一结点为node2
vrrp_mcast_group4 224.0.100.100
----》定义组播域的组播地址,默认是224.0.0.18(224~239)
}
vrrp_instance VI_1 {
state MASTER ----》定义自己为master,其余结点上都为BACKUP
interface eth0
virtual_router_id 6 ----》多个节点必须相同,0~255之间
priority 100 ----》定义优先级
advert_int 1 ----》通告间隔1s
authentication {
auth_type PASS ----》只有PASS和AH选项,简易用PASS
auth_pass 571f97b2 ----》无论密码多长,只支持前8个字符
}
virtual_ipaddress { ----》定义虚拟ip
172.18.100.66/16 dev eth0 label eth0:0
172.168.100.67/16 dev eth1
}
track_interface {
eth0
}
}
示例:
主服务器的配置,即state MASTER的配置
从服务器的配置,glob
结束时候主服务器重启keepalived服务,从服务器tcpdump -i eth0 -nn host 224.0.56.18,对广播域抓包,有结果:
六、KeepAlived双主配置
1、脚本的调用方法:
在vrrp_instance VI_1 语句块最后面加下面行
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
2、示例通知脚本
#!/bin/bash
#
contact='root@localhost' ----》表示邮件接受者
notify() {
mailsubject="$(hostname) to be $1, vip floating"
mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
示例:测试脚本,用master测试,邮箱内有邮件
之后vim /etc/keepalived/keepalived.conf,修改完成后重启keepalived
在另一节点主机vim /etc/keepalived/keepalived.conf添加同样内容,scp脚本至此主机,完成后重启keepalived
七、KeepAlived支持IPVS
1、虚拟服务器:
配置参数:
virtual_server IP port | virtual_server fwmark int ----》vip 端口或者防火墙标记
{
...
real_server {
...
}
...
}
delay_loop
lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定义调度方法
lb_kind NAT|DR|TUN:LVS集群的类型
persistence_timeout
protocol TCP:服务协议,仅支持TCP
sorry_server
real_server
{
weight
notify_up
notify_down
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHEC K { ... }:定义当前主机的健康状态检测方法
}
八、KeepAlived配置检测
1、 HTTP_GET|SSL_GET:应用层检测
HTTP_GET|SSL_GET {
url {
path
status_code
digest
}
connect_timeout
nb_get_retry
delay_before_retry
connect_ip
connect_port
bindto
bind_port
}
2、传输层检测 TCP_CHECK
TCP_CHECK {
connect_ip
connect_port
bindto
bind_port
connect_timeout
九、keepalived调用脚本进行资源监控
1、keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整
2、vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外
3、track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script
4、分两步:(1) 先定义一个脚本;(2) 调用此脚本
vrrp_script
script ""
interval INT
weight -INT
}
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}
十、LVS NAT模型VIP和DIP需要同步,需要同步组,一般高可用实现此模型较为复杂,建议用nginx或haproxy实现
vrrp_sync_group VG_1 {
group {
VI_1 # name of vrrp_instance (below)
VI_2 # One for each moveable IP.
}
}
vrrp_instance VI_1 {
eth0
vip
}
vrrp_instance VI_2 {
eth1
dip
}
说明vip写到实例VI_1库,dip写到实例VI_2里,两个实例在之前被vrrp_sync_group 定义到一个同步组VG_1中,所以调度的时候这两个地址一起漂移
十一、keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整;
分两步:(1) 先定义一个脚本;(2) 在vrrp实例中调用此脚本;
vrrp_script
script ""
interval INT
weight -INT
rise 2
fall 3
}
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
...
}
注意:
vrrp_script chk_down {
script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 1 || exit 0"
interval 1
weight -10
}
[[ -f /etc/keepalived/down ]]要特别地作为bash的参数的运行!
示例:结合外部脚本来影响虚拟路由器的内部判断结果中各节点或各实例的相关权重
vim /etc/keepalived/keepalived.conf
在LVS1、LVS2中都写入这两段
结果当master的LVS1服务器在/etc/keepalived/新建down文件后,LVS1将降权,ip地址漂移到LVS2上
示例:高可用nginx服务
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}
vrrp_script chk_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -5
}
vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx && exit 0 || exit 1"
interval 1
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.93/16 dev eno16777736
}
track_script {
chk_down
chk_nginx
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}