Keepalived 配置详解

Keepalived 使用

keepalived 启动流程:

  • 启动三个进程(主进程、healthcheck 进程、vrrp 进程)之后,先进入 backup 状态,运行一次 vrrp_script 成功后发现没有主,这时候会进入 master 状态,拉起 VIP,完成启动。
  • 切换的流程:
  • 原 keepalived master 节点,运行检查脚本异常,则 keepalived 进入 FAULT 状态,释放 vip,原 backup 的 keepalived 会接管 VIP。
  • 注意事项:VIP 必须在 master 上。为了这个要求,需要在主库上先启动 keepalived。

Keepalived 配置

/etc/sysconfig/keepalived # keepalived 运行时参数配置

/etc/keepalived/keepalived.conf # keepalived 基本配置文件

Note:keepalived 配置文件的运行时加载功能,可以通过命令 kill -HUP $(cat /var/run/keepalived.pid) 实现。该功能需要在 1.2.20 及以上版本才能实现

下面是一个基本的 keepalived.conf 文件的配置示例

! Configuration File for keepalived
global_defs {  #全局配置段
  notification_email {
    admin@example. com
  }
  notification_email_from noreply@example.com
  smtp_server 127.0.0.1
  smtp_connect_timeout 60
  router_id LVS_DEVEL
  script_user root
}
vrrp_script chk_haproxy {
  script "killall -0 haproxy"
  interval 1
  weight 2
}
vrrp_sync_group VG1 { #VRRP组配置段
  group {
    VI_1
    VI_2
  }
}
vrrp_instance VI_1 { #VRRP 实例VI_1配置段
  state MASTER
  interface eth0
  virtual_router_id 50
  priority 100
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass password123
  }
  virtual_ipaddress {
    10.0.0.1
  }
  track_script {
    chk_haproxy
  }
}
vrrp_instance VI_2 { #VRRP 实例VI_2配置段
  state MASTER
  interface eth1
  virtual_router_id 2
  priority 100
  advert_int 1
  authentication{
    auth_type PASS
    auth_pass password123
  }
  virtual_ipaddress {
    192.168.1.1
  }
  notify_master "/etc/keepalived/notify.sh master"  #定义该节点变为master后执行的脚本
  notify_backup "/etc/keepalived/notify.sh backup" #定义该节点变为backup后执行的脚本
  notify_fault "/etc/keepalived/notify.sh fault" #定义该节点变为fault后执行的脚本
}
virtual_server 10.0.0.1 80 { #虚拟服务器LVS 配置段
  delay_loop 6
  lvs_sched rr
  lvs_method DR
  protocol TCP
  sorry_server 127.0.0.1 80
  real_server 192.168.1.20 80 { #定义后端服务器1
    XXX_CHECK {
      connect timeout 10
    }
  }
  real_server 192.168.1.21 80 { #定义后端服务器2
    XXX_CHECK {
      connect timeout 10
    }
  }
}

从 Keepalived 配置文件/etc/keepalived/keepalived.conf 中的内容可以看到, Keepalived 的配置主要分为三个模块, 即全局配置段、VRRP 定义段、虚拟服务器 LVS 配置段。

配置文件 keywords(关键字) 详解

注意:各个大版本之间的 keyword 有很大区别,名称以及所在位置都有区别,千万注意!!!!

1.全局配置段

全局配置段( global_defs )的主要作用之一就是 Keepalived 出现故障时的邮件通知管理员,让管理员以邮件形式知道 Keepalived 的运行情况。通常情况下,邮件通知不是必须的,用户可以选择其他监控方式来对 Keepalived 进行监控,如 Nagios。需要说明的是,全局配置段对 Keepalived 来说是可选的,其内容并不是 Keepalived 配置所必须的。全局配置段的几个主要配置参数说明如下:

global_defs #

  • Notification_email # 用于配置接收邮件的负载均衡器的管理员群组邮箱。

  • Notification_email_from # 自定义发出邮件的邮箱地址,即管理员邮件显示的发件人。

  • SMTP # 指定简单邮件参数协议服务器地址,一般为本机。

  • LVS_ID # LVS 负载均衡器标志,同一网络中其值唯一。

  • script_user <USER> # 指定 vrrp_script 定义的脚本

  • enable_script_security # 开启脚本安全

vrrp_script ScriptName { … } # 定义检查脚本以便后面的 track_script 关键字来引用,若检查状态码为非 0 失败,则引用该脚本的 VRRP 变成 Fault 状态,若定义了 weight 字段且优先级比其余节点都低,则变为 Backup 状态

  • script “/PATH/FILE” # 定义需要执行的脚本或者需要执行的脚本的路径

  • interval # 脚本调用间隔的秒数,默认 1 秒

  • timeout # 定义调用失败多少秒后,确认该脚本失败

  • weight # 脚本执行失败后,调整调用了该脚本的 vrrp 的优先级(priority)。i.e.降低或者提高优先级的数值,INTEGER 值为-254 到 254 之间

  • rise # 判断服务正常的检查次数,正常多少次,会进行状态转变

  • fall# 判断服务异常的检查次数,异常多少次,会进行状态转转变

  • user USERNAME [GROUPNAME] # 运行该脚本的用户

  • init_fail # 定义该脚本默认为失败状态

2.VRRP 配置段

VRRP 配置段主要用于定义 VRRP 组,在 Keepalived 发生任何状态变化时,被定义在 VRRP 组中的 VRRP 实例作为逻辑整体一致行动,如在发生 LVS Router 故障切换 Failover 的过程中, VRRP 组中的实例会作为一致整体同时切换。在本节的演示配置中,同一个 VRRP 组内配置了两个 VRRP 实例,分别是针对外部网络的 VRRP_EXT 实例和针对内部私有网络的 VRRP_INT 实例。VRRP 配置段中的关键参数说明如下。

vrrp_sync_group {…} # VRRP 实例一致组,用于定义 VRRP 一致组中的成员,组内的 VRRP 实例行为是一致的,如在 Failover 的时候, 一致组内的 VRRP 实例将同时迁移。在本机示例中,当 LBl 出现故障时, VRRP INT 和 VRRP EXT 实例将同时切换到 LB2 上。如果 不定义组,那么如果一台设备上有俩网卡的时候,只有一块网卡坏了的话,定义在另一块网卡上的 VRRP 则还在原来的设备上运行,无法自动切换到备用设备上。

vrrp_instance {…} # VRRP 实例,用于配置一个 VRRP 服务进程实例,其中的 state 设定了当前节点 VRRP 实例的主备状态,在主 LVS Router 中,该值应该为 MASTER,在备 LVS Router 中,其值为 BACKUP 。正常情况下只有 Master 的 LVS Router 在工作, Backup 的 LVS Router 处于 Standby 状态。

  • state # 当前节点的初始状态

  • interface # 对外提供服务的网络接口,如 eth0 和 eth1,选择服务接口时,一定要核实清楚,LV Router 的 VIP 将会配置到这个物理接口上。也可以配置多个实例在同一个网卡上,然后每个实例配置不同优先级,HOST1 上的实例 1 是主实例 2 是备,HOST2 上的实例 1 是备实例 2 是主,这样可以实现两台 HOST 双主模式负载均衡流量

  • virtual_Router_id # VRID,虚拟路由标志,同一个 VRRP 实例使用唯一的标识。即同一个 VRRP 实例中,MASTER 和 BACKUP 状态的 VRRP 实例中,VRID 值是相同的,同时在全部 VRRP 组内是唯一的。

    • Note:如果在同网段有相同的 vrid 号,则 keepalived 会无限输出报错日志。使用 tcpdump -nn -i any net 224.0.0.0/8 |grep vrid 命令可以查到该网段都有哪些 vrid 号正在使用
  • priority # 此参数指明了该 VRRP 实例的优先级,数字越大说明优先级越高,取值范围为 0-255 ,在同一个 VRRP 实例里, MASTER 的优先级高于 BACKUP。若 MASTER 的 Priority 值为 100 ,那 BACKUP 的 Priority 只能是 99 或更小的数值。

  • nopreempt # 开启非抢占模式。允许低优先级的节点保持 MASTER 角色,即使高优先级的节点从故障中恢复也是如此。i.e.不会触发选举过程。只有当前 BACKUP 节点 认为 MASTER 不存在时,才会重新选举。

    • Note:该模式会引发这个问题 Keepalived 非抢占模式 VIP 不漂移问题

      • 如果想要使用非抢占模式,主备的 keepalived 的 state 都不能是 MASTER。
  • advert_int # Master 路由发送 VRRP 广播的时间间隔,单位为秒。默认为 1 秒

  • authentication {…} # 包含验证类型和验证密码,类型主要有 PASS 和 AH 两种,通常使用的类型为 PASS 验证密码为明文,同一 VRRP 实例 MASTER 与 BACKUP 使用相同的密码才能正常通信。

    • auth_type PASS|AH # 认证类型。Note:只能是 PASS 或 AH 选项,不能写别的,否则报错:unknown authentication type ’lvs'

    • auth_pass PASSWORD # 认证的密码

  • virtual_ipaddress {IP} # 虚拟 IP 地址,即 VIP,可以有多个虚拟 IP 、地址,每个地址占一行,不需要指定子网掩码。作为 Standby 的负载均衡器,LB2 的 keepalived.conf 配置文件与 LB1 类似,其不同之处在于 VRRP 实例配置段中的的 VRRP 实例 State 和 Priority 参数的设置,如 LB1 中的 State 为 Master, LB2 中的 State 为 BACKUP ,并且 LB2 中 VRRP 实例的 Priority 必须小于 LB1 中的优先级。

  • track_script {ScriptName} # 引用全局配置段中 vrrp_script 关键字的名为 ScriptName 的脚本

  • notify_master “/PATH/ScriptName ARGS” # 定义该节点变为 master 后执行的脚本

  • notify_backup “/PATH/ScriptName ARGS” # 定义该节点变为 backup 后执行的脚本

  • notify_fault “/PATH/ScriptName ARGS” # 定义该节点变为 fault 后执行的脚本

3. 虚拟服务器 LVS 配置段

虚拟服务器( Virtual Server )配置段主要定义 LVS 的监昕虚拟 IP 地址和对应的后端服务器及其健康检测机制,虚拟服务器的定义段是 Keepalived 框架最重要的部分。此部分的定义主要分为一个 Virtual Server 的定义和多个 Real Servers 的定义, Virtual Server 由 VRRP 中定义的 VIP 加上端口号构成,而 Real Server 由后端服务器节点 IP 和端口号构成,相关的配置参数说明如下。

virtual_server {…} # lvs 中调度器的配置

  • delay_Loop NUM # 健康检查的时间间隔,单位为秒。

  • lvs_sched # 指定负载均衡算法,示例中的 rr 表示 Round-Robin 轮询算法。(老版本的 keyword 为 lb_algo)

  • lvs_method # 采用的路由方法,示例中采用的是 DR 路由,还可以采用 NAT 和 TUN 路由。(老版本的 keyword 为 lb_kind)

  • persistence_timeout # 指定连接持久的超时时间。默认 6 分钟。

  • protocol# 转发协议,一般有 TCP 和 UDP 两种。

  • connect_timeout # 连接超时时间。默认 5 秒。当 RS 检查失败 5 秒后,即判断该 RS 无响应,从 ipvs 组中踢出

  • retry # 重试次数。默认 1 次。当 RS 检查失败后,再次检查的次数。(老版本的 keyword 为 nb_get_retry)

  • delay_before_retry # 失败后,让 RS 重新加回 ipvs 组重试的次数。默认 1 次。当 rs 检查 1 次成功后,就将该 RS 重新加入 ipvs 组

  • sorry_server :用于定义当后端所有 real server 挂掉后,使用哪台设备进行回应

  • real_server IP PORT {…} # 后端服务器配置,i.e.lvs 中 RS 的配置

    • CHECK {…} # 指定健康检查的方式。TCP 就是测试目标端口通不通。HTTP 则是测试指定资源的响应码

      • 可用的 CHECK 有如下几个,常用的标黄

      • HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|DNS_CHECK|MISC_CHECK|BFD_CHECK|UDP_CHECK|PING_CHECK|FILE_CHECK

4. 其他配置

include <FILE> # 指定要包含的其他配置文件。FILE 可以用绝对路径,也可以使用通配符。指定的 FILE 中的内容将作为 keepalived 配置内容附加到主配置后面

检查脚本配置示例

定义脚本用于把 MASTER 节点的优先值降低 20,以实现主备切换,在指定目录中创建一个 down 文件,也可以使用别的判断方式

vrrp_script chk_mantaince_down { #配置一个名为chk_mantaince_down的脚本
  # 当某个文件存在时,权重减20
  script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
  interval 1
  weight -20
}

判断 nginx 进程是否存在,如果不存在则权重-2 使之变为 BACKUP

vrrp_script chk_haproxy {
  # 判断haproxy进程是否存在,如果不存在则权重-2使之变为BACKUP
  script "killall -0 haproxy" # 可以使用这个语句判断nginx,script "killall -0 nginx &> /dev/null"
  interval 1 # 运行脚本的时间间隔
  weight -2
}

引用脚本

vrrp_instance VI_1 {
...
  track_script { # 在VRRP实例中引用哪些keepalived.conf中定义的脚本
    chk_mantaince_down
  }
  notify_master "/etc/keepalived/notify.sh master" # 定义该节点变为master后执行的脚本
  notify_backup "/etc/keepalived/notify.sh backup" # 定义该节点变为backup后执行的脚本
  notify_fault "/etc/keepalived/notify.sh fault" # 定义该节点变为fault后执行的脚本
}

最后修改 March 23, 2023: 整理,减少顶级目录 (8b75fa89)