keepalived02-keepalived的配置文件
1、keepalived配置文件的概述
- keepalived.conf是keepalived的配置文件。
- 关键字被放置在块和子块的层次结构中,每一层由“{”和“}”对分隔。
- 注释符:'#'或'!'。
- include:允许主配置文件加载其他配置文件。
1 2 3 4 5 6 7 8 | #FILENAME可以是一个绝对或相对路径,并且可以包含通配符,以及csh风格的大括号表达式,如 "{foo/{,cat,dog},bar}" ,如果 glob ()支持它们的话。 include FILENAME includer FILENAME #与include_check readable相同 includem FILENAME #与include_check match相同 includew FILENAME #与include_check wildcard_match相同 includeb FILENAME #与include_check brace_match相同 includea FILENAME #所有include_check检查 |
- 参数语法
- <BOOL>为on|off|true|false|yes|no之一
- <TIMER>是一个以秒为单位的时间值,例如2.71828或3;定时器的分辨率为微秒。
- Keepalived配置文件有四个顶级配置块:
- GLOBAL配置
- BFD配置
- VRRPD配置
- LVS配置
- keepalivd配置文件常见的结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #全局配置块 global_defs { ...... } #定义一个虚拟路由器 vrrp_instance <STRING> { authentication { #一个虚拟路由器广播通信时的认证信息 ...... } virtual_ipaddress { #配置vip ...... } } #定义一个ipvs虚拟服务 virtual_server <IPADDR> [<PORT>] | #使用IP+Port定义集群服务 virtual_server fwmark <INTEGER> | #使用防火墙标记定义集群服务 virtual_server group <STRING> { real_server <IPADDR> [<PORT>] { #定义一个后端服务器(RS) HTTP_GET { #HTTP健康检查器 url { ...... } } TCP_CHECK { #TCP健康检查器 ...... } } } |
2、四个顶级配置块
2.1、GLOBAL配置块
- GLOBAL顶级配置块中包含的子块有:Global definitions、Linkbeat interfaces、Interface up/down transition delays、Static track groups、Static addresses、Static routes、Static rules。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | global_defs { #向哪些邮件发送警告 notification_email { admin@example1.com ... } #发送邮件的发件人的地址(default: keepalived@<local host name>) notification_email_from admin@example.com #邮件服务器(default port number: 25) smtp_server 127.0.0.1 [<PORT>] #连接邮件服务器的超时时间(秒) smtp_connect_timeout 30 #标识机器的字符串,不必是主机名。(default: local host name) router_id <STRING> #VRRP通告使用的组播的IPv4地址,默认的VRRP组播地址是224.0.0.18,通常不希望更改。(不同keepalived集群的组播的IP地址尽量不同) vrrp_mcast_group4 224.0.0.18 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 #配置VRRP的默认版本号(default: 2, but IPv6 instances will use version 3) vrrp_version <2 or 3> #配置VIP的默认网络接口。(default: eth0) default_interface eth0 #VRRP通告使用的组播组IPv6地址(default: ff02::12) vrrp_mcast_group6 ff02::12 #不向邮件发送警告 no_email_faults #转换到MASTER后的第二组免费arp延迟。以秒为单位,0表示没有第二组。 (default: 5) vrrp_garp_master_delay 10 #转换到MASTER后一次发送的免费ARP消息数。(default: 5) vrrp_garp_master_repeat 1 #MASTER收到较低优先级的通告后,第二组免费arp的延迟。 (default: vrrp_garp_master_delay) vrrp_garp_lower_prio_delay 10 #MASTER收到低优先级的通告后,一次发送的免费ARP消息的个数。(default: vrrp_garp_master_repeat) vrrp_garp_lower_prio_repeat 1 #MASTER免费arp刷新的最小时间间隔。以秒为单位。(default: 0 (no refreshing)) vrrp_garp_master_refresh 60 #MASTER一次发送的免费ARP消息数 vrrp_garp_master_refresh_repeat 2 #接口发送免费ARP报文的延迟时间,单位是秒(resolution usecs)。(default: 0) vrrp_garp_interval 0.001 } |
2.2、BFD配置块
- 这是RFC5880(双向转发检测)的一个实现,它可以在两个keepalive实例之间工作,但在主/备VRRP实例之间使用非加权track_bfds意味着只有两个VRRP实例都运行时,该VRRP实例才能够运行,这在一定程度上违背了VRRP的目的。
- 这个实现已经用OpenBFDD进行了测试(可从https://github.com/dyninc/OpenBFDD获得)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | bfd_instance <STRING> { #BFD邻居IP(同义词neighbour_ip) neighbor_ip <IP ADDRESS> #要使用的源IP(可选,除非为了确保本地端口有效,这是必需的) source_ip <IP ADDRESS> #所需的最小RX时间间隔,单位为ms(例如3.312)(default is 10 ms) min_rx <DECIMAL> #期望的最小TX间隔,单位为ms(分辨率为微秒)(default is 10 ms) min_tx <DECIMAL> #期望的空闲TX间隔,单位为ms(分辨率为微秒)(default is 1000 ms) idle_tx <DECIMAL> #在会话宣告down后,错过的报文数(default is 5) multiplier <INTEGER> #在被动模式下操作(默认为主动) passive # out going IPv4 ttl to use (default 255) ttl <INTEGER> # outgoing IPv6 hoplimit to use (default 64) hoplimit <INTEGER> #接收报文中ttl/hoplimit的最大减少值(默认为0)255禁用跳数检查255禁用跳数检查) max_hops <INTEGER> #默认跟踪权重。正常情况下,当bfd实例状态为up时,vrrp实例优先级增加正权值。当bfd实例状态为down时,负权值降低优先级。但是,如果指定了reverse,则优先级在up时降低,在down时增加。 weight <-253:253> [reverse] #正常情况下,bfd事件通知同时发送给VRRP进程和checker进程。指定vrrp或checker将导致bfd_instance的事件通知只发送给指定的进程 vrrp checker } |
2.3、VRRPD配置块
- VRRPD顶级配置块中包含的子块有:VRRP script(s)、VRRP synchronization group(s)、VRRP gratuitous ARP、unsolicited neighbour advert delay group(s)、VRRP instance(s)。
2.3.1、VRRP script(s)配置子块
- 脚本将周期性地执行,间隔<interval>秒执行一次。
- 执行脚本连续失败<fall>次后,VRRP实例将会切换到fault状态。在此之后,如果执行脚本连续成功<rise>次,VRRP实例将会离开fault状态,除非VRRP实例由于跟踪其他脚本或接口而处于fault状态。
- 如果权重为正,则每1次成功,监视它的所有VRRP实例的优先级将增加<weight>。相反,在失败的情况下,将从初始优先级中减去一个负权重。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | vrrp_script <SCRIPT_NAME> { #脚本的路径 script <STRING>|<QUOTED-STRING> #周期性地执行脚本,间隔<interval>秒执行一次。(default: 1 second) interval <INTEGER> #在该脚本被认为失败的几秒之后 timeout <INTEGER> #调整优先级的权重(默认:0)。。 weight <INTEGER:-253..253> [reverse] #执行脚本连续成功n次,状态从fail转换到ok rise <INTEGER> #执行脚本连续失败n次,状态从ok转换到fail fall <INTEGER> #运行脚本的用户/组名。group默认为用户组 user USERNAME [GROUPNAME] #假设脚本最初处于失败状态 init_fail } |
2.3.2、VRRP instance(s)配置子块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | vrrp_instance <STRING> { #当前节点在这个虚拟路由器中的初始状态。在一个虚拟路由器中只能有一个是MASTER节点,其它节点都应该是BACKUP state MASTER|BACKUP #使用哪个网卡接口发送VRRP通告 interface eth0 #虚拟路由器的惟一标识,取值范围是1-255。(同一个虚拟路由器必须一样) virtual_router_id 51 #当前主机在该虚拟路径器中的优先级,取值范围是1-255。 priority 100 #vrrp通告的时间间隔,单位秒 advert_int 1 #调用定义的vrrp_script track_script { <SCRIPT_NAME> <SCRIPT_NAME> weight <-253..253> [reverse|no_reverse] } #vrrp通告时使用的认证信息 authentication { #认证模式,建议使用简单认证pass auth_type PASS|AH #pass认证密码,只使用前8个字符 auth_pass 1234 } #使用IPv4配置vip virtual_ipaddress { #不使用dev指定网卡接口时,就将vip绑定到interface指定的网卡接口 <IPADDR>[/<MASK>] [brd <IPADDR>] [dev <STRING>] [scope <SCOPE>] [label <LABEL>] #辅助ip,查看要用ip命令 192.168.200.17 /24 dev eth1 #别名ip,查看可用ifconfig命令 192.168.200.18 /24 dev eth2 label eth2:1 } #使用IPv6配置vip virtual_ipaddress_excluded { <IPADDR>[/<MASK>] [brd <IPADDR>] [dev <STRING>] [scope <SCOPE>] [label <LABEL>] <IPADDR>[/<MASK>] ... ... } #当前节点转变为主节点时,要执行的脚本 notify_master <STRING>|<QUOTED-STRING> [username [groupname]] #当前节点转变为备节点时,要执行的脚本 notify_backup <STRING>|<QUOTED-STRING> [username [groupname]] #当前节点转变为fault状态时,要执行的脚本 notify_fault <STRING>|<QUOTED-STRING> [username [groupname]] #停止VRRP时,要执行的脚本 notify_stop <STRING>|<QUOTED-STRING> [username [groupname]] notify <STRING>|<QUOTED-STRING> [username [groupname]] #如果master接收到优先级低于master的通告时,要执行的脚本 notify_master_rx_lower_pri <STRING>|<QUOTED-STRING> [username [groupname]] #监控网络接口。重量必须在-253和+253之间,0是默认行为,这意味着如果被监控的网络接口出现故障,就转为fault状态 track_interface { eth0 eth1 eth2 weight <-253..253> [reverse] ... } #VRRP版本号,默认是全局参数的vrrp_version。如果是IPv6就应该使用"version 3" version <2 or 3> #使用非抢占模式,默认是抢占模式。注意:为了使其工作,初始状态不能是MASTER。 nopreempt #在抢占式模式下,指定延迟抢占的时间(当master节点通告的优先级低于本节点),以秒为单位。取值范围是0-1000,默认值是0。注意:为了使其工作,初始状态不能是MASTER。 preempt_delay 300 # waits 5 minutes } |
- 通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
- notify <STRING>|<QUOTED-STRING>
2.4、LVS配置块
- LVS顶级配置块中包含的子块有:Virtual server group(s)和Virtual server(s)
- LVS配置块是通过定义虚拟服务器组、虚拟服务器和可选的SSL配置实现的。
- 每个虚拟服务器都定义了一组后端服务器,可以对将每个后端服务器进行healthcheckers。
2.4.1、Virtual server group(s)配置子块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | virtual_server_group <STRING> { # Virtual IP Address and Port <IPADDR> [<PORT>] <IPADDR> [<PORT>] ... # <IPADDR RANGE> is any of the following forms (or their IPv6 equivalents) # XXX.YYY.ZZZ.WWW-VVV eg 192.168.200.1-10 (includes both .1 and .10) # AAA.BBB.CCC.DDD-EEE.FFF.GGG.HHH eg 192.168.200.250-192.168.201.10 # III.JJJ.KKK.LLL/nn eg 192.168.202.8/29 <IPADDR RANGE> [<PORT>] # VIP range [VPORT] <IPADDR RANGE> [<PORT>] ... # Firewall Mark (fwmark) fwmark <INTEGER> fwmark <INTEGER> [inet|inet6] ... } |
2.4.2、Virtual server(s)配置子块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | virtual_server <IPADDR> [<PORT>] | #使用IP+Port定义集群服务 virtual_server fwmark <INTEGER> | #使用防火墙标记定义集群服务 virtual_server group <STRING> { #定义调度方法 lvs_sched rr|wrr|lc|wlc|lblc|sh|mh|dh|fo|ovf|lblcr| sed |nq|twos #指定LVS的模式,默认为NAT lvs_method NAT|DR 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> #服务协议 protocol TCP|UDP|SCTP #备用后端服务器地址(sorry页面) sorry_server <IPADDR> [<PORT>] #服务轮询的时间间隔(默认为60秒) delay_loop <TIMER> #当健康检查程序检测到失败时,将权重设置为0 inhibit_on_failure #定义一个后端服务器 real_server <IPADDR> [<PORT>] { #后端服务器的权重,默认为1 weight <INTEGER> #当后端服务器上线(up)时,要执行的脚本 notify_up <STRING>|<QUOTED-STRING> [username [groupname]] #当后端服务器下线(down)时,要执行的脚本 notify_down <STRING>|<QUOTED-STRING> [username [groupname]] #到后端服务器的最大连接数 uthreshold <INTEGER> #到后端服务器的最小连接数 lthreshold <INTEGER> #在状态转换期间发送电子邮件通知,是否使用上面global_defs中的地址 smtp_alert <BOOL> #健康检查器有:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|DNS_CHECK|MISC_CHECK|BFD_CHECK|UDP_CHECK|PING_CHECK|FILE_CHECK #HTTP健康检查器 HTTP_GET { # HTTP协议版本:1.0、1.0C和1.1之一 http_protocol <PROTOCOL> #测试的url,可以有多个条目 url { #定义要监控的URL path <STRING> #根据响应内容的校验码判断后端服务器是否健康 #curl -s http://172.16.0.6 | md5sum 生成校验码命令 #genhash -s 172.16.0.6 -p 80 -u /index.html 生成校验码命令 digest <STRING> #根据响应码判断后端服务器是否健康,默认值是200-299。建议使用 status_code <INTEGER|RANGE> [<INTEGER|RANGE>] ... } #向后端服务器的哪个IP地址发起健康状态检测请求,默认值是realserver IP connect_ip <IPADDR> #向后端服务器的哪个PORT发起健康状态检测请求,默认值是ealserver port connect_port <PORT> #发出健康状态检测请求的源IP地址 bindto <IPADDR> #发出健康状态检测请求的源端口 bind_port <PORT> #如果对活动后端服务器的检查失败,则需要检测n次。默认值为1 retry <INTEGER> #失败后每次重试的时间间隔。DNS_CHECK默认为delay_loop,HTTP_GET和SSL_GET默认为3秒,其他默认为1秒 delay_before_retry <TIMER> #连接的超时时长。默认为5秒 connect_timeout <TIMER> } #TCP健康检查器 TCP_CHECK { #向后端服务器的哪个IP地址发起健康状态检测请求,默认值是realserver IP connect_ip <IPADDR> #向后端服务器的哪个PORT发起健康状态检测请求,默认值是ealserver port connect_port <PORT> #发出健康状态检测请求的源IP地址 bindto <IPADDR> #发出健康状态检测请求的源端口 bind_port <PORT> #如果对活动后端服务器的检查失败,则需要检测n次。默认值为1 retry <INTEGER> #失败后每次重试的时间间隔。DNS_CHECK默认为delay_loop,HTTP_GET和SSL_GET默认为3秒,其他默认为1秒 delay_before_retry <TIMER> #连接的超时时长。默认为5秒 connect_timeout <TIMER> } } } |
1
1 | # # |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?