VRRP、keepalived简介及keepalived配置文件详解

一、VRRP协议简介
1、什么是VRRP协议?
VRRP(Virtual RouterRedundancy Protocol)协议是用于实现虚拟路由器冗余的协议, VRRP 协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP(一个或多个),而在路由器组内部,如果实际拥有这个对外 IP 的路由器如果工作正常的话就是 MASTER,或者是通过算法选举产生, MASTER 实现针对虚拟路由器 IP 的各种网络功能,如 ARP 请求, ICMP,以及数据的转发等;其他设备不拥有该虚拟 IP,状态是 BACKUP,除了接收 MASTER 的VRRP 状态通告信息外,不执行对外的网络功能。当主机失效时, BACKUP 将接管原先 MASTER 的网络功能。VRRP 协议使用多播数据来传输 VRRP 数据, VRRP 数据使用特殊的虚拟源 MAC 地址发送数据而不是自身网卡的 MAC 地址, VRRP 运行时只有 MASTER 路由器定时发送 VRRP 通告信息,表示 MASTER 工作正常以及虚拟路由器 IP(组), BACKUP 只接收 VRRP 数据,不发送数据,如果一定时间内没有接收到 MASTER 的通告信息,各 BACKUP 将宣告自己成为 MASTER,发送通告信息,重新进行 MASTER 选举状态。

2、VRRP协议相关概念
2.1 虚拟设备
由一个“主( Master )”设备和多个“备( Backup )"设备组成的一个设备组,对外体现为一个虚拟网关,当主设备当即后,备设备将选举代替主设备。

2.2 主设备( Master )
负责转发数据报文和周期性向备设备发送 VRRP 协议报文,告诉备设备自己还存活,并且告诉备设备自己的权重(竞争Master的优先级)。

2.3 备设备( Backup )
不负责转发数据报文,在 Master 设备发生故障的时候会通过选举形式成为新的 Master 设备。常见的为一主一备,有多个备设备时,需要配置奇数个备设备,避免投票数相当。备设备会接收来自 Master 设备的 VRRP 报文并加以分析,看Master是否存活以及权重。

2.4 VRID
用来表示一个 VRRP 组。

2.5 虚拟IP
也叫浮动IP,漂移IP。配置在虚拟设备上的虚拟IP地址,一个虚拟设备可以拥有一个或者多个虚拟IP地址。不具备真正的IP,只是拥有这个IP的ARP使用权和广播权,所以不需要在网卡上配置这个IP,只是虚拟在某个物理网卡上。

2.6 IP 地址拥有者
分配给虚拟设备的虚拟 IP 的真实拥有者,IP 地址拥有者会直接跳过选举成为 Master,并且是不可抢占的。

2.7 虚拟 MAC 地址
由虚拟设备生成的虚拟 MAC 地址,每一个虚拟设备都会自动生成一个虚拟 MAC 地址,这个 MAC 地址是用于虚拟设备处理 ARP 报文的

2.8 优先级
用于表示物理设备的优先级,这个参数用于 Master 的选举,取值范围是 1-254,这个有优先级有两个比较特殊的值,分别是 0 和 255,优先级 0 是由原来 Master 设备发送的,这个优先级是声明此设备不再参与 VRRP 组。优先级为 255 的是 IP 拥有者的优先级,拥有这个优先级会直接成为 Master。(优先级数值越低优先级则越高)

2.9 抢占模式
当 Backup 设备接收到的 VRRP 报文通过分析得出当前 Master 设备的优先级低于 Backup 设备,则 Backup 设备会切换为 Master 设备。
提示:我们所思考的是尽量提高可用性,并不是做到100%,比如每次主备切换,还有多次间歇性的心跳监听都无可避免的会丢掉一些数据,所以当 Master若宕机被救活,若它的性能与备服务器别无二致,其实没有必要让它进行抢占行为,因为抢占行为会造成更多的数据丢失,在生产环境里面我们一般是不开启抢占模式的,但注意,默认是开启的。

3、VRRP协议的工作状态
VRRP 协议一共有三种状态,分别是:初始状态( Initialize )、活动状态( Master )、备份状态( Backup )

3.1 初始状态
在这个状态下 VRRP协议是不可用的,因为此时内部正在互相竞争,故在这个状态下的设备是不会处理 VRRP 报文的,通常是刚配置 VRRP 时和检测到故障时(选举谁才是Master)会是这个状态。

3.2 活跃状态(实质上是Master节点)
1)定期发送 VRRP 报文。
2)以虚拟 MAC 地址响应对虚拟 IP 地址的 ARP 请求。
3)转发目的 MAC 地址为虚拟 MAC 地址的 IP 报文。
4)如果它是这个虚拟 IP 地址的拥有者,则接收目的 IP 地址为这个虚拟 IP 地址的 IP 报文。否则,丢弃这个 IP 报文。因为如果它不是虚拟 IP 地址的拥有者的话,证明应该由拥有者接收这个IP报文。
如果收到比自己优先级大的报文则转为 Backup 状态,如果Backup发现自己的优先级大于Master,则会主动向所有人广播VRRP报文,一是告诉Master将要取代他,二是告诉其他Backup节点他将成为主。
5)如果收到优先级和自己相同的报文,并且发送端的 IP 地址比自己的 IP 地址大,则转为 Backup 状态。
6)当接收到接口的 Shutdown 事件时,也就是管理员把网卡关掉,相当于即将让出Master的位置,转为Initialize(初始化状态)也就是0级别。

3.3 备份状态(实质上是Backup 点)
1)接收 Master 发送的 VRRP 报文,判断 Master 的状态是否正常。Master是否存活,权重是否比自己高,如果没有定期收到 Master 发送的 VRRP 报文,那说明Master已死,要重新选举。
2)对虚拟 IP 地址的 ARP 请求,不做响应。
3)丢弃目的 MAC 地址为虚拟 MAC 地址的 IP 报文。
4)丢弃目的 IP 地址为虚拟 IP 地址的IP报文。
5)Backup 状态下如果收到比自己优先级小的报文时,丢弃报文,立即切换为 Master( 仅在抢占模式下生效 )。
6)如果收到优先级和自己相同或者比自己高的报文,则重置定时器,不进一步比较 IP 地址,定时器相当于规定多长时间内必须收到VRRP报文。
7)当接收到接口的 Shutdown 事件时,转为 Initialize。
8)如果 MASTER_DOWN_INTERVAL 定时器超时(Master已死),则切换为 Master。

4、VRRP工作方式
4.1 主备备份模式
一主一从,同一个时间段只有一个节点承接压力访问。

4.2 负载分担模式
按照轮询的方案,让多个路由节点分担负载,承接访问压力,最后在末端将数据报文拼接在一起。注意,这是VRRP协议本身的功能。但2台物理机要请求2台不同的真实服务器要调度时,不可能完成数据拼接,也因此负载分担模式并不能用于Keepalived软件。

二、Keepalived
1、Keepalived简介

Keepalived 是一种高性能的服务器高可用或热备解决方案, 可以用来防止服务器单节点故障的发生,通过配合 Nginx 可实现 web 前端服务的高可用。是专为 LVS 和 HA(高可用性)设计的一款健康检查工具,使用成熟的 VRRP 协议。在Keepalived中有一个LVS进程专门用来对接LVS,如果他发现LVS真实服务器节点有损坏的话,会帮忙将损坏的节点剔除,可以说Keepalived诞生之初衷就是为了帮LVS做到高可用。

2、Keepalived特点
支持故障自动切换( Failover )
支持节点健康状态检查( Health Checking )

3、Keepalived配置文件详解
## Global 区域配置
global_defs {
}

## 报警参数设置
notification_email {
#指定当keepalived出现问题时,发送邮件给哪些用户。
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
# 发送邮件时,邮件的来源地址
}

smtp_server <DOMAIN|IP> []
# smtp服务器的地址或域名。默认端口为25.如:smtp_server smtp.felix.com 25
smtp_helo_name <HOST_NAME>
# 指定在HELO消息中所使用的名称。默认为本地主机名
smtp_connect_timeout
# 指定smtp服务器连接的超时时间。单位是秒

## 广播配置
vrrp_mcast_group4 224.0.0.18
# 指定发送VRRP组播消息使用的 IPV4 组播地址。默认是 224.0.0.18
vrrp_mcast_group6 ff02::12
# 指定发送 VRRP 组播消息所使用的IPV6组播地址。默认是 ff02::12

## LVS 模块配置
lvs_sync_daemon <VRRP_INSTANCE> [id <SYNC_ID>] [maxlen ] [port ] [ttl ] [group ]
# 设置 LVS 同步服务的相关内容。可以同步LVS的状态信息
# INTERFACE:指定同步服务绑定的接口
# VRRP_INSTANCE:指定同步服务绑定的VRRP实例
# id <SYNC_ID>:指定同步服务所使用的 SYNCID,只有相同的 SYNCID 才会同步。范围是 0-255
# maxlen:指定数据包的最大长度。范围是 1-65507
# port:指定同步所使用的 UDP 端口
# group:指定组播 IP 地址

lvs_flush
# 在keepalived启动时,刷新所有已经存在的LVS配置
vrrp_garp_master_delay 10
# 当转换为 MASTER 状态时,延迟多少秒发送第二组的免费 ARP。默认为 5s,0表示不发送第二组免的免费 ARP
vrrp_garp_master_repeat 1
# 当转换为 MASTER 状态时,在一组中一次发送的免费 ARP 数量。默认是 5
vrrp_garp_lower_prio_delay 10
# 当 MASTER 收到更低优先级的通告时,延迟多少秒发送第二组的免费 ARP
vrrp_garp_lower_prio_repeat 1
# 当 MASTER 收到更低优先级的通告时,在一组中一次发送的免费 ARP 数量
vrrp_garp_master_refresh 60
# 当 keepalived 成为 MASTER 以后,刷新免费 ARP 的最小时间间隔(会再次发送免费 ARP)。默认是0,表示不会刷新
vrrp_garp_master_refresh_repeat 2
# 当 keepalived 成为 MASTER 以后,每次刷新会发送多少个免费 ARP。默认是 1
vrrp_garp_interval 0.001
# 在一个接口发送的两个免费 ARP 之间的延迟。可以精确到毫秒级。默认是 0
vrrp_lower_prio_no_advert true|false
# 默认是 false。如果收到低优先级的通告,不发送任何通告
vrrp_version 2|3
# 设置默认的 VRRP 版本。默认是 2
vrrp_check_unicast_src
# 在单播模式中,开启对 VRRP 数据包的源地址做检查,源地址必须是单播邻居之一
vrrp_skip_check_adv_addr
# 默认是不跳过检查。检查收到的 VRRP 通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的 master 路由器,则不执行检查(跳过检查)
vrrp_strict
# 严格遵守 VRRP 协议。下列情况将会阻止启动 Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址
vrrp_iptables
# 不添加任何iptables规则。默认是添加 iptables 规则的

# 如果 vrrp 进程或 check 进程超时,可以用下面的 4 个选项。可以使处于 BACKUP 状态的 VRRP 实例变成 MASTER 状态,即使 MASTER 实例依然在运行。因为 MASTER 或 BACKUP 系统比较慢,不能及时处理 VRRP 数据包
vrrp_priority <-20 – 19>
# 设置VRRP进程的优先级。
checker_priority <-20 – 19>
# 设置checker进程的优先级。
vrrp_no_swap
# vrrp进程不能够被交换。
checker_no_swap
# checker进程不能够被交换。

## 脚本权限配置
script_user [groupname]
# 设置运行脚本默认用户和组。如果没有指定,则默认用户为 keepalived_script (需要该用户存在),否则为 root 用户。默认 groupname 同 username
enable_script_security
# 如果脚本路径的任一部分对于非 root 用户来说,都具有可写权限,则不会以 root 身份运行脚本

## 核心配置
router_id
# 指定标识该机器的route_id. 如:route_id LVS_01
default_interface eth0
# 设置静态地址默认绑定的端口。默认是 eth0
nopreempt
# 默认是抢占模式 要是用非抢占式的就加上 nopreempt

## Vrrp_script 区域配置
作用:添加一个周期性执行的脚本。脚本的退出状态码会被调用它的所有的 VRRP Instance 记录。 注意:至少有一个 VRRP 实例调用它并且优先级不能为 0 .优先级范围是 1-254**
vrrp_script <SCRIPT_NAME> { }

## 选项说明
scrip “/path/to/somewhere”
# 指定要执行的脚本的路径
interval
# 指定脚本执行的间隔。单位是秒。默认为 1s
timeout
# 指定在多少秒后,脚本被认为执行失败
weight <-254 — 254>
# 调整优先级。默认为2
rise
# 执行成功多少次才认为是成功
fall
# 执行失败多少次才认为失败
user [GROUPNAME]
# 运行脚本的用户和组
init_fail
# 假设脚本初始状态是失败状态
weight 说明
1. 如果脚本执行成功(退出状态码为0),weight大于0,则priority增加
2. 如果脚本执行失败(退出状态码为非0),weight小于0,则priority减少
3. 其他情况下,priority不变

## Vrrp_instance 区域配置说明
vrrp_instance VI_1 { }
## 选项说明
state MASTER|BACKUP
# 指定该 keepalived 节点的初始状态
interface eth0
# vrrp 实例绑定的接口,用于发送 VRRP 包
use_vmac [<VMAC_INTERFACE>]
# 在指定的接口产生一个子接口,如 vrrp.51,该接口的 MAC 地址为组播地址,通过该接口向外发送和接收 VRRP 包
vmac_xmit_base
# 通过基本接口向外发送和接收 VRRP 数据包,而不是通过 VMAC 接口
native_ipv6
# 强制 VRRP 实例使用 IPV6.(当同时配置了 IPV4 和 IPV6 的时候)
dont_track_primary
# 忽略 VRRP 接口的错误,默认是没有配置的
mcast_src_ip
# 指定发送组播数据包的源 IP 地址。默认是绑定 VRRP 实例的接口的主 IP 地址
unicast_src_ip
# 指定发送单薄数据包的源 IP 地址。默认是绑定 VRRP 实例的接口的主 IP 地址
version 2|3
# 指定该实例所使用的 VRRP 版本
virtual_router_id 51
# 指定 VRRP 实例 ID,范围是 0-255
priority 100
# 指定优先级,优先级高的将成为 MASTER
advert_int 1
# 指定发送 VRRP 通告的间隔。单位是秒
nopreempt
#设置为不抢占。默认是抢占的,当高优先级的机器恢复后,会抢占低优先级的机器成为MASTER,而不抢占,则允许低优先级的机器继续成为MASTER,即使高优先级的机器已经上线。如果要使用这个功能,则初始化状态必须为 BACKUP
preempt_delay
#设置抢占延迟。单位是秒,范围是0—1000,默认是0.发现低优先级的 MASTER 后多少秒开始抢占

track_interface {
eth0
eth1 weight <-254-254>

}
# 如果 track 的接口有任何一个出现故障,都会进入 FAULT 状态

track_script {
<SCRIPT_NAME>
<SCRIPT_NAME> weight <-254-254>
}
# 添加一个 track 脚本 ( vrrp_script 配置的脚本 )

unicast_peer {


}
# 采用单播的方式发送 VRRP 通告,指定单播邻居的 IP 地址

authentication {
auth_type PASS|AH
# 指定认证方式。PASS 简单密码认证 ( 推荐 ), AH:IPSEC 认证( 不推荐 )
auth_pass 1234
# 指定认证所使用的密码。最多8位
}

virtual_ipaddress {
/ brd dev scope label

## 通知脚本:
notify_master | [username [groupname]]
notify_backup | [username [groupname]]
notify_fault | [username [groupname]]
notify | [username [groupname]]

## 当停止VRRP时执行的脚本。
notify_stop | [username [groupname]]
smtp_alert
# 当状态发生改变时,发送邮件

## vrrp_sync_group 区域配置说明
作用:将所有相关的 VRRP 实例定义在一起,作为一个 VRRP Group,如果组内的任意一个实例出现问题,都可以实现 Failover
vrrp_sync_group VG_1 {
group {
inside_network # vrrp instance name
outside_network # vrrp instance name

}

}

## 选项说明
说明:如果 username 和 groupname 没有指定,则以默认的 script_user 所指定的用户和组
notify_master /path/to_master.sh [username [groupname]]
# 作用:当成为 MASTER 时,以指定的用户和组执行脚本
notify_backup /path/to_backup.sh [username [groupname]]
# 作用:当成为 BACKUP 时,以指定的用户和组执行脚本
notify_fault “/path/fault.sh VG_1” [username [groupname]]
# 作用:当该同步组 Fault 时,以指定的用户和组执行脚本
notify /path/notify.sh [username [groupname]]
# 作用:在任何状态都会以指定的用户和组执行脚本
# 说明:该脚本会在notify_*脚本后执行
# notify 可以使用 3 个参数,如下:
# $1:可以是GROUP或INTANCE,表明后面是组还是实例
# $2:组名或实例名
# $3:转换后的目标状态。有:MASTER、BACKUP、FAULT
smtp_alert
# 当状态发生改变时,发送邮件
global_tracking
# 所有的 VRRP 实例共享相同的 tracking 配置

## LVS 相关配置
## virtual_server 区域配置
virtual_server IP Port | virtual_server fwmark int | virtual_server group string {
delay_loop
# 健康检查的时间间隔
lb_argo rr|wrr|lc|wlc|lblc|sh|dh
# LVS 调度算法
lb_kind NAT|DR|TUN
# LVS 模式
persistence_timeout 360
# 持久化超时时间,单位是秒。默认是 6 分钟
persistence_granularity
# 持久化连接的颗粒度
protocol TCP|UDP|SCTP
# 4 层协议
ha_suspend
# 如果 virtual server 的 IP 地址没有设置,则不进行后端服务器的健康检查
virtualhost
# 为 HTTP_GET 和 SSL_GET 执行要检查的虚拟主机。如 virtualhost www.felix.com
sorry_server
# 添加一个备用服务器。当所有的 RS 都故障时
sorry_server_inhibit
# 将 inhibit_on_failure 指令应用于 sorry_server 指令
alpha
# 在 keepalived 启动时,假设所有的 RS 都是 down,以及健康检查是失败的。有助于防止启动时的误报。默认是禁用的。
omega
# 在 keepalived 终止时,会执行 quorum_down 指令所定义的脚本
quorum
# 默认值 1. 所有的存活的服务器的总的最小权重。
quorum_up
# 当 quorum 增长到满足 quorum 所定义的值时,执行该脚本
quorum_down
# 当 quorum 减少到不满足 quorum 所定义的值时,执行该脚本
}

## real_server 区域配置
real_server IP Port {
weight
# 给服务器指定权重。默认是1
inhibit_on_failure
# 当服务器健康检查失败时,将其 weight 设置为 0,而不是从 Virtual Server 中移除
notify_up
# 当服务器健康检查成功时,执行的脚本
notify_down
# 当服务器健康检查失败时,执行的脚本
uthreshold
# 到这台服务器的最大连接数
lthreshold
# 到这台服务器的最小连接数
}

## real_server 中的健康检查
HTTP_GET | SSL_GET {
url {
path
# 指定要检查的 URL 的路径。如path / or path /mrtg2
digest
# 摘要。计算方式:genhash -s 172.17.100.1 -p 80 -u /index.html
status_code
# 状态码
}

nb_get_retry <INT>
# get尝试次数
delay_before_retry <INT>
# 在尝试之前延迟多长时间
connect_ip <IP ADDRESS>
# 连接的IP地址。默认是 real server 的 ip 地址
connect_port <PORT>
# 连接的端口。默认是 real server 的端口。
bindto <IP ADDRESS>
# 发起连接的接口的地址
bind_port <PORT>
# 发起连接的源端口
connect_timeout <INT>
# 连接超时时间。默认是 5s
fwmark <INTEGER>
# 使用 fwmark 对所有出去的检查数据包进行标记
warmup <INT>
# 指定一个随机延迟,最大为 N 秒。可防止网络阻塞。如果为 0,则关闭该功能

}
TCP_CHECK {
connect_ip
# 连接的 IP 地址。默认是 real server 的 ip 地址
connect_port
# 连接的端口。默认是 real server 的端口
bindto
# 发起连接的接口的地址。
bind_port
# 发起连接的源端口。
connect_timeout
# 连接超时时间。默认是5s
fwmark
# 使用 fwmark 对所有出去的检查数据包进行标记
warmup
# 指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能
retry
# 重试次数。默认是1次
delay_before_retry
# 默认是1秒。在重试之前延迟多少秒
}

SMTP_CHECK {
connect_ip
# 连接的IP地址。默认是 real server 的 ip 地址
connect_port
# 连接的端口。默认是 real server 的端口。 默认是 25 端口
bindto
# 发起连接的接口的地址
bind_port
# 发起连接的源端口。
connect_timeout
# 连接超时时间。默认是5s
fwmark
# 使用 fwmark 对所有出去的检查数据包进行标记
warmup
# 指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
retry
# 重试次数
delay_before_retry
# 在重试之前延迟多少秒
helo_name
# 用于 SMTP HELO 请求的字符串
}

DNS_CHECK {
connect_ip
# 连接的IP地址。默认是 real server 的 ip 地址
connect_port
# 连接的端口。默认是 real server 的端口。 默认是 25 端口
bindto
# 发起连接的接口的地址
bind_port
# 发起连接的源端口
connect_timeout
# 连接超时时间。默认是 5s
fwmark
# 使用 fwmark 对所有出去的检查数据包进行标记
warmup
# 指定一个随机延迟,最大为 N 秒。可防止网络阻塞。如果为0,则关闭该功能
retry
# 重试次数。默认是3次。
type
# DNS query type。A/NS/CNAME/SOA/MX/TXT/AAAA
name
# DNS查询的域名。默认是(.)
}

MISC_CHECK {
misc_path
# 外部的脚本或程序路径
misc_timeout
# 脚本执行超时时间
user USERNAME [GROUPNAME]
# 指定运行该脚本的用户和组。如果没有指定 GROUPNAME,则 GROUPNAME 同 USERNAME
misc_dynamic
# 根据退出状态码动态调整权重
# 0,健康检查成功,权重不变
# 1,健康检查失败
# 2-255,健康检查成功。权重设置为退出状态码减去2.如退出状态码是 250,则权重调整为 248
warmup
# 指定一个随机延迟,最大为 N 秒。可防止网络阻塞。如果为 0,则关闭该功能
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值