keepalived 详解(包含相关概念和示例)
相关概念1、HA Cluster2、VRRP2.1 相关术语
2.2 其它介绍3、mailx3.1 安装3.2 使用
keepalived1、实现方式2、组件介绍3、HA Cluster的配置前提4、keepalived 安装5、keepalived 程序环境6、主配置文件组件部分6.1 配置语法6.2 单主配置示例6.3 双主配置示例
7、通知脚本配置7.1 通知脚本示例7.2 脚本的调用方法7.3 完整的调用方法示例7.4 完整的脚本调用示例
8、虚拟服务器配置8.1 虚拟服务器语法格式8.2 虚拟服务器配置参数8.3 虚拟服务器配置示例(单主模式的keepalive)8.4 虚拟服务器配置示例(双主模式的keepalive)
9、调用外部的辅助脚本进行资源监控(keepalived vrrp_script)9.1 keepalived 的 vrrp_script 详解9.1.1 优先级更新策略9.1.2 vrrp_script中节点权重改变算法9.1.3 Keepalived中Master和Backup角色选举策略
9.2 语法格式9.3 示例
相关概念
1、HA Cluster
1、集群类型:
LB(lvs
/nginx(http
/upstream
, stream
/upstream))、
HA、
HP
2、单点故障:SPoF
:(Single Point
of Failure)
3、系统可用性的公式:
A=MTBF/(
MTBF+MTTR)
4、系统故障:硬件故障(设计缺陷、wear out、自然灾害、……)和 软件故障(设计缺陷)
5、提升系统高用性的解决方案之降低
MTTR:采取冗余手段(redundant:active
/passive(主备),active
/active(双主))
6、高可用的是“服务”:
#
HA nginx service:vip
/nginx process
[/shared storage
]
# shared storage:
NAS(文件共享服务器)或
SAN(存储区域网络,块级别的共享)
# Network partition:网络分区
7、Failover:故障切换,即某资源的主节点故障时,将资源转移至其它节点的操作
8、Failback:故障移回,即某资源的主节点故障后重新修改上线后,将转移至其它节点的资源重新切回的过程
9、
HA Cluster实现方案
:
# vrrp协议的实现(keepalived)
# ais:完备
HA集群(
RHCS(cman)、heartbeat、corosync)
2、VRRP
vrrp协议:Virtual Redundant Routing Protocol。
2.1 相关术语
虚拟路由器:Virtual Router
虚拟路由器标识:
VRID(0-255)
物理路由器:
# master:主设备
# backup:备用设备
# priority:优先级
VIP:Virtual
IP
VMAC:Virutal
MAC (00-00-5e-00-01-VRID)
2.2 其它介绍
通告:进行心跳,优先级等信息周期性进行发送
模式:抢占式,非抢占式
安全工作:认证方式
# 无认证
# 简单字符认证
#
MD5
工作模式:
# 主
/备:单虚拟路径器
# 主
/主:主
/备(虚拟路径器
1),备
/主(虚拟路径器
2)
3、mailx
3.1 安装
[root@neo
-neo
~]# yum install mailx
-y
[root@neo
-neo
~]# rpm
-ql mailx
/bin
/mail
/bin
/mailx
/etc
/mail
.rc
/usr
/bin
/Mail
/usr
/bin
/nail
/usr
/share
/doc
/mailx
-12.5
/usr
/share
/doc
/mailx
-12.5/AUTHORS
/usr
/share
/doc
/mailx
-12.5/COPYING
/usr
/share
/doc
/mailx
-12.5/README
/usr
/share
/man
/man1
/Mail
.1.gz
/usr
/share
/man
/man1
/mail
.1.gz
/usr
/share
/man
/man1
/mailx
.1.gz
/usr
/share
/man
/man1
/nail
.1.gz
3.2 使用
[root@neo
-neo
~]# echo
"hello" | mail
-s
"hi" root@localhost # 进行邮件发送
, -s 指定邮件主题
[root@neo
-neo
~]# mail
Heirloom Mail version
12.5 7/5/10. Type
? for help
.
"/var/spool/mail/root": 2 messages
2 new
>N 1 root Thu Oct
3 09:58 18/603 "hi"
N 2 root Thu Oct
3 09:58 18/602 "hi"
& 2
Message
2:
From root@neo
-neo
.localdomain Thu Oct
3 09:58:44 2019
Return
-Path
: <root@neo
-neo
.localdomain
>
X-Original
-To
: root@localhost
Delivered
-To
: root@localhost
.localdomain
Date
: Thu
, 03 Oct
2019 09:58:44 -0400
To
: root@localhost
.localdomain
Subject
: hi
User
-Agent
: Heirloom mailx
12.5 7/5/10
Content
-Type
: text
/plain
; charset
=us
-ascii
From
: root@neo
-neo
.localdomain (root
)
Status
: R
hello
& exit
You have mail
in /var/spool
/mail
/root
keepalived
1、实现方式
vrrp协议的软件实现,原生设计的目的为了高可用ipvs服务:
基于vrrp协议完成地址流动为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)为ipvs集群的各RS做健康状态检测基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务
2、组件介绍
核心组件
vrrp stack
ipvs wrapper
checkers
控制组件:配置文件分析器
IO复用器
内存管理组件
分为两大层:内核空间(Kernel Space)、用户空间(User Space)
IPVS(IP Virtual Server): 实现传输层负载平衡,也称为第4层交换
NETLINK: 用于在内核和用户空间进程之间传输信息
Keepalived 分为3个守护进程:
父进程: 很简单,负责 fork 子进程,并监视子进程健康(图中 WatchDog 周期性发送检测包,需要的话重启子进程)子进程A: 负责VRRP框架(图中 VRRP Stack)子进程B: 负责健康检查(图中 Checkers)
3、HA Cluster的配置前提
各节点时间必须同步(使用 ntp, chrony 进行实现)确保iptables及selinux不会成为阻碍各节点之间可通过主机名互相通信(对KA并非必须):(建议使用/etc/hosts文件实现)确保各节点的用于集群服务的接口支持MULTICAST通信(使用D类地址:224-239)
4、keepalived 安装
CentOS 6.4 以上的版本随base仓库提供。
5、keepalived 程序环境
主配置文件:
/etc
/keepalived
/keepalived
.conf
主程序文件:
/usr
/sbin
/keepalived
Unit File:keepalived
.service
Unit File的环境配置文件:
/etc
/sysconfig
/keepalived
6、主配置文件组件部分
TOP HIERACHY
#
GLOBAL CONFIGURATION
# Global definitions
# Static routes
/addresses
#
VRRPD CONFIGURATION
#
VRRP synchronization
group(s
):vrrp同步组
#
VRRP instance(s
):每个vrrp instance,即一个vrrp路由器
#
LVS CONFIGURATION
# Virtual server
group(s
)
# Virtual
server(s
):ipvs集群的vs和rs
6.1 配置语法
配置虚拟路由器:
vrrp_instance
<STRING> {
....
}
配置虚拟路由器的专用参数:
state
MASTER|BACKUP # 当前节点在此虚拟路由器上的初始状态;只能有一个是
MASTER,余下的都应该为
BACKUP
interface IFACE_NAME # 绑定为当前虚拟路由器使用的物理接口
virtual_router_id
VRID # 当前虚拟路由器的惟一标识,范围是
0-255
priority
100 # 当前主机在此虚拟路径器中的优先级;范围
1-254
advert_int
1 # vrrp通告的时间间隔;
authentication
{ # 配置认证方式,支持
8个简单字符的认证方式
auth_type
AH|PASS
auth_pass
<PASSWORD>
}
virtual_ipaddress
{ # 配置
VIP
<IPADDR>/<MASK> brd
<IPADDR> dev
<STRING> scope
<SCOPE> label
<LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2
:1
}
track_interface
{ # 配置要监控的网络接口,一旦接口出现故障,则转为
FAULT状态在
eth0
eth1
...
}
nopreempt # 定义工作模式为非抢占模式
preempt_delay
300 # 抢占式模式下,节点上线后触发新选举操作的延迟时长
定义通知脚本:
# notify_master
<STRING>|<QUOTED-STRING> # 当前节点成为主节点时触发的脚本
# notify_backup
<STRING>|<QUOTED-STRING> # 当前节点转为备节点时触发的脚本
# notify_fault
<STRING>|<QUOTED-STRING> # 当前节点转为“失败”状态时触发的脚本
# notify
<STRING>|<QUOTED-STRING> # 通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
6.2 单主配置示例
! 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_instance
VI_1 {
state
BACKUP
interface eno16777736
virtual_router_id
14
priority
98
advert_int
1
authentication
{
auth_type
PASS
auth_pass
571f97b2
}
virtual_ipaddress
{
10.1.0.91/16 dev eno16777736
}
}
6.3 双主配置示例
! 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_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.91/16 dev eno16777736
}
}
vrrp_instance
VI_2 {
state
BACKUP
interface eno16777736
virtual_router_id
15
priority
98
advert_int
1
authentication
{
auth_type
PASS
auth_pass
578f07b2
}
virtual_ipaddress
{
10.1.0.92/16 dev eno16777736
}
}
7、通知脚本配置
7.1 通知脚本示例
#
!/bin
/bash
#
contact
='root@localhost'
notify() {
local mailsubject
="$(hostname) to be $1, vip floating"
local 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
7.2 脚本的调用方法
# 需要配置在
VRRP_INSTANCE 的上下文中
notify_master
"/etc/keepalived/notify.sh master"
notify_backup
"/etc/keepalived/notify.sh backup"
notify_fault
"/etc/keepalived/notify.sh fault"
7.3 完整的调用方法示例
[root@Neo_Neo keepalived
]# cat keepalived
.conf
! 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 Neo_Tang
vrrp_mcast_group4
224.0.0.58
}
vrrp_instance
VI_1 {
state
BACKUP
interface ens33
virtual_router_id
33
priority
96
advert_int
1
authentication
{
auth_type
PASS
auth_pass
JIAOTANG
}
virtual_ipaddress
{
192.168.1.99/24 dev ens33 label ens33
:0
}
notify_master
"/etc/keepalived/notify.sh master"
notify_backup
"/etc/keepalived/notify.sh backup"
notify_fault
"/etc/keepalived/notify.sh fault"
}
7.4 完整的脚本调用示例
### 节点
1
[root@Neo_Neo keepalived
]# cat keepalived
.conf
! 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 Neo_Tang
vrrp_mcast_group4
224.0.0.58
}
vrrp_instance
VI_1 {
state
BACKUP
interface ens33
virtual_router_id
33
priority
96
advert_int
1
authentication
{
auth_type
PASS
auth_pass
JIAOTANG
}
virtual_ipaddress
{
192.168.1.99/24 dev ens33 label ens33
:0
}
notify_master
"/etc/keepalived/notify.sh master"
notify_backup
"/etc/keepalived/notify.sh backup"
notify_fault
"/etc/keepalived/notify.sh fault"
}
### 节点
2
[root@Neo_Tang keepalived
]# cat keepalived
.conf
! 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 neo
-neo
vrrp_mcast_group4
224.0.0.58
}
vrrp_instance
VI_1 {
state
MASTER
interface ens33
virtual_router_id
33
priority
100
advert_int
1
authentication
{
auth_type
PASS
auth_pass
JIAOTANG
}
virtual_ipaddress
{
192.168.1.99/24 dev ens33 label ens33
:0
}
notify_master
"/etc/keepalived/notify.sh master"
notify_backup
"/etc/keepalived/notify.sh backup"
notify_fault
"/etc/keepalived/notify.sh fault"
}
### 节点之间进行主备倒换时,查看邮件服务器是否能够成功收到邮件
[root@Neo_Tang keepalived
]# systemctl start keepalived
.service
[root@Neo_Tang keepalived
]# systemctl status keepalived
.service
● keepalived
.service
- LVS and
VRRP High Availability Monitor
Loaded
: loaded (/usr
/lib
/systemd
/system
/keepalived
.service
; disabled
; vendor preset
: disabled
)
Active
: active (running
) since Fri
2019-10-04 11:22:55 EDT; 5s ago
Process
: 7450 ExecStart
=/usr
/sbin
/keepalived $
KEEPALIVED_OPTIONS (code
=exited
, status
=0/SUCCESS)
Main
PID: 7451 (keepalived
)
CGroup
: /system
.slice
/keepalived
.service
├─
7451 /usr
/sbin
/keepalived
-D
├─
7452 /usr
/sbin
/keepalived
-D
└─
7453 /usr
/sbin
/keepalived
-D
Oct
04 11:22:55 Neo_Tang Keepalived_vrrp
[7453]: VRRP_Instance(VI_1) Transition to
MASTER STATE
Oct
04 11:22:56 Neo_Tang Keepalived_vrrp
[7453]: VRRP_Instance(VI_1) Entering
MASTER STATE
Oct
04 11:22:56 Neo_Tang Keepalived_vrrp
[7453]: VRRP_Instance(VI_1) setting protocol VIPs
.
Oct
04 11:22:56 Neo_Tang Keepalived_vrrp
[7453]: Sending gratuitous
ARP on ens33
for 192.168.1.99
Oct
04 11:22:56 Neo_Tang Keepalived_vrrp
[7453]: VRRP_Instance(VI_1) Sending
/queueing gratuitous ARPs on ens33
for 192.168.1.99
Oct
04 11:22:56 Neo_Tang Keepalived_vrrp
[7453]: Sending gratuitous
ARP on ens33
for 192.168.1.99
Oct
04 11:22:56 Neo_Tang Keepalived_vrrp
[7453]: Sending gratuitous
ARP on ens33
for 192.168.1.99
Oct
04 11:22:56 Neo_Tang Keepalived_vrrp
[7453]: Sending gratuitous
ARP on ens33
for 192.168.1.99
Oct
04 11:22:56 Neo_Tang Keepalived_vrrp
[7453]: Sending gratuitous
ARP on ens33
for 192.168.1.99
Oct
04 11:22:56 Neo_Tang Keepalived_vrrp
[7453]: Opening script file
/etc
/keepalived
/notify
.sh
Hint
: Some lines were ellipsized
, use
-l to show
in full
.
[root@Neo_Tang keepalived
]# mail
Heirloom Mail version
12.5 7/5/10. Type
? for help
.
"/var/spool/mail/root": 2 messages
1 new
1 root Thu Oct
3 09:58 19/613 "hi"
>N 2 root Fri Oct
4 11:22 18/702 "Neo_Tang to be master, vip floating"
& 2
Message
2:
From root@Neo_Tang
.localdomain Fri Oct
4 11:22:57 2019
Return
-Path
: <root@Neo_Tang
.localdomain
>
X-Original
-To
: root@localhost
Delivered
-To
: root@localhost
.localdomain
Date
: Fri
, 04 Oct
2019 11:22:56 -0400
To
: root@localhost
.localdomain
Subject
: Neo_Tang to be master
, vip floating
User
-Agent
: Heirloom mailx
12.5 7/5/10
Content
-Type
: text
/plain
; charset
=us
-ascii
From
: root@Neo_Tang
.localdomain (root
)
Status
: R
2019-10-04 11:22:56: vrrp transition
, Neo_Tang changed to be master
& exit
8、虚拟服务器配置
8.1 虚拟服务器语法格式
virtual_server
IP port
|
virtual_server fwmark int
{
...
real_server
{
...
}
...
}
8.2 虚拟服务器配置参数
delay_loop
<INT> # 服务轮询的时间间隔
lb_algo rr
|wrr
|lc
|wlc
|lblc
|sh
|dh # 定义调度方法
lb_kind
NAT|DR|TUN # 集群的类型
persistence_timeout
<INT> # 持久连接时长
protocol
TCP # 服务协议,仅支持
TCP
sorry_server
<IPADDR> <PORT> # 备用服务器地址和端口
real_server
<IPADDR> <PORT> # 真实服务器地址和端口
{
weight
<INT>
notify_up
<STRING>|<QUOTED-STRING>
notify_down
<STRING>|<QUOTED-STRING>
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } # 定义当前主机的健康状态检测方法
}
HTTP_GET|SSL_GET # 应用层检测参数说明
HTTP_GET|SSL_GET {
url
{
path
<URL_PATH> # 定义要监控的
URL
status_code
<INT> # 判断上述检测机制为健康状态的响应码
digest
<STRING> # 判断上述检测机制为健康状态的响应的内容的校验码
}
nb_get_retry
<INT> # 重试次数
delay_before_retry
<INT> # 重试之前的延迟时长
connect_ip
<IP ADDRESS> # 向当前
RS的哪个
IP地址发起健康状态检测请求
connect_port
<PORT> # 向当前
RS的哪个
PORT发起健康状态检测请求
bindto
<IP ADDRESS> # 发出健康状态检测请求时使用的源地址
bind_port
<PORT> # 发出健康状态检测请求时使用的源端口
connect_timeout
<INTEGER> # 连接请求的超时时长
}
TCP_CHECK # 传输层检测参数说明
TCP_CHECK {
connect_ip
<IP ADDRESS> # 向当前
RS的哪个
IP地址发起健康状态检测请求
connect_port
<PORT> # 向当前
RS的哪个
PORT发起健康状态检测请求
bindto
<IP ADDRESS> # 发出健康状态检测请求时使用的源地址
bind_port
<PORT> # 发出健康状态检测请求时使用的源端口
connect_timeout
<INTEGER> # 连接请求的超时时长
}
8.3 虚拟服务器配置示例(单主模式的keepalive)
! 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_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
}
notify_master
"/etc/keepalived/notify.sh master"
notify_backup
"/etc/keepalived/notify.sh backup"
notify_fault
"/etc/keepalived/notify.sh fault"
}
virtual_server
10.1.0.93 80 {
delay_loop
3
lb_algo rr
lb_kind
DR
protocol
TCP
sorry_server
127.0.0.1 80
real_server
10.1.0.69 80 {
weight
1
HTTP_GET {
url
{
path
/
status_code
200
}
connect_timeout
1
nb_get_retry
3
delay_before_retry
1
}
}
real_server
10.1.0.71 80 {
weight
1
HTTP_GET {
url
{
path
/
status_code
200
}
connect_timeout
1
nb_get_retry
3
delay_before_retry
1
}
}
}
TCP_CHECK使用示例:
TCP_CHECK {
nb_get_retry
3
delay_before_retry
2
connect_timeout
3
}
8.4 虚拟服务器配置示例(双主模式的keepalive)
! Configuration File
for keepalived
global_defs
{
notification_email
{
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server
127.0.0.1
smtp_connect_timeout
30
router_id node1
vrrp_mcast_group4
224.0.100.67
}
vrrp_instance
VI_1 {
state
MASTER
interface eno16777736
virtual_router_id
44
priority
100
advert_int
1
authentication
{
auth_type
PASS
auth_pass f1bf7fde
}
virtual_ipaddress
{
172.16.0.80/16 dev eno16777736 label eno16777736
:0
}
track_interface
{
eno16777736
}
notify_master
"/etc/keepalived/notify.sh master"
notify_backup
"/etc/keepalived/notify.sh backup"
notify_fault
"/etc/keepalived/notify.sh fault"
}
vrrp_instance
VI_2 {
state
BACKUP
interface eno16777736
virtual_router_id
45
priority
98
advert_int
1
authentication
{
auth_type
PASS
auth_pass f2bf7ade
}
virtual_ipaddress
{
172.16.0.90/16 dev eno16777736 label eno16777736
:1
}
track_interface
{
eno16777736
}
notify_master
"/etc/keepalived/notify.sh master"
notify_backup
"/etc/keepalived/notify.sh backup"
notify_fault
"/etc/keepalived/notify.sh fault"
}
virtual_server fwmark
3 {
delay_loop
2
lb_algo rr
lb_kind
DR
nat_mask
255.255.0.0
protocol
TCP
sorry_server
127.0.0.1 80
real_server
172.16.0.69 80 {
weight
1
HTTP_GET {
url
{
path
/
status_code
200
}
connect_timeout
2
nb_get_retry
3
delay_before_retry
3
}
}
real_server
172.16.0.6 80 {
weight
1
HTTP_GET {
url
{
path
/
status_code
200
}
connect_timeout
2
nb_get_retry
3
delay_before_retry
3
}
}
}
9、调用外部的辅助脚本进行资源监控(keepalived vrrp_script)
keepalived 调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整。
分为两步:
先定义一个脚本调用此脚本
9.1 keepalived 的 vrrp_script 详解
keepalived 只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。但是这些还不够,我们还需要监控 keepalived 所在服务器上的其他业务进程,比如说 nginx,keepalived+nginx 实现 nginx 的负载均衡高可用,如果 nginx 异常,仅仅keepalived 保持正常,是无法完成系统的正常工作的,因此需要根据业务进程的运行状态决定是否需要进行主备切换。这个时候,我们可以通过编写脚本对业务进程进行检测监控。
9.1.1 优先级更新策略
keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
这里需要注意的是:
优先级不会不断的提高或者降低可以编写多个检测脚本并为每个检测脚本设置不同的weight不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况
这样可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。
9.1.2 vrrp_script中节点权重改变算法
在Keepalived集群中,其实并没有严格意义上的主、备节点,虽然可以在Keepalived配置文件中设置“state”选项为“MASTER”状态,但是这并不意味着此节点一直就是Master角色。控制节点角色的是Keepalived配置文件中的“priority”值,但并它并不控制所有节点的角色,另一个能改变节点角色的是在vrrp_script模块中设置的“weight”值,这两个选项对应的都是一个整数值,其中“weight”值可以是个负整数,一个节点在集群中的角色就是通过这两个值的大小决定的。
在vrrp_script模块中,如果不设置“weight”选项值,那么集群优先级的选择将由Keepalived配置文件中的“priority”值决定,而在需要对集群中优先级进行灵活控制时,可以通过在vrrp_script模块中设置“weight”值来实现。
在vrrp_script模块中,如果设置“weight”选项值,vrrp_script 里的script返回值为0时认为检测成功,其它值都会当成检测失败。
weight 为正时,脚本检测成功时此weight会加到priority上,检测失败时不加;
1、主失败
:
主 priority
< 从 priority
+ weight 时会切换
2、主成功:
主 priority
+ weight
> 从 priority
+ weight 时,主依然为主
weight 为负时,脚本检测成功时此weight不影响priority,检测失败时priority –
abs(weight
)
1、主失败
:
主 priority –
abs(weight
) < 从priority 时会切换主从
2、主成功
:
主 priority
> 从priority 主依然为主
9.1.3 Keepalived中Master和Backup角色选举策略
在Keepalived集群中,其实并没有严格意义上的主、备节点,虽然可以在Keepalived配置文件中设置“state”选项为“MASTER”状态,但是这并不意味着此节点一直就是Master角色。控制节点角色的是Keepalived配置文件中的“priority”值,但并它并不控制所有节点的角色,另一个能改变节点角色的是在vrrp_script模块中设置的“weight”值,这两个选项对应的都是一个整数值,其中“weight”值可以是个负整数,一个节点在集群中的角色就是通过这两个值的大小决定的。
在一个一主多备的Keepalived集群中,“priority”值最大的将成为集群中的Master节点,而其他都是Backup节点。在Master节点发生故障后,Backup节点之间将进行“民主选举”,通过对节点优先级值“priority”和““weight”的计算,选出新的Master节点接管集群服务。
在vrrp_script模块中,如果不设置“weight”选项值,那么集群优先级的选择将由Keepalived配置文件中的“priority”值决定,而在需要对集群中优先级进行灵活控制时,可以通过在vrrp_script模块中设置“weight”值来实现。
9.2 语法格式
vrrp_script
<SCRIPT_NAME> {
script
"" # 脚本名称或脚本内容
interval
INT # 运行脚本的间隔时间
weight
-INT # 权重减去
INT的值
}
track_script
{ # 在
VRRP 实例中进行脚本调用
SCRIPT_NAME_1
SCRIPT_NAME_2
...
}
9.3 示例
! 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"
# 脚本内容
# 存在 down 文件,则异常退出,并执行以下命令(失败)
# 不存在 down 文件,则正常退出(成功)
interval
1 # 每
1 秒检测一次
weight
-5 # 如果检测失败,则权重
-5
fall
1 # 如果检测失败
1 次,则权重
-5
rise
1 # 如果检测成功
1 次,则恢复 权重
}
vrrp_script chk_nginx
{
script
"killall -0 nginx && exit 0 || exit 1"
# 脚本内容
# 存在 nginx 进程,则正常退出(成功)
# 不存在 nginx 进程,则异常退出(失败)
interval
1 # 每
1 秒检测一次
weight
-5 # 如果检测失败(非
0),则权重
-5
fall
2 # 如果检测失败(非
0)
2 次,则权重
-5
rise
1 # 如果检测成功(为
0)
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"
}