keepalive是HA(High Available)高可用集群的一种实现方案,用来防止系统架构中的单点故障。其是vrrp协议的实现。
vrrp(Virtual Router Redundancy Protocol),即是虚拟路由冗余协议。用于实现多个路由器的高可用性。其工作原理是将一组路由器虚拟成一个虚拟路由器对外提供一个或多个IP地址。在这组路由器当中,实际对外提供IP地址的路由器被称为MASTER,其他路由器除了接收MASTER的存活状态通告以外,不会执行对外的网络功能,被称之为BACKUP。MASTER由选举产生,当MASTER失效时,BACKUP便会称为MASTER,接管原先MASTER的网络功能。
1、如果对外的虚拟路由器IP就是路由器本身的IP的话,该路由器始终将是MASTER,这时的优先级值为255。
2、否则如果不具备虚拟IP的话,将进行MASTER选举,各路由器都宣告自己是MASTER,发送VRRP通告信息;
3、如果收到其他机器的发来的通告信息的优先级比自己高,将转回BACKUP状态;
4、如果优先级相等的话,将比较路由器的实际IP,IP值较大的优先权高;
当keepalived启动时,一般会启动一个主进程(master),和两个子进程(checker和vrrp核心模块)
1、checkers:用于实现ipvs后端的RealServer健康状态检测
2、watchDog:linux内核核心中的模块,用于监控keepalived的各进程的健康状态,当keepalived启动后,checkers和vrrp会定期通过linux中的一个套接字向watchdog发送状态通告信息,一旦watchdog接收不到进程的状态信息,master进程会将其杀死并重新启动
3、VRRP stack:此模块便是keepalived的核心模块,用于实现vrrp协议
4、IPVS wrappers:根据配置文件生成ipvs规则的组件
1、本机的主机名与hosts中定义的主机保持一致,要与hostname或uname -n命令获得名称一致。
2、各节点要能互相解析主机名:一般建议通过hosts文件进行解析
3、各个节点的时间必须同步
配置文件为/etc/keepalived/keepalived.conf ,其主要分为三大部分,每个配置端都需使用花括号"{}"括起来:
全局配置段:global_defs,配置文件中只能有一个
vrrp协议配置段:
vrrp_instance (实例配置)
vrrp synchronization group (同步组配置,将多个实例捆绑同步进退)
lvs配置段:virtual_server
//可通过man keepalived.conf 查看更详细的参数信息
全局配置段
global_defs { ##全局配置段
notification_email { ##定义故障通知邮箱
[email protected] ##邮箱地址
[email protected] ##邮箱地址
[email protected] ##邮箱地址
}
notification_email_from [email protected] ##发件人地址
smtp_server 192.168.200.1 ##邮件服务器地址
smtp_connect_timeout 30 ##联系邮件服务器的超时时长
router_id nod1 ##当前物理设备在网络中的唯一ID标识
vrrp_mcast_group4 224.0.0.18 ##定义IPv4的组播地址,可自行定义在224.0.0.0/8网段内
}
##默认vrrp工作于抢占模式,即优先级高的会自行抢占为MASTER;
脚本配置段
vrrp_script SRIPT_NAME { ##定义一个名为SCRIPT_NAME(自定义)的脚本,需在实例外部定义,在内部调用
script "COMMAND" ##script关键字,执行引号内的命令
interval 1 ##此脚本端的运行周期,单位为秒
weight [-|+]NUMBER ##执行优先级增加或减少指定个数
}
例如:
vrrp_sript test {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit0"
interval 2
weight -2
} ##此脚本意为:每隔两秒检查一下/etc/keepalived/目录下是否存在名为down的文件,若存在则返回失败状态码1,并执行优先级减2
在实例中调用如下:
vrrp_instance VI_1 {
xxxxx
xxxxx
track_script {
test
}
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
实例配置段
vrrp_instance instance_NAME { ##实例名在配置文件中不能重复
state MASTER或BACKUP ##定义当前节点默认为主或从节点
interface eth0 ##自动配置虚拟路由IP的网卡接口
virtual_router_id 51 ##当前虚拟路由的标识符,必须全局唯一(0-255)
priority 100 ##定义当前实例的优先级(0-255)
advert_int 1 ##状态通告周期(秒)---用于主节点向BACKUP节点通告心跳信息
authentication { ##消息认证配置
auth_type PASS ##认证方式(MD5或PASS简单字符认证)
auth_pass 1111 ##认证密码,所有同一虚拟实例节点的必须保持一致
}
virtual_ipaddress { ##自动配置在interface上的(vip)虚拟IP地址,可以是多个
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <作用域> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
nopreempt ##非抢占模式
notify_master "/etc/keepalived/notify.sh master" ##定义状态转换为master时所执行的脚本(脚本实例后面给出)
notify_backup "/etc/keepalived/notify.sh backup" ##定义状态转换为backup时所执行的脚本(脚本实例后面给出)
notify_fault "/etc/keepalived/notify.sh fault" ##定义状态转换为fault时所执行的脚本(脚本实例后面给出)
}
notify脚本示例:(放置在/etc/keepalived/)
#!/bin/bash
# Author: MageEdu <[email protected]>
# description: An example of notify script
#
vip=172.16.100.1
contact='root@localhost'
notify() {
mailsubject="`hostname` to be $1: $vip floating"
mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
master)
notify master
/etc/rc.d/init.d/haproxy start
exit 0
;;
backup)
notify backup
/etc/rc.d/init.d/haproxy stop
exit 0
;;
fault)
notify fault
/etc/rc.d/init.d/haproxy stop
exit 0
;;
*)
echo 'Usage: `basename $0` {master|backup|fault}'
exit 1
;;
esac
LVS配置段:
virtual_server 192.168.200.100 443 {
delay_loop 6 ##RealServer的健康状态探查的时间间隔
lb_algo rr ##负载均衡的调度算法(Scheduler)
lb_kind NAT ##LVS类型。支持NAT/DR/TUN
persistence timeout NUMBER ##定义持久连接的时长,单位秒。0为不适用持久连接
nat_mask 255.255.255.0
persistence_timeout 50 ##持久连接超时时间
protocol TCP ##只能适用TCP,若适用UDP则使用ops参数
virtualhost STRING ##定义对指定虚拟主机基于HTTP_GET或SSL_GET做健康状态监测
sorry_server IP PORT
real_server 192.168.201.100 443 { ##定义RealServer
notify_up <STRING>|<QUOTED-STRING> ##RealServer上线执行的脚本
notify_down <STRING>|<QUOTED-STRING> ##RealServer下线执行的脚本
weight 1 ##权重
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc或status_code <INT>
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd或status_code <INT>
}
connect_timeout 3 ##健康状态监测超时时间
nb_get_retry 3 ##number of get retry
delay_before_retry 3 ##每次重试之前延迟3秒
}
}
}
NO1:虚拟实例的简单配置:
拓扑简介:内网只有一个网关地址172.16.13.1 ,简单配置网关服务器的高可用
nod1配置:
>>>关闭selinux并清空防火墙规则
[root@nod1 ~]# setenforce 0
[root@nod1 ~]# iptables -F
>>>设置周期性任务计划,进行时间同步
[root@nod1 ~]# crontab -e ##编辑添加如下内容
*/3 * * * * /usr/sbin/ntpdate ntp.sjtu.edu.cn &> /dev/null && /sbin/hwclock -w &> /dev/null
>>>设置主机名,并定义hosts文件,实现主机名解析
[root@nod1 ~]# sed -i 's/\(HOSTNAME=\).*/\1nod1/' /etc/sysconfig/network && hostname nod1
[root@nod1 ~]# echo -e '127.0.0.1 nod1\n172.16.13.22 nod22' >> /etc/hosts
>>>安装keepalived,并进行配置
[root@nod1 ~]# yum install -y keepalived
[root@nod1 ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak ##将配置文件改变,以便于自行创建简单配置文件
[root@nod1 ~]# vim /etc/keepalived/keepalived.conf ##创建配置文件,并加入如下内容
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id nod1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.13.1 dev eth0 label eth0:0
}
}
[root@nod1 ~]# chkconfig keepalived on ##设置开机自动启动
[root@nod1 ~]# service keepalived start ##启动
nod22配置:
[root@nod22 ~]# setenforce 0
[root@nod22 ~]# iptables -F
>>>设置周期性任务计划,进行时间同步
[root@nod22 ~]# crontab -e ##编辑添加如下内容
*/3 * * * * /usr/sbin/ntpdate ntp.sjtu.edu.cn &> /dev/null && /sbin/hwclock -w &> /dev/null
>>>设置主机名,并定义hosts文件,实现主机名解析
[root@nod22 ~]# sed -i 's/\(HOSTNAME=\).*/\1nod22/' /etc/sysconfig/network && hostname nod22
[root@nod22 ~]# echo -e '127.0.0.1 nod22\n172.16.13.11 nod1' >> /etc/hosts
>>>安装keepalived,并进行配置
[root@nod22 ~]# yum install -y keepalived
[root@nod22 ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak ##将配置文件改变,以便于自行创建简单配置文件
[root@nod22 ~]# vim /etc/keepalived/keepalived.conf ##创建配置文件,并加入如下内容
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id nod22
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.13.1 dev eth0 label eth0:0
}
}
[root@nod22 ~]# chkconfig keepalived on ##设置开机自动启动
[root@nod22 ~]# service keepalived start ##启动
查看nod1的ip地址
配置已生效
>>>将nod1的keepalived设置为down,测试nod22是否会自动切换为MASTER并配置VIP地址:
[root@nod1 ~]# service keepalived stop
Stopping keepalived: [ OK ]
测试成功