keepalived.conf配置手册译文
程序员文章站
2022-07-12 17:31:04
...
keepalived.conf(5) Keepalived配置手册 keepalived.conf(5)
名称
keepalived.conf-Keepalived的配置文件
描述
keepalived.conf是描述所有Keepalived关键字的配置文件。 关键字放置在块和子块的层次结构中,每一层由“ {”和“}”对分隔。
注释以“#”或“!”开头 到行尾,可以在一行中的任何地方开始。
关键字“ include”允许从主配置文件中或随后包含的文件中包含其他配置文件。
include指令的格式为:
include FILENAME
FILENAME可以是标准路径或相对路径名,并且可以包含通配符,如果glob()支持的话,可以包含csh样式的大括号表达式,例如“ {foo / {,cat,dog},bar}”。
打开包含文件后,当前目录将设置为文件本身的目录,因此文件包含的任何相对路径都相对于包含文件本身的目录。
注意:为了配置Keepalived,必须将本文档视为详尽的信息来源。 此文档由Keepalived核心团队支持和维护。
参数语法
<BOOL>是on | off | true | false | yes | no之一
<TIMER>是以秒为单位的时间值,包括小数秒,例如 2.71828或3; 计时器的分辨率为微秒。
脚本
可以配置要执行的三类脚本。
(a)通知当vrrp实例或vrrp组更改状态或虚拟服务器仲裁在向上和向下之间更改时运行的脚本。
(b)vrrp跟踪脚本会导致vrrp实例关闭,从而退出非零存在状态,或者如果指定了权重,则会对该vrrp实例的优先级添加权重或从中减去权重。
(c)LVS检查器杂项脚本,如果它们以非零状态退出,将导致配置实际服务器。
默认情况下,如果该用户存在,则脚本将由用户keepalived_script执行;如果不是,则由root用户执行,但可以为每个脚本指定要在其下执行的用户/组。
如果以root特权执行脚本,将对安全产生重大影响,尤其是如果脚本本身可以由非root用户修改或替换的话。 因此,在启动时进行安全检查,以确保如果脚本是由root用户执行的,则该脚本不能被非root用户修改或替换。
应该编写所有脚本,以便它们在收到SIGTERM信号后终止。 如果脚本的父级终止,则将向SIGTERM发送脚本,或者该脚本是keepalived等待退出状态且运行时间过长的脚本。
带引号的字符串
带引号的字符串在“个字符之间指定;更具体地说,如果后面有空格,则字符串将仅在带引号的字符串之后结束。例如:
"abcd" efg h jkl "mnop"
将是单个字符串“ abcd efg h jkl mnop”,即删除了嵌入的字符。
带引号的字符串也可以包含转义字符,例如shell。 \ a,\ b,\ E,\ f,\ n,\ r,\ t,\ v,\ nnn和\ xXX(其中nnn最多为3个八进制数字,而XX为任意十六进制数字序列)和\ 支持cC(产生字符C的控制版本)。 \ C对于任何其他字符C都只是被视为字符C的转义版本,因此\\是\字符,而\“将是”字符,但是不会以引号开头或结尾。
为了使用参数指定脚本,未加引号的空格将分隔参数。 如果要求参数包含空格,则应将其括在单引号(')中。
配置解析器
传统上,配置文件解析器并不是保持连接的优势之一。 即使这不是该项目的主要目标,也已经付出了很多努力来纠正此问题。
最高层级
Keepalived配置文件围绕一组配置块进行连接。 每个模块都将重点放在特定的守护程序系列功能上。 这些功能是:
全局配置
BFD配置
VRRPD配置
LVS配置
全局配置
包含全局定义,Linkbeat接口,静态跟踪组,静态地址,静态路由和静态规则的子块
全局定义
# 以下是用于在单独的网络名称空间中运行keepalived的全局守护程序工具:
# --
# 设置要运行的网络名称空间。目录/ var / run / keepalived将被创建为一个非共享的挂载点,例如pid文件。syslog条目将在名称后附加_NAME。注意:无法在重新加载配置时更改名称空间。
net_namespace NAME
# 在指定的网络名称空间中添加IPVS配置。 它允许轻松地在给定名称空间上拆分VIP流量,并将运行状况检查流量保留在另一个名称空间中。 如果未指定NAME,则将使用默认名称空间。
net_namespace_ipvsNAME
# 在Linux 3.13之前,ipsets尚不知道网络名称空间,因此,如果使用#早期版本的内核运行,则默认情况下,如果未使用名称空间且未指定vrrp_ipsets,则禁用ipsets。 此选项将覆盖默认值,并允许ipset与3.13之前的内核上的命名空间一起使用。
namespace_with_ipsets
#如果在同一名称空间中运行多个keepalived实例,则将在/ var / run / keepalived中创建带有NAME作为文件名一部分的pid文件。
注意:无法在重新加载配置时更改实例名称
instance NAME
# 在/ var / run / keepalived中创建pid文件
use_pid_dir
# 使用ETHTOOL,MII或ioctl接口进行轮询以检测媒体链接故障,否则使用netlink接口。
linkbeat_use_polling
# 主进程允许子进程在终止时退出的时间(以秒为单位)。 对于非常大的配置,可能需要这样做。(默认值:5)
child_wait_time SECS
# 全局定义配置块
global_defs {
# 将keepalived进程的进程名称设置为默认值:keepalived,keepalived_vrrp,keepalived_ipvs,keepalived_bfd process_names
# 指定各个进程名称
process_name NAME
vrrp_process_name NAME
ipvs_process_name NAME
bfd_process_name NAME
# 启动脚本和关闭脚本分别运行一次,分别在运行任何子进程之前启动keepalived,以及在所有子进程终止之后终止keepalived。
# 添加此功能的最初动机是,尽管keepalived可以使用防火墙标记来设置IPVS配置,但没有机制可以添加配置以设置防火墙标记(或之后将其删除)。
# 如果使用iptables(请参阅下面的vrrp_iptables选项),修改接口设置或可以通过脚本或程序完成的任何其他操作,则此功能还可用于设置所需的iptables框架。
# 只能指定一个启动脚本和一个关闭脚本。
# 超时(以秒为单位,默认为10秒)是脚本运行所允许的时间。 如果超时到期,脚本将被杀死(这是为了停止keepalived挂起以等待脚本终止)。
startup_script SCRIPT_NAME [username [groupname]]
startup_script_timeout SECONDS # 范围 [1,1000]
shutdown_script SCRIPT_NAME [username [groupname]]
shutdown_script_timeout SECONDS # 范围 [1,1000]
# 电子邮件收件人:
notification_email {
[email protected]
...
}
# 发件人(默认:keepalived @ <本地主机名>)
notification_email_from [email protected]
# 用于发送通知电子邮件的远程SMTP服务器。IP地址或域名以及可选的端口号。(默认端口号:25)
smtp_server 127.0.0.1 [<PORT>]
# 在HELO消息中使用的名称。(默认:本地主机名)
smtp_helo_name <STRING>
# SMTP服务器连接超时(以秒为单位)。
smtp_connect_timeout 30
# 设置所有smtp_alerts的默认状态
smtp_alert <BOOL>
# 设置vrrp smtp_alerts的默认状态
smtp_alert_vrrp <BOOL>
# 设置检查smtp警报的默认状态
smtp_alert_checker <BOOL>
# 设置在检查时记录所有检查失败的日志
checker_log_all_failures <BOOL>
# 不要发送故障情况的SMTP警报
no_email_faults
# 标识机器的字符串(不必是主机名)。(默认:本地主机名)
router_id <STRING>
# 用于IPv4 VRRP广告的组播组
# (default: 224.0.0.18)
vrrp_mcast_group4 224.0.0.18
# 用于IPv6 VRRP广告的组播组
# (default: ff02::12)
vrrp_mcast_group6 ff02::12
# 设置静态地址的默认接口。
# (default: eth0)
default_interface p33p1.3
# IPVS内核代码提供的同步守护程序一次仅支持一个主服务器和一个备份守护程序实例来同步IPVS连接表。
# 有关同步守护程序的更多详细信息,请参见ipvsadm(8)手册页。
# 参数是绑定接口,并且是可选的:
# inst VRRP_INSTANCE(为了向后兼容,可以省略inst)为lvs syncd的syncid(0到255),默认为vrrp实例的VRID,如果没有vrrp实例maxlen(1..65507)最大包长度(限制为mtu- 20-8)端口(1..65535)要使用的UDP端口号,默认8848 ttl(1..255)组-组播组地址(IPv4或IPv6),默认224.0.0.81如果未指定VRRP_INSTANCE,则两个主 只要keepalived运行,备份同步守护程序就会运行,否则同步守护程序的主/备份状态将跟踪指定的vrrp实例的状态:如果vrrp实例处于主状态,则只有主同步守护程序才能运行。 vrrp实例不是主实例,仅备份同步守护程序将运行。
# 注意:maxlen,port,ttl和group仅在Linux 4.3或更高版本上可用。
# 有关控制IPVS和同步守护程序的参数的详细信息,请参见内核源文档doc / Documentation / networking / ipvs-sysctl.txt。
# / proc / net / ip_vs *提供有关IPVS状态的一些详细信息。
lvs_sync_daemon <INTERFACE> [[inst] <VRRP_INSTANCE>] [id <SYNC_ID>] \
[maxlen <LEN>] [port <PORT>] [ttl <TTL>] [group <IP ADDR>]
# 启动时刷新任何现有的LVS配置
lvs_flush
# 在关闭时刷新剩余的LVS配置如果指定了VS,则在不显式删除实际服务器的情况下删除每个keepalived托管虚拟服务器(内核将删除它们)。
lvs_flush_onstop [VS]
# 过渡到MASTER后,第二套免费ARP的延迟。以秒为单位,0表示没有第二组。
# (default: 5)
vrrp_garp_master_delay 10
# 过渡到MASTER后一次发送的免费ARP消息数。
# (default: 5)
vrrp_garp_master_repeat 1
# MASTER收到较低优先级的广告后,第二组免费ARP的延迟。
vrrp_garp_lower_prio_delay 10
# 在MASTER收到较低优先级的广告后,一次发送的免费ARP消息的数量。
vrrp_garp_lower_prio_repeat 1
# 刷新免费ARP的最短时间间隔,同时以秒为单位的MASTER。
# (default: 0 (没有刷新))
vrrp_garp_master_refresh 60
# 在MASTER时一次发送的免费ARP消息数
# (default: 1)
vrrp_garp_master_refresh_repeat 2
# 在接口上发送的免费ARP消息之间的延迟(以毫秒为单位),以秒为单位(分辨率usecs)。
# (default: 0)
vrrp_garp_interval 0.001
# 在接口上发送的自发NA消息之间的延迟(以毫秒为单位),十进制,秒(分辨率usecs)。
# (default: 0)
vrrp_gna_interval 0.000001
# 默认情况下,keepalived一次发送5则ARP / NA消息,过渡到MASTER后,在5秒后发送第二个5消息块。
# 对于现代交换机,这是没有必要的,因此设置vrrp_min_garp只会导致发送一条ARP / NA消息,并且5秒钟后不再重复。
vrrp_min_garp [<BOOL>]
# 如果收到优先级较低的广告,请不要发送其他广告。这会导致遵循RFC。 除非设置strict_mode,否则默认为false。
vrrp_lower_prio_no_advert [<BOOL>]
# 如果我们是主广告并收到较高优先级的广告,请先发送广告(其优先级将低于其他主广告),然后再过渡到备用广告。 这意味着,如果另一个主服务器设置了garp_lower_priority_repeat,它将重新发送garp消息。
#这是为了解决他们同时担任两个主服务器的问题,最后看到的GARP消息来自我们。
vrrp_higher_prio_send_advert [<BOOL>]
# 设置要使用的默认VRRP版本(默认值:2,但IPv6实例将使用版本3)
vrrp_version <2 or 3>
# keepalived使用防火墙(nftable或iptables)有两个目的:
# i) 实现no_accept模式
# ii) 停止在VMAC接口上发送IGMP / MLD数据包,并将其移动到基础接口上。
# 如果同时指定了vrrp_iptables和vrrp_nftables,则keepalived将使用nftable而不是iptables。 同样,如果iptables命令正在生成nftables配置,或者未安装iptables命令,则keepalived将使用nftables而不是iptables。
# 如果既未指定vrrp_nftables也没有指定vrrp_iptables,但正在使用VMAC或指定了no_accept,则keepalived将使用nftables(如果可用)。
# 使用nftables作为防火墙。
# TABLENAME一定不存在,并且对于在同一网络名称空间中运行的每个keepalived实例,必须不同。
# 默认表名为keepalived,优先级为-1。
# keepalived将在表中创建基链。
# counters表示将计数器添加到规则中(主要用于调试目的)。
# ifindex表示使用ifindex而不是ifnames创建IPv6链接本地集。 除非vrrp_instance设置了dont_track_primary,否则这是默认设置。 替代方法是使用接口名称作为set键的一部分,但是v0.8.3之前的nft实用程序将无法正确输出接口名称。
nftables [TABLENAME]
nftables_priority PRIORITY
nftables_counters
nftables_ifindex
# 使用iptables作为防火墙。
# 注意:指定链必须存在于iptables和/或ip6tables配置中,并且必须从iptables配置中的适当位置调用该链。
# 在接受任何ESTABLISHED,RELATED数据包之后,可能有必要进行此过滤,因为IPv4可能会选择VIP作为传出连接的源地址。
# (default: INPUT)
vrrp_iptables keepalived
# 或也适用于出站过滤注意,出站过滤不适用于IPv4,因为可以将VIP选择为出站连接的源地址。 对于IPv6,这是不可能的,因为地址已弃用。
vrrp_iptables keepalived_in keepalived_out
# 或使用默认链(INPUT和OUTPUT)
vrrp_iptables
# Keepalived可以选择将ipset与iptables结合使用。 如果是这样,则可以指定ipset名称,默认值如下。 如果未指定名称,将不使用ipsets,否则将通过在先前指定的名称上添加“ _if”和/或“ 6”和_igmp / _mld来构造任何省略的名称。
vrrp_ipsets [keepalived [keepalived6 [keepalived_if6 [keepalived_igmp [keepalived_mld]]]]]
# 以下内容可以检查在单播模式下,VRRP数据包的源地址是我们的单播对等方之一。
vrrp_check_unicast_src
# 检查收到的VRRP广告中的所有地址可能很耗时。 设置此标志意味着,如果广告与先前收到的广告来自同一主路由器,则不会进行检查。
# (default:不要跳过)
vrrp_skip_check_adv_addr
# 强制严格遵守VRRP协议。 这将禁止:
# 0 VIP
# 单播对等
# VRRP版本2中的IPv6地址
vrrp_strict
# 在通知FIFO上发送vrrp实例优先级通知。
vrrp_notify_priority_changes <BOOL>
# 如果vrrp,checker或bfd进程超时,则可以使用以下选项。 即使主服务器仍在运行,备用vrrp实例也将成为主服务器,这可以看出这一点,因为主服务器或备份系统太忙而无法处理vrrp数据包。
# --
# keepalived可以在计时器到期后立即检测到运行不充分的情况下,提高优先级,首先切换到实时调度,如果不够,则每次将其实时优先级提高一 检测到进一步的运行延迟。 如果启用了实时调度,则将使用{bfd,checker,vrrp} _rlimit_rttime的值设置RLIMIT_RTTIME(请参见下文)。 对于较慢的处理器,可能需要增加这些值。
# --
# 要限制最大的自动优先级增加值,请指定以下内容(0不使用自动优先级增加,它是默认值。-1在启动时禁用警告消息)。 忽略优先级可设置最大值。
max_auto_priority [<-1 to 99>] # 99实际上是sched_get_priority_max(SCHED_RR)
# 计时器到期后,在计划keeplalive之前的最小延迟(以微秒为单位),之后进程优先级将自动递增(默认值为1000000 uscs(1秒),最大值为10000000(10秒))
min_auto_priority_delay <delay in usecs>
# 设置vrrp子进程优先级(负值增加优先级)
vrrp_priority <-20 to 19>
# 设置检查程序子进程的优先级
checker_priority <-20 to 19>
# 设置BFD子进程优先级
bfd_priority <-20 to 19>
# 将vrrp子进程设置为不可交换
vrrp_no_swap
# 将检查器子进程设置为不可交换
checker_no_swap
# 设置BFD子进程不可交换
bfd_no_swap
# 以下选项可用于强制vrrp,checker和bfd进程在受限制的CPU集上运行。
# 您可以将进程绑定到单个CPU或定义一组CPU。 在最后一种情况下,Linux内核将在调度期间限制为该CPU集。 强制将进程绑定到单个CPU可以提高重载盒的性能。
# 以下配置关键字的INTEGER表示cpu_id,如“处理器”行上的/ proc / cpuinfo中所示:
# --
# 为vrrp子进程设置CPU亲和力
vrrp_cpu_affinity <INTEGER> [<INTERGER>]...[<INTEGER>]
# 为检查程序子进程设置CPU亲和力
checker_cpu_affinity <INTEGER> [<INTERGER>]...[<INTEGER>]
# 为bfd子进程设置CPU亲和力
bfd_cpu_affinity <INTEGER> [<INTERGER>]...[<INTEGER>]
# 将vrrp子进程设置为以指定的优先级使用实时调度
vrrp_rt_priority <1..99>
# 将检查程序子进程设置为以指定的优先级使用实时调度
checker_rt_priority <1..99>
# 将BFD子进程设置为以指定的优先级使用实时调度
bfd_rt_priority <1..99>
# 设置阻止系统调用之间的CPU时间限制(以微秒为单位)
# (default: 10000)
vrrp_rlimit_rttime >=2
checker_rlimit_rttime >=2
bfd_rlimit_rttime >=2
# 如果Keepalived已使用SNMP支持进行构建,则可以使用以下关键字。
# 注意:Keepalived,checker和RFC支持可以单独启用/禁用
# --
# 指定用于连接到SNMP主代理的套接字(有关更多详细信息,请参见源模块keepalived / vrrp / vrrp_snmp.c)(默认值:unix:/ var / agentx / master)
snmp_socket udp:1.2.3.4:705
# 启用KEEPALIVED MIB的vrrp元素的SNMP处理
enable_snmp_vrrp
# 启用KEEPALIVED MIB的检查器元素的SNMP处理
enable_snmp_checker
# 启用RFC2787和RFC6527 VRRP MIB的SNMP处理
enable_snmp_rfc
# 启用RFC2787 VRRP MIB的SNMP处理
enable_snmp_rfcv2
# 启用RFC6527 VRRP MIB的SNMP处理
enable_snmp_rfcv3
# 启用SNMP陷阱
enable_traps
# 如果Keepalived已在DBus支持下构建,则可以使用以下关键字。
# --
# 启用DBus界面
enable_dbus
# DBus服务的名称,如果您想在启用DBus的情况下运行多个保持活动的进程,则很有用
# (default: org.keepalived.Vrrp1)
dbus_service_name SERVICE_NAME
# 指定要在其下运行脚本的默认用户名/组名。
# 如果未指定此选项,则如果该用户存在,则用户默认为keepalived_script,否则为root。
# 如果未指定groupname,则默认为用户的组。
script_user username [groupname]
# 如果路径的任何部分都可由非root用户写入,则不要运行配置为root用户运行的脚本。
enable_script_security
# 无需使用通知脚本,而是指定fifo可以更高效地处理通知事件,并保证将按正确的顺序进行传递。
# 注意:FIFO名称必须全部不同
# --
# FIFO将通知事件写入到有关输出格式的信息,请参见vrrp_notify_fifo和lvs_notify_fifo。有关更多详细信息,请参见vrrp_sync_group下的描述。
# 有关示例用法,请参阅doc / samples / sample_notify_fifo.sh。
notify_fifo FIFO_NAME [username [groupname]]
# 由keepalived运行以处理通知事件的脚本FIFO名称将作为最后一个参数传递给脚本
notify_fifo_script STRING|QUOTED_STRING [username [groupname]]
# FIFO写入vrrp通知事件。
# 写入的字符串将是以下格式的行:INSTANCE“ VI_1” MASTER 100,并且将以新的行字符终止。
# 有关输出的更多详细信息,请参阅vrrp_sync_group和doc / samples / sample_notify_fifo.sh下的说明以获取示例用法。
vrrp_notify_fifo FIFO_NAME [username [groupname]]
# 由keepalived运行以处理vrrp通知事件的脚本FIFO名称将作为最后一个参数传递给脚本
vrrp_notify_fifo_script STRING|QUOTED_STRING [username [groupname]]
# 将FIFO写入通知healthchecker事件的FIFO将写入以下形式的行:
# VS [192.168.201.15]:tcp:80 {UP|DOWN}
# RS [1.2.3.4]:tcp:80 [192.168.201.15]:tcp:80 {UP|DOWN}
# 并将以换行符终止。
lvs_notify_fifo FIFO_NAME [username [groupname]]
# 由keepalived运行以处理healthchecher通知事件的脚本FIFO名称将作为最后一个参数传递给脚本
lvs_notify_fifo_script STRING|QUOTED_STRING [username [groupname]]
# 允许配置包括启动时不存在的接口。
# 这允许keepalived与可能被删除和还原的接口一起使用,并且还允许在VMAC接口上使用虚拟和静态路由以及规则。
# allow_if_changes允许删除接口并使用其他类型或基础接口重新创建接口,例如从vlan更改为macvlan或将macvlan从eth1更改为eth2。 如果未设置allow_if_changes,则主要用于在启动时报告重复的VRID错误。
dynamic_interfaces [allow_if_changes]
# 仅在大型配置中需要以下选项,在大型配置中,keepalived会创建大量接口,或者系统具有大量接口。 仅当在系统日志中看到“ Netlink:Receive buffer overrun(接收缓冲区溢出)”消息时,才需要使用这些选项。
# 如果所需的缓冲区大小超过/ proc / sys / net / core / rmem_max中的值,则需要设置相应的force选项。
# --
# 设置网络链接接收缓冲区的大小。 这对于存在大量接口的超大型配置很有用,并且系统上接口的初始读取会导致netlink缓冲区溢出。
vrrp_netlink_cmd_rcv_bufs BYTES
vrrp_netlink_cmd_rcv_bufs_force <BOOL>
vrrp_netlink_monitor_rcv_bufs BYTES
vrrp_netlink_monitor_rcv_bufs_force <BOOL>
# vrrp netlink命令和监视器套接字,checker命令以及监视器套接字和进程监视器缓冲区大小可以独立设置。
# 强制标志意味着使用SO_RCVBUFFORCE,以便缓冲区大小可以超过/ proc / sys / net / core / rmem_max。
lvs_netlink_cmd_rcv_bufs BYTES
lvs_netlink_cmd_rcv_bufs_force <BOOL>
lvs_netlink_monitor_rcv_bufs BYTES
lvs_netlink_monitor_rcv_bufs_force <BOOL>
# 作为1400个进程同时终止的process_monitor_rcv_bufs的指南,212992(某些系统上的默认值)不足,而500000足够。
process_monitor_rcv_bufs BYTES
process_monitor_rcv_bufs_force <BOOL>
# 打开套接字后,内核会将套接字的最大rx缓冲区大小配置为/ proc / sys / net / core / rmem_default。 在某些系统上,这可能非常大,甚至通常可能会比所需的更大。
# 只要keepalived从其套接字读取所有排队的数据,这不是问题,但是如果rmem_default设置得足够大,并且由于某种原因keepalived停止读取,则可能会消耗所有系统内存。
# vrrp_rx_bufs_policy允许在打开套接字时配置rx bufs的大小。 如果策略是MTU,则使用套接字将每个vrrp实例的rx buf大小配置为接口的MTU * vrrp_rx_bufs_multiplier的总和。 同样,如果策略为ADVERT,则它是每个vrrp实例的总和,即广告包大小*乘数。
# (default: 使用系统默认值)
vrrp_rx_bufs_policy [MTU|ADVERT|NUMBER]
# (default: 3)
vrrp_rx_bufs_multiplier NUMBER
# 在启动时发送有关正在启动的真实服务器的通知
rs_init_notifies
# 不要在真正的服务器检查程序每次更改状态时发送电子邮件; 仅在添加或删除真实服务器时发送电子邮件
no_checker_emails
# 用于创建文件的umask。 可以用十六进制,八进制或十进制指定数字。 位是I {R | W | X} {USR | GRP | OTH},例如 IRGRP,以“ |”分隔。默认的umask是IWGRP | IWOTH。 此选项不能覆盖命令行选项。
umask [NUMBER|BITS]
# 在某些系统上,当创建绑定接口时,它们可以开始传递流量,然后在它们停止向内传递流量时有几秒钟的间隔。 这可能意味着,如果在启动时启动keepalived,即在创建绑定接口的同时启动keepalived,则keepalived不会收到广告,因此即使实例具有更高优先级发送广告,keepalived也可以成为主服务器。
# 此选项指定启动keepalived后vrrp实例启动之前的延迟(以秒为单位),
vrrp_startup_delay 5.5
# 以下将导致记录在其接收接口上未配置的VRID的VRRP广告的接收日志。
log_unknown_vrids
# 为$ {_ RANDOM}指定随机种子,以使配置可重复(默认是基于时间使用种子,以便每次生成不同的配置)。
random_seed UNSIGNED_INT
# reload_time_file允许在将来计划重新加载keepalived。 如果有一个主机keepalived实例和一个或多个备份keepalived实例并且新配置与以前的配置不兼容,例如,这特别有用。 添加或删除可能导致广告被拒绝的VIP。
# 可以安排所有实例同时重新加载,从而确保备份实例不会收到不匹配的广告。
# 该配置指定keepalived将监视的文件。 文件的第一行必须完全按照以下指定的格式包含有效时间或日期/时间。
# 当keepalived启动时,它将读取文件(如果存在),并计划在指定时间重新加载。 如果文件不存在,则将在随后创建文件时安排重新加载。 如果文件被更新,则重新加载时间将被相应地修改。 如果该文件被删除,则重新加载被取消。
# 通常,当重新加载发生时,指定的文件会被删除,因为重新加载已经完成。 如果文件包含日期,则重新加载将是过去的,因此将被忽略。 但是,如果没有日期,则如果在重新加载后重新读取文件,则将重新加载计划为24小时。 为了阻止这种情况,默认情况下会删除(取消链接)文件。 如果指定了reload_repeat,则不会删除该文件,并且如果该文件仅包含没有日期的时间,则keepalived将每天在该时间继续重新加载,直到删除或修改该文件为止。
# 如果包含文件的目录在启动/重新加载时不存在,或者目录已被删除或重命名,那么在完成手动(SIGHUP)重新加载或keepalived重新启动之前,将不会进行任何计划的重新加载。
# 计时器文件中允许的条目格式为:
# HH:MM:SS
# YY-MM-DD HH:MM:SS
# YYYY-MM-DD HH:MM:SS
# 每个结尾处都有一个可选的“ Z”。
# 日期和时间之间不得有任何前导或尾随空格。
# 如果时间末尾有“ Z”,则该时间将解析为UTC,否则该时间是keepalived运行环境的本地时间。 如果要重装的系统处于不同的时区,则使用UTC可能更安全。
# 如果使用具有夏令时的本地时间,请注意某些时间不存在,并且某些时间是重复的,因此模棱两可。
reload_time_file ABSOLUTE-PATHNAME-OF-FILE
reload_repeat
}
Linkbeat接口
linkbeat_interfaces块允许通过MII,Ethtool或ioctl状态指定应该使用轮询的接口,而不是依靠netlink状态更新。 这样可以更精细地控制全局定义linkbeat_use_polling。
该选项比vrrp_instance块中不推荐使用linkbeat_use_polling的方法更可取,因为后者仅允许在vrrp_instance本身的接口上使用linkbeat,而track_interface和virtual_ipaddresses和virtual_iproutes可能需要监视其他接口,这可能需要使用linkbeat轮询。
要使用的默认轮询类型是MII,除非在这种情况下不使用ETHTOOL,否则不使用它;如果不支持,则使用ioctl轮询。 可以使用的首选轮询类型可以在接口名称后用MII或ETHTOOL或IOCTL指定,但是如果不支持该类型,则将使用受支持的类型。
linkbeat_interfaces的语法为:
linkbeat_interfaces {
eth2
enp2s0 ETHTOOL
}
静态跟踪组
静态跟踪组用于允许vrrp实例跟踪静态地址,路由和规则。 如果静态地址/路由/规则指定了跟踪组,则如果地址/路由/规则被删除并且无法恢复,则vrrp实例将转换为故障状态。
跟踪组的语法为:
track_group GROUP1 {
group {
VI_1
VI_2
}
}
静态路由/地址/规则
Keepalived可以配置静态地址,路由和规则。 这些地址不会由vrrpd移动,而是保留在计算机上。 如果您的计算机上已经有IP和路由,并且计算机可以相互ping通,则不需要此部分。 规则和路由的语法与ip规则添加/ ip路由添加的语法相同(但由于歧义,不支持使用简短的选项名称)。 track_group规范引用了一个名为track_group的名称,其中列出了将跟踪该地址的vrrp实例,即,如果删除了该地址,则vrrp实例将过渡到备份。
注意:由于vrrp实例从主实例过渡到备用实例等原因,无首选项的规则可以按不同顺序添加,因此规则需要具有首选项。 如果未指定首选项,则keepalived将分配一个首选项,但可能不是您想要的。
虚拟地址和虚拟路由的语法相同。 如果未指定dev元素,则默认为default_interface(默认eth0)。 注意:广播地址可以指定为“-”或“ +”以清除或设置地址的主机位。
如果路由或规则可以应用于IPv4或IPv6,它将默认为IPv4。 要强制将路由/规则设置为IPv6,请添加关键字“ inet6”。
static_ipaddress {
<IPADDR>[/<MASK>] [brd <IPADDR>] [dev <STRING>] [scope <SCOPE>]
[label <LABEL>] [peer <IPADDR>] [home]
[-nodad] [mngtmpaddr] [noprefixroute]
[autojoin] [track_group GROUP] [preferred_lft nn|forever]
192.168.1.1/24 dev eth0 scope global
...
}
static_routes {
192.168.2.0/24 via 192.168.1.100 dev eth0 track_group GROUP1
192.168.100.0/24 table 6909 nexthop via 192.168.101.1 dev wlan0
onlink weight 1 nexthop via 192.168.101.2
dev wlan0 onlink weight 2
192.168.200.0/24 dev p33p1.2 table 6909 tos 0x04 protocol bird
scope link priority 12 mtu 1000 hoplimit 100
advmss 101 rtt 102 rttvar 103 reordering 104
window 105 cwnd 106 ssthresh lock 107 realms
PQA/0x14 rto_min 108 initcwnd 109 initrwnd 110
features ecn
2001:470:69e9:1:2::4 dev p33p1.2 table 6909 tos 0x04 protocol
bird scope link priority 12 mtu 1000
hoplimit 100 advmss 101 rtt 102 rttvar 103
reordering 104 window 105 cwnd 106 ssthresh
lock 107 rto_min 108 initcwnd 109
initrwnd 110 features ecn fastopen_no_cookie 1
...
}
static_rules {
from 192.168.2.0/24 table 1 track_group GROUP1
to 192.168.2.0/24 table 1
from 192.168.28.0/24 to 192.168.29.0/26 table small iif p33p1
oif wlan0 tos 22 fwmark 24/12
preference 39 realms 30/20 goto 40
to 1:2:3:4:5:6:7:0/112 from 7:6:5:4:3:2::/96 table 6908
uidrange 10000-19999
to 1:2:3:4:6:6:7:0/112 from 8:6:5:4:3:2::/96 l3mdev protocol 12
ip_proto UDP sport 10-20 dport 20-30
...
}
跟踪文件
添加要监视的文件。 修改后将读取文件。 将为所有VRRP实例,同步组和监视它的真实服务器记录文件中的值。 请注意,只有在至少一个VRRP实例,同步组或真实服务器监视该文件时,才会读取该文件。
该值将从文件中读取为数字形式的文本。 如果针对track_file配置的权重为0,则文件中的非零值将被视为失败状态,而将零值视为OK状态,否则该值将乘以 track_file语句。
对于VRRP实例,如果结果小于-253,则监视脚本的任何内容都将转换为故障状态(权重可以为254,以允许从文件中读取负值)。
如果vrrp实例或同步组不是地址所有者,并且结果在-253到253之间,则结果将添加到VRRP实例的初始优先级(负值将降低优先级),尽管有效优先级 将限制在[1,254]范围内。 对于真实服务器也是如此。
如果使用track_file的vrrp实例是同步组的成员,则除非在组上设置了sync_group_tracking_weight,否则必须将权重设置为0。 同样,如果vrrp实例是地址所有者,则还必须设置权重0。
对于监视文件的真实服务器,从跟踪文件读取的值的限制为2147483646至-2147483647。 该值乘以权重后,将被添加到真实服务器的IPVS权重中。
注意:实际服务器的track_file的权重尚未完全实现。 特别是允许重量为0,处理负的计算值并重新加载。
跟踪文件的语法为:
track_file <STRING> { # vrrp_track_file是已弃用的同义词
# 要跟踪的文件(权重默认为1)
file <QUOTED_STRING>
# 可选的默认权重
weight <-2147483647..2147483647> [reverse]
# 创建文件和/或初始化值如果文件不存在,则会在启动时将VALUE(默认值0)写入指定的文件,除非指定了覆盖,在这种情况下,任何现有的文件内容都将被指定的覆盖 值。
init_file [VALUE] [overwrite]
}
VRRP跟踪流程
配置块如下所示:
vrrp_track_process <STRING> {
# 监视的过程(带有可选参数)引号字符串被视为单个元素,因此,如果将process关键字后的第一项加引号,则将其作为命令名称。
# 例如:
# process "/tmp/a b" param1 "param 2"表示一个名为“ / tmp / a b”(已删除引号)的进程,带有2个参数“ param1”和“ param 2”。
process <STRING>|<QUOTED_STRING> [<STRING>|<QUOTED_STRING> ...]
# 如果匹配参数,则这将指定部分匹配(即前n个参数完全匹配)或初始匹配(即最后一个参数可能比配置的参数更长)。
# 要指定命令必须没有参数,请不要指定任何参数,而要指定param_match。
param_match {initial|partial}
# 默认权重(默认为1)。 有关反向的描述,请参见track_process。
# “权重0反向”将导致仲裁达到所需数量时vrrp实例关闭,反之亦然。
weight <-254..254> [reverse]
# 成功的最小数量
quorum NUM
# 成功的最大过程数。 例如,如果该进程的两个实例正在运行,则将此值设置为1会导致失败(但请注意forks-请参阅下面的fork_delay)。
# 如果完全运行匹配进程,则将其设置为0将意味着失败。
quorum_max NUM
# 在fork之后获得进程定额之后延迟的时间,然后才考虑进程启动(以秒为单位),这是为了避免fork / exec的向上/向下反弹
fork_delay SECS
# 在失去过程定额之后要延迟的时间,然后考虑关闭过程(以秒为单位),这是为了避免终止/父重新分叉后出现向下/向上反弹。
terminate_delay SECS
# 这将设置fork_delay和Terminate_delay
delay SECS
# 除非指定了参数,否则通常将进程字符串与进程名称匹配,如/ proc / PID / status中的Name:行所示。
# 此选项强制匹配完整的命令行
full_command
}
为避免必须频繁运行track_script来监视进程(通常是haproxy或nginx)的存在,vrrp_track_process可以监视其他进程是否正在运行。
与pgrep的不同之处在于track_process不会对命令字符串进行常规的表达式匹配,但会进行精确匹配。 “ pgrep ssh”将与sshd进程匹配,但该track_process将不匹配(等效于pgrep“ ^ ssh $”)。
如果使用full_command(等效于pgrep -f),则使用/ proc / PID / cmdline,但是不会检测到对cmdline的任何更新(通常不应更改进程,尽管可以非常小心地进行更改,例如 systemd)。
在Linux v3.2之前的版本中,track_process将不支持检测对进程名称的更改,因为内核没有通知3.2之前的进程名称的更改。 大多数进程不更改其进程名称,但是,例如,firefox派生将其进程名称更改为“ Web Content”的进程。 此处提到的进程名称是/ proc / PID / comm的内容。
法定人数是必须为OK状态运行的匹配进程的数量。
如果延迟可能会重新加载(停止并重新启动)进程,并且不需要关闭和启动vrrp实例,则延迟可能很有用。
权重为正数表示“确定”状态会将<weight>添加到监视它的所有VRRP实例的优先级。 相反,如果流程不足,将从初始优先级中减去负权重。
如果vrrp实例或同步组不是地址所有者,并且结果在-253到253之间,则结果将添加到VRRP实例的初始优先级(负值将降低优先级),尽管有效优先级 将限制在[1,254]范围内.
如果使用track_process的vrrp实例是同步组的成员,则除非在组上设置了sync_group_tracking_weight,否则权重必须设置为0。 同样,如果vrrp实例是地址所有者,则还必须设置权重0。
不使用pgrep / pidof / killall之类的原因:
每次运行pgrep或等效命令时,它都会遍历/ proc / [1-9] [0-9] *目录,并在每个目录中打开status和cmdline伪文件。 cmdline伪文件被映射到进程的地址空间,因此,如果交换出该进程的那部分,则必须从交换空间中获取它。 pgrep等也包括僵尸进程,而keepalived不包括,因为它们没有运行。
此实现仅在启动时通过/ proc / [1-9] [0-9] * /目录进行迭代,如果未为任何vrrp_track_process条目指定“ full_command”,它甚至不会读取cmdline伪文件。 启动后,它将使用process_events内核<->用户空间连接器来接收有关流程更改的通知。 如果为任何track_process实例指定了full_command,则必须在通知新进程创建时读取cmdline伪文件,但那时它已经被换出的可能性很小。
在具有大量进程创建/终止的繁忙系统上,将track_script与pgrep / pidof / killall一起使用可能会更高效,尽管与保持需求的最低要求相比,这些进程效率较低。
由于必须从交换空间中获取已交换的内存,因此在进行交换的系统上使用pgrep等会严重影响系统的性能,从而引起额外的交换。
BFD配置
这是RFC5880(双向转发检测)的实现,可以将其配置为在两个keepalived实例之间工作,但是在VRRP实例的主/备份对之间使用未加权的track_bfds意味着VRRP实例将只能出现 如果两个VRRP实例都在运行,则在一定程度上违反了VRRP的目的。
此实现已通过OpenBFDD(在https://github.com/dyninc/OpenBFDD上提供)进行了测试。
bfd实例的语法为:
bfd_instance <STRING> {
# BFD邻居IP(同义词neighbour_ip)
neighbor_ip <IP ADDRESS>
# 要使用的源IP(可选,除非要确保本地端口有效,否则是必需的)
source_ip <IP ADDRESS>
# 所需的最小RX间隔,以毫秒为单位
# (default is 10 ms)
min_rx <INTEGER>
# 所需的最小TX间隔,以毫秒为单位
# (default is 10 ms)
min_tx <INTEGER>
# 所需的空闲TX间隔,以毫秒为单位
# (default is 1000 ms)
idle_tx <INTEGER>
# 会话宣告关闭后丢失的数据包数
# (default is 5)
multiplier <INTEGER>
# 以被动模式操作(默认为主动)
passive
# 要使用的传出IPv4 ttl(默认值255)
ttl <INTEGER>
# 要使用的传出IPv6跳数限制(默认为64)
hoplimit <INTEGER>
# 接收到的数据包中ttl / hoplimit的最大减少量(默认为0)(255禁用跳数检查)
max_hops <INTEGER>
# 默认跟踪权重通常,当bfd实例启动时,正权重将添加到vrrp实例优先级,当负值启动时,负权重将降低优先级。
# 但是,如果指定了反向,则优先级在增加时降低,在降低时增加。 当bfd实例启动时,“ weight 0 reverse”将导致vrrp实例关闭,反之亦然。
weight <-253:253> [reverse]
# 通常,bfd事件通知会发送到VRRP和检查程序进程。
# 指定vrrp或checker将导致仅将此bfd_instance的事件通知发送到指定的进程
vrrp
checker
}
VRRPD配置
包含VRRP脚本,VRRP同步组,VRRP免费ARP和未经请求的邻居广告延迟组和VRRP实例的子块
VRRP脚本
该脚本将每隔<interval>秒执行一次。 它的退出代码将记录在所有监视它的VRRP实例中。 请注意,只有至少一个VRRP实例对其进行监视时,才会执行该脚本。
默认权重等于0,这意味着在脚本连续<fall>失败后,监视脚本的任何VRRP实例都将转换为故障状态。 此后,<rise>连续成功将导致VRRP实例退出故障状态,除非它们由于要跟踪的其他脚本或接口也处于故障状态。
正权重表示<rise>成功会将<weight>添加到监视它的所有VRRP实例的优先级。
相反,在<fall>失败的情况下,将从初始优先级中减去负权重。
vrrp脚本的语法为:
# 添加要定期执行的脚本。 它的退出代码将记录在所有正在监视它的VRRP实例和同步组中。
vrrp_script <SCRIPT_NAME> {
# 要执行的脚本的路径
script <STRING>|<QUOTED-STRING>
# 脚本调用之间的秒数,(默认值:1秒)
interval <INTEGER>
# 脚本被认为失败后的秒数
timeout <INTEGER>
# 通过此权重调整优先级,(默认值:0)有关反转的说明,请参见track_script。
# “权重0反向”将在脚本启动时导致vrrp实例关闭,反之亦然。
weight <INTEGER:-253..253> [reverse]
# OK过渡所需的成功次数
rise <INTEGER>
# KO过渡所需的成功次数
fall <INTEGER>
# 用户/组名称来运行脚本。组默认为用户组
user USERNAME [GROUPNAME]
# 假设脚本最初处于失败状态
init_fail
}
VRRP同步组
VRRP同步组是VRRP协议的扩展。 主要目标是定义一包VRRP实例以使其同步在一起,以便一个实例的转换将反映给其他组成员。
此外,还具有用于精细状态转换捕获的增强的通知功能。
您还可以定义多个跟踪策略,以便根据第三方事件(例如界面,脚本,文件,BFD)强制进行状态转换。
重要提示:为了使SYNC组可靠运行,至关重要的是,组中的所有实例均为MASTER或全部为BACKUP或FAULT。 在机器A上有一半实例的优先级较高的情况在机器B上有一半实例的优先级较高的情况将导致连续的重选。 因此,对实例进行分组时,针对成员VRRP实例配置的任何跟踪脚本/文件都将其跟踪权重自动设置为零,以避免跨实例的优先级不一致。
vrrp_sync_group的语法为:
vrrp_sync_group <STRING> {
group {
# vrrp_instance的名称(请参见下文)VRRP_Instance字符串集
<STRING>
<STRING>
...
}
# 同步组跟踪界面,脚本,文件和bfd将更新作为同步组成员的所有VRRP实例的状态/优先级。
#'weight 0 reverse'将导致当接口打开时vrrp实例关闭,反之亦然。
track_interface {
eth0
eth1
eth2 weight <-253..253> [reverse]
...
}
# 将跟踪脚本添加到同步组(<SCRIPT_NAME>是vrrp_script条目的名称),如果其中任何一个未加权,则将其变为FAULT状态。
# 反转会导致优先级调整的方向反转。
track_script {
<SCRIPT_NAME>
<SCRIPT_NAME> weight <-253..253> [reverse|no_reverse]
}
# 我们监视其状态的文件将值添加到有效优先级。
# <STRING>是track_file的名称
# 权重默认为track_file中配置的重量
track_file {
<STRING>
<STRING> weight <-254..254> [reverse|noreverse]
...
}
# 要监控的过程,权重被添加到有效优先级。
# <STRING>是vrrp_track_process的名称
# 权重默认为vrrp_track_process中配置的权重。
# 有关权重的说明,请参见vrrp_instance track_process。
track_process {
<STRING>
<STRING> weight <-254..254> [reverse|noreverse]
...
}
# 我们监视的BFD实例,将值添加到有效优先级。
# <STRING>是BFD实例的名称
track_bfd {
<STRING>
<STRING>
<STRING> weight <INTEGER: -253..253> [reverse|noreverse]
...
}
# 通知脚本和警报是可选的
#
# 在过渡上运行的脚本的文件名可以不加引号(如果只是文件名)或带引号(如果它具有参数)用户名和组名指定运行脚本的用户和组。 如果指定了username,则该组默认为该用户的组。
# 如果未指定用户名,则默认为全局script_user和script_group
# 到主过渡
notify_master /path/to_master.sh [username [groupname]]
# 到备份过渡
notify_backup /path/to_backup.sh [username [groupname]]
# 故障过渡
notify_fault "/path/fault.sh VG_1" [username [groupname]]
# 停止vrrp时执行
notify_stop <STRING>|<QUOTED-STRING> [username [groupname]]
# notify_deleted导致在重新加载过程中删除vrrp实例后,将DELETED发送给通知而不是默认FAULT。 如果指定了脚本,则也将执行该脚本。
notify_deleted [<STRING>|<QUOTED-STRING> [username [groupname]]]
# 用于任何状态转换.
# “ notify”脚本在notify_ *脚本之后被称为,并在Keepalived提供的配置参数之后与另外4个参数一起执行:
# $(n-3) = "GROUP"|"INSTANCE"
# $(n-2) = 组或实例的名称
# $(n-1) = 目标过渡状态(停止仅适用于实例)
# ("MASTER"|"BACKUP"|"FAULT"|"STOP"|"DELETED")
# $(n) = 优先值
# $(n-3)和$(n-1)总是以大写形式发送,并且可能发送的字符串与上面列出的字符串相同(“ GROUP” /“ INSTANCE”,“ MASTER” /“ BACKUP” /“ FAULT” /“ STOP” /“ DELETED”)(注意:STOP和DELETED仅适用于实例)
notify <STRING>|<QUOTED-STRING> [username [groupname]]
# notify fifo输出与“ notify”脚本的最后4个参数相同,除了实例的状态为“ MASTER_RX_LOWER_PRI”而不是状态外,还包括“ MASTER_PRIORITY”和“ BACKUP_PRIORITY”(如果更改了优先级并配置了notify_priority_changes) 。
# 如果主服务器需要设置某些外部状态,例如使用Amazon AWS时设置辅助IP地址,则使用MASTER_RX_LOWER_PRI; 如果由于通信中断而另一个keepalived已转换为主服务器,则优先级较低的实例将接管辅助IP地址,并且适当的主服务器需要能够还原该IP地址。
# 发送FIFO通知vrrp优先级更改
notify_priority_changes <BOOL>
# 使用以上global_defs中的地址在状态转换期间发送电子邮件通知(默认为no,除非设置了全局smtp_alert / smtp_alert_vrrp)
smtp_alert <BOOL>
# 已淘汰。 在vrrp_sync_groups上使用track_interface,track_script和track_file代替。
global_tracking
#允许同步组使用不同的权重。
# 这可能行不通,但是如果在同一同步组中的不同vrrp实例之间使用了不同的权重,则可以替代global_tracking。
sync_group_tracking_weight
}
VRRP免费ARP和未经请求的邻居通告延迟组
指定在发送免费ARP和未经请求的邻居通告之间的延迟设置。 这用于上游交换机无法处理ARP / NA泛洪时。
当限制适用于单个物理接口时,请使用接口。
当一组接口链接到同一台交换机并且限制适用于整个交换机时,请使用接口。
注意:每个块只能使用一个或多个接口。
如果设置了全局vrrp_garp_interval和/或vrrp_gna_interval,则garp_group中未指定的任何接口都将继承全局设置。
garp_group的语法为:
garp_group {
# 设置免费ARP之间的间隔(以秒为单位,分辨率为微秒)
garp_interval <DECIMAL>
#设置不请自来的NA之间的默认间隔(以秒为单位,分辨率为微秒)
gna_interval <DECIMAL>
# 间隔适用的物理接口
interface <STRING>
# 延迟汇总的接口列表。
interfaces {
<STRING>
<STRING>
...
}
}
VRRP实例
VRRP实例是VRRP协议**功能。 它定义和配置要在特定接口上运行的VRRP行为。 每个VRRP实例都与一个uniq接口相关。
vrrp_instance的语法为:
vrrp_instance <STRING> {
# 初始状态,MASTER | BACKUP一旦其他计算机出现,将进行选举,并且优先级最高的计算机将成为MASTER。
# 因此,这里的条目并不重要。
state MASTER
# 内部网络接口,受vrrp约束。
# 注意:如果使用单播,则只要单播地址不是IPv6链路本地地址,就可以忽略该接口(例如,使用非对称路由时,这是必需的)。
# 如果省略了接口,则所有VIP和eVIP都应指定要在其上配置的接口,否则它们将被添加到默认接口。
interface eth0
# 使用VRRP虚拟MAC。
# 注意:如果设置了sysctl net.ipv4.conf.all.rp_filter,并且此vrrp_instance是IPv4实例,则使用此选项将导致各个接口和all.rp_filter都更新为当前设置中的较大者, default.rp_filter,并将all.rp_filter设置为0。
# 终止时将恢复原始设置。
use_vmac [<VMAC_INTERFACE>]
# 从基本接口而非VMAC接口发送/接收VRRP消息
vmac_xmit_base
# 使用IPVLAN接口。 keepalived将在指定接口的顶部创建一个模式L2 ipvlan接口。
# 对于IPv4实例,需要IP地址,对于IPv6,该地址是可选的,在这种情况下,将使用链接本地地址。
# 模式标志默认为桥接。 注意:模式标记对于同一基础接口上的所有ipvlan必须相同。
# 如果保持连接崩溃并重新启动,则配置接口名称会更安全,在这种情况下,它可以更可靠地找到以前创建的接口。
use_ipvlan [<INTERFACE_NAME>] [IP_ADDRESS] [bridge|private|vepa]
# force instance to use IPv6 (this option is deprecated since
# the virtual ip addresses determine whether IPv4 or IPv6 is used).
native_ipv6
# Ignore VRRP interface faults (default unset)
dont_track_primary
# 可选,也要监视这些。
# 如果其中任何一个在未加权时下降,则进入FAULT状态。
# 如果在track_interface中指定了权重,而不是在发生故障的情况下将vrrp实例设置为FAULT状态,则当接口处于启动状态时(对于正权重),其优先级将按权重增加,而当接口处于正常状态时,其优先级将按权重的绝对值降低 除非指定了反向,否则该接口为向下(用于负权重),在这种情况下,优先级的调整方向为反向。
# 权重必须介于-253和+253之间(含-253)。
# 0为默认行为,表示故障表示故障状态。 通常的做法是使用正权重来计算有限数量的良好服务,以使计数最高的服务器成为主服务器。 负权重更好地用于统计大量接口之间的意外故障,因为即使有大量接口,它也不会饱和。 如果接口关闭,请使用反向增加优先级
track_interface {
eth0
eth1
eth2 weight <-253..253> [reverse]
...
}
# 将跟踪脚本添加到接口(<SCRIPT_NAME>是vrrp_track_script条目的名称)可以将与track_interface相同的原理应用于track_script条目,不同之处在于未指定权重意味着将使用脚本中声明的默认权重( 本身默认为0)。
#反转会使优先级调整的方向反转。
track_script {
<SCRIPT_NAME>
<SCRIPT_NAME> weight <-253..253> [reverse|no_reverse]
}
# 我们监视其状态的文件将值添加到有效优先级。
# <STRING>是track_file的名称
track_file {
<STRING>
<STRING>
<STRING> weight <-254..254> [reverse|noreverse]
...
}
# 当进程正在运行时,将添加/减去正数;当未运行时,将添加/减去负数。
# 如果指定了反向,则加/减被反向。
# <STRING>是vrrp_track_process的名称权重默认为vrrp_track_process中配置的权重
track_process {
<STRING>
<STRING> weight <-254..254> [reverse|noreverse]
...
}
# 我们监控的BFD实例会在减去值时将值添加到有效优先级,除非指定了反向。
# 当bfd实例启动时,正权重被加/减;当bfd实例关闭时,负权重被减/加。
# <STRING>是BFD实例的名称
track_bfd {
<STRING>
<STRING>
<STRING> weight <INTEGER: -253..253> [reverse|noreverse]
...
}
# 绑定vrrpd的默认IP是接口上的主要IP。 如果要隐藏vrrpd的位置,请将此IP用作多播或单播vrrp数据包的src_addr。 (由于它是多播的,因此无论使用什么src_addr,vrrpd都将获得回复数据包)。
# 可选的
mcast_src_ip <IPADDR>
unicast_src_ip <IPADDR>
# 如果配置的src_ip不存在或被删除,则将实例置于故障状态
track_src_ip
# 在接口默认上运行的VRRP版本是全局参数vrrp_version,但是IPv6实例将始终使用版本3。
version <2 or 3>
# 以下内容可以检查在单播模式下,VRRP数据包的源地址是我们的单播对等方之一。
check_unicast_src
# 不要通过VRRP组播组发送VRRP广告。
# 相反,它使用单播将广告发送到以下IP地址列表。 在不支持多播的网络环境中使用VRRP FSM和功能可能会很酷!
# 指定的IP地址可以是IPv4以及IPv6。
# 如果指定了min_ttl和/或max_ttl,则会根据指定的TTL范围检查任何接收到的数据包的TTL /跳数限制,如果超出该范围,则将其丢弃。
# 指定min_ttl或max_ttl会启用check_unicast_src。
unicast_peer {
<IPADDR> [min_ttl {0..255}] [max_ttl {0..255}]
...
}
# 指定用于发送单播广告的单播TTL / HLIM
unicast_ttl {0..255}
# The checksum calculation when using VRRPv3 changed after v1.3.6.
# Setting this flag forces the old checksum algorithm to be used
# to maintain backward compatibility, although keepalived will
# attempt to maintain compatibility anyway if it sees an old
# version checksum. Specifying never will turn off auto detection
# of old checksums. [This option may not be enabled - check output
# of `keepalived -v` for OLD_CHKSUM_COMPAT.]
old_unicast_checksum [never]
# 接口特定设置,与全局参数相同。
# 默认为全局参数
garp_master_delay 10
garp_master_repeat 1
garp_lower_prio_delay 10
garp_lower_prio_repeat 1
garp_master_refresh 60
garp_master_refresh_repeat 2
garp_interval 100
gna_interval 100
# 如果收到优先级较低的广告,请不要发送其他广告。
# 这将导致遵守RFC(默认为全局vrrp_lower_priority_dont_send_advert)。
lower_prio_no_advert [<BOOL>]
# 如果我们是主广告并收到较高优先级的广告,请先发送广告(其优先级将低于其他主广告),然后再过渡到备用广告。 这意味着,如果另一个主服务器设置了garp_lower_prio_repeat,它将重新发送garp消息。 这是为了解决他们同时担任两个主服务器的问题,最后看到的GARP消息来自我们。
higher_prio_send_advert [<BOOL>]
# 从1到255的任意唯一数字,用于区分在同一NIC(因此在同一套接字)上运行的vrrpd的多个实例。
virtual_router_id 51
# 选择MASTER时,将获得最高优先级的是MASTER,这比其他机器要多50。
priority 100
# VRRP广告间隔(以秒为单位)(例如0.92)(使用默认值)
advert_int 1
# 注意:2004年,RFC3768从VRRPv2规范中删除了身份验证。
# 使用此选项不合规,可能会导致问题。 尽可能避免使用,除非使用单播时会有所帮助。
authentication {
# PASS | AH PASS-简单密码(建议)AH-IPSEC(不推荐)
auth_type PASS
# 访问vrrpd的密码。
# 在所有机器上都应该相同。
# 仅使用前八(8)个字符。
auth_pass 1234
}
# 地址在更改为MASTER或BACKUP后添加。
# 在其他计算机上具有相同条目的情况下,将发生相反的转换。
# 对于virtual_ipaddress,virtual_ipaddress_excluded,virtual_routes和virtual_rules,大多数选项与命令ip address / route / rule add的选项匹配。
# track_group选项仅适用于静态地址/路由/规则。
# no_track是特定于keepalived的,它表示如果删除了地址/路由/规则,则vrrp_instance不会跳出主控状态,并且直到vrrp实例下一次转换为master时,才可以恢复地址/路由/规则。
# <LABEL>:是可选的,并为别名创建一个名称。
为了与“ ifconfig”兼容,它的格式应为<realdev>:<anytext>,例如eth0:1作为eth0的别名。
# <SCOPE>: ("site"|"link"|"host"|"nowhere"|"global")
# preferred_lft设置为0以弃用IPv6地址(如果地址掩码为/ 128,则为默认值)。 使用“永远永久的preferred_lft”来指定不应弃用/ 128地址。
virtual_ipaddress {
<IPADDR>[/<MASK>] [brd <IPADDR>] [dev <STRING>] [scope <SCOPE>]
[label <LABEL>] [peer <IPADDR>] [home]
[-nodad] [mngtmpaddr] [noprefixroute]
[autojoin] [no_track] [preferred_lft nn|forever]
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
# VRRP IP不包括在VRRP可选中。
# 对于同一接口上有大量IP(例如200个)的IP。 为了减少广告中发送的地址数量,您可以从广告中排除大多数IP。
# IP地址与virtual_ipaddress相同。
# 如果您希望能够添加IPv4和IPv6地址的混合,也可以使用它,因为virtual_ipaddress中的所有地址都必须属于同一家族。
virtual_ipaddress_excluded {
<IPADDR>[/<MASK>] [brd <IPADDR>] [dev <STRING>] [scope <SCOPE>]
[label <LABEL>] [peer <IPADDR>] [home]
[-nodad] [mngtmpaddr] [noprefixroute]
[autojoin] [no_track]
<IPADDR>[/<MASK>] ...
...
}
# 在接口上设置promote_secondaries标志,以在删除其中一个的CIDR中的其他地址时,停止其他地址的删除。例如,如果在接口上同时配置了10.1.1.2/24和10.1.1.3/24,并且一个地址被删除,除非 在接口上设置了promoting_secondaries,其他地址也将被删除。
promote_secondaries
# 更改为MASTER时将add | del路由到BACKUP。
# 有关更多详细信息,请参见static_routes
virtual_routes {
# src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR>
# [or <IPADDR>] dev <STRING> scope <SCOPE> table <TABLE>
src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
192.168.110.0/24 via 192.168.200.254 dev eth1
192.168.111.0/24 dev eth2 no_track
192.168.112.0/24 via 192.168.100.254
192.168.113.0/24 via 192.168.200.254 or 192.168.100.254 dev eth1
blackhole 192.168.114.0/24
0.0.0.0/0 gw 192.168.0.1 table 100 # To set a default gateway into table 100.
}
# 规则更改为MASTER时添加到BACKUP
# 有关更多详细信息,请参见static_rules
virtual_rules {
from 192.168.2.0/24 table 1
to 192.168.2.0/24 table 1 no_track
}
# VRRPv3具有接受模式,以允许虚拟路由器在地址所有者不在时接收接收到VIP的数据包。 除非设置了严格模式,否则这是默认设置。 作为扩展,它也适用于VRRPv2(RFC 3768未定义接受模式)。
# --
# 接受非地址所有者的数据包
accept
# 将数据包丢弃给非地址所有者。
no_accept
# 优先级较高的VRRP实例上线后通常会抢占优先级较低的实例。 “ nopreempt”停止较高优先级的计算机接管主机角色,并允许较低优先级的计算机保留为主服务器。
# 注意:为此,初始状态不能为MASTER。
# --
nopreempt
# 向后兼容
preempt
# 启动后的秒数,或者看到较低优先级的主机直到被抢占(如果未被“ nopreempt”禁用)。
# 范围:0(默认)到1000(例如4.12)注意:为了使此功能起作用,初始状态不得为MASTER。
preempt_delay 300 # 等待5分钟
# 请参阅全局vrrp_skip_check_adv_addr的说明,该说明设置默认值。 默认为vrrp_skip_check_adv_addr
skip_check_adv_addr [on|off|true|false|yes|no]
# 请参见全局vrrp_strict的描述。如果未指定vrrp_strict,则采用vrrp_strict的值。如果指定了没有参数的strict_mode,则默认为on。
strict_mode [on|off|true|false|yes|no]
# 调试级别,尚未实现。
# LEVEL是介于0到4之间的数字
debug <LEVEL>
# 通知脚本,如上所述警告
notify_master <STRING>|<QUOTED-STRING> [username [groupname]]
notify_backup <STRING>|<QUOTED-STRING> [username [groupname]]
notify_fault <STRING>|<QUOTED-STRING> [username [groupname]]
# 停止vrrp时执行
notify_stop <STRING>|<QUOTED-STRING> [username [groupname]]
notify <STRING>|<QUOTED-STRING> [username [groupname]]
# 如果主服务器收到的广告优先级低于主服务器的优先级,则执行notify_master_rx_lower_pri脚本。
notify_master_rx_lower_pri <STRING>|<QUOTED-STRING> [username [groupname]]
# 在通知FIFO上发送vrrp实例优先级通知。
notify_priority_changes <BOOL>
# 发送SMTP警报
smtp_alert <BOOL>
# 设置套接字接收缓冲区的大小(有关说明,请参见global_defs vrrp_rx_bufs_policy)
kernel_rx_buf_size
# 设置对此VRRP实例的接口使用linkbeat。 不建议使用此选项-请改用linkbeat_interfaces块。
linkbeat_use_polling
}
LVS配置
包含虚拟服务器组和虚拟服务器的子块
子块包含用于配置Linux IPVS(LVS)功能的参数。 ipvsadm(8)的知识将对您有所帮助。 通过定义虚拟服务器组,虚拟服务器和可选的SSL配置来实现对LVS的配置。 每个虚拟服务器定义了一组真实服务器,您可以将运行状况检查程序附加到每个真实服务器。 然后,Keepalived将通过动态维护拓扑来领导LVS操作。
有关有效的配置组合的详细信息,请参见ipvsadm(8)手册页。
注意:在可以为虚拟服务器,真实服务器以及可能的检查程序配置选项的情况下,虚拟服务器设置是真实服务器的默认设置,而真实服务器设置是检查程序的默认设置。
注意:隧穿的真实/抱歉服务器可能与虚拟服务器和非隧穿的真实/抱歉服务器的地址族不同,它们都必须相同。 如果虚拟服务器使用fwmark,并且所有真实/抱歉服务器均已建立隧道,则虚拟服务器的地址家族将与真实/抱歉服务器的地址家族相同(如果相同),否则它将 默认为IPv4(使用ip_family inet6覆盖此设置)。
注意:仅当虚拟服务具有持久性时,才可以省略虚拟服务器的端口。
虚拟服务器组
此功能提供了一种通过分解虚拟服务器定义来简化配置的方法。 如果您需要定义一堆具有完全相同的真实服务器拓扑的虚拟服务器,那么此功能将使您的配置更具可读性,并且仅通过生成一个运行状况检查来优化运行状况检查任务,其中多个虚拟服务器声明将为每个真实运行状况生成专用的运行状况检查器 服务器将浪费系统资源。
只要虚拟服务器组的IP地址族与使用该虚拟服务器组的任何虚拟服务器的所有真实服务器的IP地址族相匹配,就可以使用IP地址,IP地址范围和防火墙标记的任意组合。 一个例外是,只要使用该虚拟服务器组的所有虚拟服务器的所有真实服务器(以及对等服务器)都使用隧道转发,就可以为虚拟服务器组配置IPv4和IPv6地址以及fwmark。 如果在这种情况下指定了fwmark,则必须指定地址族。 该选项适用于非常大的LVS。
virtual_server_group的语法为:
virtual_server_group <STRING> {
# 虚拟IP地址和端口
<IPADDR> [<PORT>]
<IPADDR> [<PORT>]
...
# <IPADDR RANGE>的格式为XXX.YYY.ZZZ.WWW-VVV,例如192.168.200.1-10范围包括.1和.10地址
<IPADDR RANGE> [<PORT>] # VIP范围[VPORT]
<IPADDR RANGE> [<PORT>]
...
# 仅应为通过虚拟服务器的所有真实服务器建立隧道的虚拟服务器组指定防火墙标记(fwmark)inet / inet6。
fwmark <INTEGER>
fwmark <INTEGER> [inet|inet6]
...
}
虚拟服务器
virtual_server可以是<IPADDR> [<PORT>],fwmark <INTEGER>或组<STRING>之一的声明。
virtual_server的语法为:
virtual_server <IPADDR> [<PORT>] |
virtual_server fwmark <INTEGER> |
virtual_server group <STRING> {
# LVS调度程序
lvs_sched rr|wrr|lc|wlc|lblc|sh|mh|dh|fo|ovf|lblcr|sed|nq
# 启用哈希条目
hashed
# 为调度程序启用标志1(ipvsadm中的-b标志1)
flag-1
# 启用调度程序的标志2(ipvsadm中的-b标志2)
flag-2
# 为调度程序启用标志3(ipvsadm中的-b标志3)
flag-3
# 为sh调度程序启用sh-port(ipvsadm中的-b sh-port)
sh-port
# 为sh调度程序启用sh-fallback(ipvsadm中的-b sh-fallback)
sh-fallback
# 为mh调度程序启用mh-port(ipvsadm中的-b mh-port)
mh-port
# 为mh调度程序启用mh-fallback(ipvsadm中的-b mh-fallback)
mh-fallback
# 为UDP启用单数据包调度(ipvsadm中为-O)
ops
# 覆盖默认的LVS转发方法(默认为NAT)。
# 默认隧道类型为ipip。 从Linux 5.2开始,可以指定GUE隧道类型。 如果使用GUE,则需要端口号。 从Linux 5.3开始,如果隧道类型为GUE,则还可以指定checksum选项。
# 从Linux 5.3开始,还支持GRE隧道类型,但没有remcsum选项。
lvs_method NAT|DR
or
lvs_method TUN [type {ipip|gue port NUM|gre} [nocsum|csum|remcsum]]
# LVS持久性引擎名称(当前仅支持sip)
persistence_engine <STRING>
# LVS持久性超时(以秒为单位),默认为6分钟
persistence_timeout [<INTEGER>]
# LVS粒度掩码(ipvsadm中为-M)
persistence_granularity <NETMASK>
# L4协议
protocol TCP|UDP|SCTP
# 如果未设置VS IP地址,请暂停运行状况检查器的活动
ha_suspend
# 使用上面的global_defs中的地址在定额上/下转换期间发送电子邮件通知(默认为否,除非设置了全局smtp_alert / smtp_alert_checker)
smtp_alert <BOOL>
# HTTP_GET或SSL_GET的默认VirtualHost字符串,例如virtualhost www.firewall.loc由真实服务器或检查器的virtualhost配置覆盖
virtualhost <STRING>
# 在守护程序启动时,假定所有RS都已关闭并且运行状况检查失败。 这有助于防止启动时出现误报。 默认情况下禁用Alpha模式。
alpha
#在守护程序关闭时,请在适当的情况下考虑执行仲裁和RS关闭通知程序。
# 默认情况下,Omega模式是禁用的。
omega
# 池中运行VS所需的所有活动服务器的最小总权重,且无质量下降。 默认为1。
quorum <INTEGER>
# 在考虑法定盈余或亏损时,与名义法定人数相比,可以承受这么多的重量单位。 挡板风门。 预设为0。
hysteresis <INTEGER>
# 获得法定人数时执行的脚本。
quorum_up <STRING>|<QUOTED-STRING> [username [groupname]]
# 仲裁丢失时执行的脚本。
quorum_down <STRING>|<QUOTED-STRING> [username [groupname]]
# fwmark服务的IP系列(仅在所有真实服务器都已建立隧道并且未指定persistence_granularity时才需要)。 如果未指定,则默认为inet。
ip_family inet|inet6
# 设置realserver
# 未达到法定人数时,RS添加到LVS拓扑。
# 如果配置了对不起服务器,则在未达到定额时将关闭所有真实服务器,并用对不起服务器代替。
sorry_server <IPADDR> [<PORT>]
# 对禁止服务器应用hibit_on_failure行为
sorry_server_inhibit
# 抱歉,服务器LVS转发方法。 默认值是虚拟服务器的默认值。
# 有关隧道类型的详细信息,请参见virtual_server详细信息。
sorry_server_lvs_method NAT|DR
or
sorry_server_lvs_method TUN [type {ipip|gue port NUM|gre} [nocsum|csum|remcsum]]
# 可选的连接超时(以秒为单位)。
# 默认值为5秒
connect_timeout <TIMER>
# 如果检查活动服务器失败,请重试计数以进行其他检查。 默认值:1,除非在下面指定
retry <INTEGER>
# 失败后重试前延迟
delay_before_retry <TIMER>
# 可选的随机延迟,以开始最大N秒的初始检查。
# 有助于将多个同时检查分散到同一RS。 默认情况下启用,最大值为delay_loop。 指定0禁用
warmup <TIMER>
# 检查器轮询的延迟计时器
delay_loop <TIMER>
# Healthchecker检测到故障时将权重设置为0
inhibit_on_failure
# 每个realserver一个条目
real_server <IPADDR> [<PORT>] {
# 使用的相对重量,默认值:1
weight <INTEGER>
# LVS转发方法有关隧道类型的详细信息,请参见virtual_server详细信息。 默认设置来自virtual_server的设置。
lvs_method NAT|DR
or
lvs_method TUN [type {ipip|gue port NUM|gre} [nocsum|csum|remcsum]]
# 当healthchecker将服务视为启动时执行的脚本。
notify_up <STRING>|<QUOTED-STRING> [username [groupname]]
# 当healthchecker认为服务中断时执行的脚本。
notify_down <STRING>|<QUOTED-STRING> [username [groupname]]
#与服务器的最大连接数
uthreshold <INTEGER>
# 与服务器的最小连接数
lthreshold <INTEGER>
# 使用上面的global_defs中的地址在状态转换期间发送电子邮件通知(默认为是,除非设置了全局smtp_alert / smtp_alert_checker)
smtp_alert <BOOL>
# HTTP_GET或SSL_GET的默认VirtualHost字符串,例如virtualhost www.firewall.loc由检查器的virtualhost配置覆盖
virtualhost <STRING>
alpha <BOOL> # 看上面
connect_timeout <TIMER> # see above
retry <INTEGER> # see above
delay_before_retry <TIMER> # see above
warmup <TIMER> # see above
delay_loop <TIMER> # see above
inhibit_on_failure <BOOL> # see above
log_all_failures <BOOL> # 检查时记录所有失败
# 健康检查员。 可以是每种类型的多个HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | DNS_CHECK | MISC_CHECK | BFD_CHECK | UDP_CHECK | PING_CHECK | FILE_CHECK
# 除了MISC_CHECK(仅具有alpha以后的选项)以及BFD_CHECK和FILE_CHECK(均不具有标准选项)之外,所有检查器均具有以下选项:
CHECKER_TYPE {
# ======== 通用连接选项要连接的可选IP地址。
# 默认为realserver IP
connect_ip <IPADDR>
# 连接到的可选端口默认为realserver端口
connect_port <PORT>
# 用于发起连接的可选地址
bindto <IPADDR>
# 使用的可选接口; 如果绑定地址是本地IPv6链接,则需要
bind_if <IFNAME>
# 从中发起连接的可选源端口
bind_port <PORT>
# 可选的fwmark以标记所有传出的检查程序包
fwmark <INTEGER>
alpha <BOOL> # see above
connect_timeout <TIMER> # see above
retry <INTEGER> # see above
delay_before_retry <TIMER> # see above
warmup <TIMER> # see above
delay_loop <TIMER> # see above
}
# 以下选项是特定于其他检查器的
# HTTP和SSL健康检查器
HTTP_GET|SSL_GET {
#HTTP协议版本(1.0、1.0C,1.1中的一种)协议版本1.0C表示版本1.0,并添加了“连接:关闭”行,默认情况下该行包含在版本1.1中。
http_protocol <PROTOCOL>
# 设置Alpha模式或从故障中恢复时,将检查每个URL,每次检查之间的延迟为<delay_loop>。 如果有20个URL,并且<delay_loop>为3秒,则在启动或从故障中恢复后,RS将需要1分钟才能出现。 设置fast_recovery可以消除启动时以及从故障中恢复后的延迟,这意味着一旦检查完所有URL,RS就会启动,并且在检查每个URL之间没有延迟。
fast_recovery [<BOOL>]
# 要测试的网址此处可以有多个条目
url {
#例如path /或path / mrtg2 /
path <STRING>
# 运行状况检查需要摘要或status_code并摘要使用genhash计算的摘要,例如摘要9b3a0c85a887a256d6939da88aabd8cd
digest <STRING>
# HTTP标头中返回的状态代码,例如status_code 200或status_code 200-299 400-499 503505默认为200-299
status_code <INTEGER|RANGE> [<INTEGER|RANGE>] ...
# VirtualHost字符串。 例如virtualhost www.firewall.loc如果未设置,则使用来自真实或虚拟服务器的virtualhost
virtualhost <STRING>
# 用于搜索返回数据的正则表达式。
# 匹配失败会导致检查失败。
regex <STRING>
# 反转匹配的含义,因此返回的文本的匹配会导致检查失败。
regex_no_match
# 正则表达式选项的空格分隔列表。
# 有关选项的描述,请参见man pcre2api。
# 支持以下选项:
# allow_empty_class alt_bsux auto_callout caseless
# dollar_endonly dotall dupnames extended firstline
# match_unset_backref multiline never_ucp never_utf
# no_auto_capture no_auto_possess no_dotstar_anchor
# no_start_optimize ucp ungreedy utf never_backslash_c
# alt_circumflex alt_verbnames use_offset_limit
regex_options <OPTIONS>
# 对于复杂的正则表达式,可能需要更大的堆栈,这允许指定字节的开始和最大大小。 有关更多详细信息,请参见pcre2_jit_stack_create()的文档。
regex_stack <START> <MAX>
# 返回数据中的最小偏移量,以开始检查正则表达式模式匹配。 如果返回的数据较大,则可以节省处理时间。
regex_min_offset <OFFSET>
# 主题匹配开始时返回数据的最大偏移量。
regex_max_offset <OFFSET>
}
}
SSL_GET {
# 如果提供,则在SSL握手期间发送服务器名称指示
enable_sni
}
# TCP运行状况检查器
TCP_CHECK {
# 没有其他选择
}
# SMTP运行状况检查器
SMTP_CHECK {
# 用于SMTP HELO请求的可选字符串
helo_name <STRING>|<QUOTED-STRING>
}
# DNS运行状况检查器
DNS_CHECK {
# 重试默认值为3。
# DNS查询类型A | NS | CNAME | SOA | MX | TXT | AAAA默认为SOA
type <STRING>
# 用于DNS查询的域名默认值为。 (点)
name <STRING>
}
# MISC运行状况检查器,运行程序
MISC_CHECK {
# 重试默认值为0。
# 外部脚本或程序
misc_path <STRING>|<QUOTED-STRING>
# 脚本执行超时
misc_timeout <INTEGER>
# 如果设置,则运行状况检查器的退出代码用于动态调整权重,如下所示:
# 退出状态0:svc检查成功,重量不变。
# 退出状态1:svc检查失败。
# 退出状态2-255:svc检查成功,权重更改为小于退出状态2。
# (例如:退出状态为255会将权重设置为253)
# 注意:每个real_server最多只能有一个动态MISC_CHECK。
misc_dynamic
# 指定运行脚本的用户名/组名。
# 如果未指定GROUPNAME,则使用用户组
user USERNAME [GROUPNAME]
}
# 检查BFD实例名称
BFD_CHECK {
name <STRING>
}
# PING健康检查器
# 注意:使用此检查器可能会导致/ proc / sys / net / ipv4 / ping_group_range更新,以允许root用户使用IPPROTO_ICMP套接字。
PING_CHECK {
# 没有其他选择
}
# UDP健康检查器
# 注意:为了使此检查器正常工作,它依赖于ICMP错误消息,例如HOST_UNREACH,NET_UNREACH,PORT_UNREACH。 HOST_UNREACH依靠ARP请求超时,因此connect_timeout应该足够长以允许此操作(例如 至少4秒钟)。
# 您可能还希望对同一服务器使用PING_CHECK。
UDP_CHECK {
require_reply # 需要答复包才能成功检查
}
# 文件检查器
# 这将读取并监视文件的内容,其中STRING是track_file配置块中指定的名称(请参见上文)。
# 注意:实际服务器的track_file的权重尚未完全实现。 特别是允许权重为0,处理负的计算值并重新加载。
FILE_CHECK {
track_file <STRING>
# 如果设置了dynamic,则通过将权重添加到定额和LVS权重中,使用文件中的值来动态调整权重
dynamic
# 权重乘数应用于从文件中读取的值
weight <-2147483647..2147483647> [reverse]
}
}
}
# 用于SSL_GET检查的参数。
# 如果未指定任何参数,则将自动生成SSL上下文。
SSL {
# 密码
password <STRING>
# CA file
ca <STRING>
# Certificate file
certificate <STRING>
# Key file
key <STRING>
}
进阶配置
配置解析器已扩展为支持高级功能,例如条件配置和参数替换。 这些功能对于生成配置模板(数据中心)的任何脚本化环境都非常有用。
条件配置和配置标识
config-id默认为uname返回的节点名称的第一部分,并且可以使用-i或--config-id命令行选项覆盖。
任何以“ @”开头的配置行都是条件配置行。 将@字符后紧跟的单词(即没有空格)与config-id进行比较,如果不匹配,则会忽略配置行。
另外,“ @ ^”是一个否定比较,因此,如果紧随其后的单词与config-id不匹配,则包含配置行。
这样做的目的是允许将单个配置文件用于多个系统,其中唯一的区别可能是router_id,vrrp实例优先级以及可能的接口名称和单播地址。
例如:
global_defs {
@main router_id main_router
@backup router_id backup_router
}
...
vrrp_instance VRRP {
...
@main unicast_src_ip 1.2.3.4
@backup unicast_src_ip 1.2.3.5
@backup2 unicast_src_ip 1.2.3.6
unicast_peer {
@^main 1.2.3.4
@^backup 1.2.3.5
@^backup2 1.2.3.6
}
...
}
如果使用-i main调用keepalived,则将router_id设置为main_router,如果使用-i backup调用,则将router_id设置为main_router,如果未使用-i或-i其他任何调用,则将使用backup_router,那么将不会设置router_id。 main的单播对等点将是1.2.3.5和1.2.3.6。
参数替换
可以指定可替换的参数。 定义参数的格式为:
$PARAMETER=VALUE
where there must be no space before the '=' and only whitespace may
preceed to '$'. Empty values are allowed.
Parameter names can be made up of any combination of A-Za-z0-9 and _,
but cannot start with a digit. Parameter names starting with an under-
score should be considered reserved names that keepalived will define
for various pre-defined options.
After a parameter is defined, any occurrence of $PARAMETER followed by
whitespace, or any occurrence of ${PARAMETER} (which need not be fol-
lowed by whitespace) will be replaced by VALUE.
Replacement is recursive, so that if a parameter value itself includes
a replaceable parameter, then after the first substitution, the parame-
ter in the value will then be replaced; the substitution is done at
replacement time and not at definition time, so for example:
$ADDRESS_BASE=10.2.${ADDRESS_BASE_SUB}
$ADDRESS_BASE_SUB=0
${ADDRESS_BASE}.100/32
$ADDRESS_BASE_SUB=10
${ADDRESS_BASE}.100/32
will produce:
10.2.0.100/32
10.2.10.100/32
Note in the above examples the use of both ADDRESS_BASE and
ADDRESS_BASE_SUB required braces ({}) since the parameters were not
followed by whitespace (after the first substitution which produced
10.2.${ADDRESS_BASE_SUB}.100/32 the parameter is still not followed by
whitespace).
If a parameter is not defined, it will not be replaced at all, so for
example ${UNDEF_PARAMETER} will remain in the configuration if it is
undefined; this means that existing configuration that contains a '$'
character (for example in a script definition) will not be changed so
long as no new parameter definitions are added to the configuration.
Parameter substitution works in conjunction with conditional configura-
tion. For example:
@main $PRIORITY=240
@backup $PRIORITY=200
...
vrrp_instance VI_0 {
priority $PRIORITY
}
will produce:
...
vrrp_instance VI_0 {
priority 240
}
if the config_id is main.
$IF_MAIN[email protected]
$IF_MAIN priority 240
will produce:
priority 240
if the config_id is main and nothing if the config_id is not main,
although why anyone would want to use this rather than simply the
following is not known (but still possible):
@main priority 240
Multiline definitions are also supported, but when used there must be
nothing on the line after the parameter name. A multiline definition is
specified by ending each line except the last with a '\' character.
Example:
$INSTANCE= \
vrrp_instance VI_${NUM} { \
interface eth0.${NUM} \
use_vmac vrrp${NUM}.1 \
virtual_router_id 1 \
@high priority 130 \
@low priority 120 \
advert_int 1 \
virtual_ipaddress { \
10.0.${NUM}.254/24 \
} \
track_script { \
offset_instance_${NUM} \
} \
}
$NUM=0
$INSTANCE
$NUM=1
$INSTANCE
The use of multiline definitions can be nested.
Example:
$RS= \
real_server 192.168.${VS_NUM}.${RS_NUM} 80 { \
weight 1 \
inhibit_on_failure \
smtp_alert \
MISC_CHECK { \
misc_path "${_PWD}/scripts/vs.sh RS_misc.${INST}.${VS_NUM}.${RS_NUM}.0 10.0.${VS_NUM}.4:80->192.168.${VS_NUM}.${RS_NUM}:80" \
} \
MISC_CHECK { \
misc_path "${_PWD}/scripts/vs.sh RS_misc.${INST}.${VS_NUM}.${RS_NUM}.1 10.0.${VS_NUM}.4:80->192.168.${VS_NUM}.${RS_NUM}:80" \
} \
notify_up "${_PWD}/scripts/notify.sh RS_notify.${INST}.${VS_NUM}.${RS_NUM} UP 10.0.${VS_NUM}.4:80->192.168.${VS_NUM}.${RS_NUM}:80" \
notify_down "${_PWD}/scripts/notify.sh RS_notify.${INST}.${VS_NUM}.${RS_NUM} DOWN 10.0.${VS_NUM}.4:80->192.168.${VS_NUM}.${RS_NUM}:80" \
}
$VS= \
virtual_server 10.0.${VS_NUM}.4 80 { \
quorum 2 \
quorum_up "${_PWD}/scripts/notify.sh VS_notify.${INST} UP 10.0.${VS_NUM}.4:80" \
quorum_down "${_PWD}/scripts/notify.sh VS_notify.${INST} DOWN 10.0.${VS_NUM}.4:80" \
$RS_NUM=1 \
$RS \
$RS_NUM=2 \
$RS \
$RS_NUM=3 \
$RS \
}
$VS_NUM=0
$ALPHA=alpha
$VS
$VS_NUM=1
$ALPHA=
$VS
The above will create 2 virtual servers, each with 3 real servers
预定义的定义
The following pre-defined definitions are defined:
${_PWD} : The directory of the current configuration
file (this can be changed if using the include directive).
${_INSTANCE} : The instance name (as defined by the -i
option, defaults to hostname).
${_RANDOM [MIN [MAX]]} : This is replaced by a random
integer in the range [MIN, MAX], where MIN and MAX are optional non-
negative integers. Defaults are MIN=0 and MAX=32767.
Additional pre-defined definitions will be added as their need is iden-
tified. It will normally be quite straightforward to add additional
pre-defined definitions, so if you need one, or have a good idea for
one, then raise an issue at
https://github.com/acassen/keepalived/issues requesting it.
顺序块
A line starting ~SEQ(var, start, step, end) will cause
the remainder of the line to be processed multiple times, with the
variable $var set initially to start,
and then $var will be incremented by
step repeatedly, terminating when it is greater than
end. step may be omitted, in which
case it defaults to 1 or -1, depending on whether end
is greater or less than start. start
may also be omitted, in which case it defaults to 1 if
end > 0 or -1 if end < 0.
~SEQx(...) is the same as ~SEQ(...), except the variable $var will for
formatted in hexadecimal, which would be useful for IPv6 addresses.
Note: At the moment it is necessary to use different variables for the
~SEQ block from any previously defined variable, including one used as
the variable in a previous ~SEQ block. This may change in the future,
so do not rely on a ~SEQ block variable being defined after the end of
the block.
Examples:
~SEQ(SUBNET, 0, 3) ip_address 10.0.${SUBNET}.1
would produce:
ip_address 10.0.0.1
ip_address 10.0.1.1
ip_address 10.0.2.1
ip_address 10.0.3.1
and
~SEQx(SUBNET, 144, 16, 192) ip_address fe80::20:${SUBNET}:1
or better
~SEQx(SUBNET, 0x90, 0x10, 0xc0) ip_address fe80::20:${SUBNET}:1
would produce:
ip_address fe80::20:90:1
ip_address fe80::20:a0:1
ip_address fe80::20:b0:1
ip_address fe80::20:c0:1
Another example:
virtual_ipaddress {
~SEQx(AD2, 0x90, 0x10, 0xc0) ~SEQx(AD1, 0x12, -1, 0x0c) fe81::10:${AD2}:${AD1}
}
There can be multiple ~SEQ elements on a line, so for example:
$VI4= \
track_file offset_instance_4.${IF}.${NUM}.${ID} { \
file "${_PWD}/679/track_files/4.${IF}.${NUM}.${ID}" \
weight -100 \
} \
vrrp_instance vrrp4.${IF}.${NUM}.${ID} { \
interface bond${IF}.${NUM} \
use_vmac vrrp4.${IF}.${NUM}.${ID} \
virtual_router_id ${ID} \
priority 130 \
virtual_ipaddress { \
10.${IF}.${NUM}.${ID}/24 \
} \
track_file { \
offset_instance_4.${IF}.${NUM}.${ID} \
} \
}
~SEQ(IF,0,7) ~SEQ(NUM,0,31) ~SEQ(ID,1,254) $VI4
will produce 65024 vrrp instances with names from vrrp4.0.0.1 through to
vrrp4.7.31.254.
列出区块
List blocks are similar to sequence blocks, except that the values to
substitute into the variable are listed in the ~LST specification.
A line starting ~LST(var, val1, val2, val3) will cause
the remainder of the line to be processed multiple times, with the
variable $var set initially to val1,
and then val2, and finally val3. Any
number of values can be specified, as long as at least one value is
(although only one value would be pointless).
If it is desired to substitute more than one variable at a time, the
variables and values need to be enclosed in {...} blocks. For example:
~LST({IP, IP1}, {10,1},{20,4},{5,6},{12,8}) 192.168.${IP}.${IP1}
would first set IP=10 and IP1=1, then IP=20 and IP1=4, etc, and pro-
duces:
192.168.10.1
192.168.20.4
192.168.5.6
192.168.12.8
List blocks can be nested, so:
~LST(IP, 1, 2, 3, 4) ~LST(IP1, 5,6,7) 192.169.${IP}.${IP1}
produces:
192.169.1.5
192.169.1.6
192.169.1.7
192.169.2.5
192.169.2.6
192.169.2.7
192.169.3.5
192.169.3.6
192.169.3.7
192.169.4.5
192.169.4.6
192.169.4.7
Finally, list blocks and sequence blocks can be combined, so:
~LST({IP, IP1}, {10,1},{20,4},{5,6},{12,8}) ~SEQ(IP2,168,2,172)
192.${IP2}.${IP}.${IP1}
produces:
192.168.10.1
192.170.10.1
192.172.10.1
192.168.20.4
192.170.20.4
192.172.20.4
192.168.5.6
192.170.5.6
192.172.5.6
192.168.12.8
192.170.12.8
192.172.12.8
内核设置
已经确定,如果在配置了VIP或eVIP的接口上启用了proxy_arp和proxy_arp_pvlan,则由于代理对ARP请求以及保持主机的响应,代理会导致对ARP请求的错误答复。 两者都需要设置为0才能正常运行。
AUTHORS
由约瑟夫·麦克(Joseph Mack)撰写。 Alexandre Cassen和Quentin Armitage进行了大量更新。
SEE ALSO
ipvsadm(8), ip --help.
Keepalived 2020-05-31 keepalived.conf(5)