Keepalived
Keepalived 是一个用于 Linux 虚拟服务器 (LVS) 集群的故障转移和监控守护进程,它使用虚拟路由器冗余协议 (VRRP) 提供高可用性功能和负载均衡。
安装
安装 keepalived 软件包。
启用 keepalived.service
。
配置
该服务在 /etc/keepalived/keepalived.conf
中配置。
主备故障转移设置
以下提供了一个基本配置,用于设置一个高可用性集群,其中两台服务器/路由器共享一个虚拟 IP 地址。两者都需要运行 keepalived。
在主机 A 上
/etc/keepalived/keepalived.conf
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 101 priority 255 advert_int 1 authentication { auth_type PASS auth_pass pass1234 } virtual_ipaddress { 172.16.0.100 } }
在主机 B 上
/etc/keepalived/keepalived.conf
vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 101 priority 150 advert_int 1 authentication { auth_type PASS auth_pass pass1234 } virtual_ipaddress { 172.16.0.100 } }
状态设置了服务启动时以及在处理多播通告以确定哪个主机具有最高优先级(将担任主角色)之前的主机的初始角色。此设置意味着具有较高优先级的主机 A 将管理 VIP(虚拟 IP 地址),并且只有当主机 A 停止响应时,主机 B 才会接管 VIP。默认的接管过渡时间为一秒。
带监控的故障转移设置
以下为在与 keepalived 相同的主机上运行的服务 (sshd) 提供故障转移集群。
此设置在故障转移主机本身上运行的 sshd 服务提供了更动态的集群。两台服务器都以备份状态启动,并且 nopreempt 选项允许优先级较低的服务器保持主角色,即使优先级较高的服务器在故障后返回也是如此。这可以防止在前主服务器恢复活动时中断与 VIP 的连接。配置还包括进程跟踪,以便在目标服务崩溃时降低服务器的优先级。由于进程部分中的 weight 选项被省略,因此一旦被跟踪的进程不再可用且延迟计时器用完,服务器就会进入失败状态。
在主机 A 上
/etc/keepalived/keepalived.conf
global_defs { notification_email { admin@example.net } notification_email_from lb1@example.net smtp_server mail.example.net smtp_connect_timeout 30 } # enter failed state when the sshd process is down vrrp_track_process track_sshd { process sshd delay 1 } vrrp_instance VI_1 { state BACKUP nopreempt interface eth0 virtual_router_id 101 priority 200 advert_int 1 authentication { auth_type AH auth_pass key12345 } virtual_ipaddress { 172.16.0.100 } track_process { track_sshd } smtp_alert }
在主机 B 上
/etc/keepalived/keepalived.conf
global_defs { notification_email { admin@example.net } notification_email_from lb2@example.net smtp_server mail.example.net smtp_connect_timeout 30 } # enter failed state when the sshd process is down vrrp_track_process track_sshd { process sshd delay 1 } vrrp_instance VI_1 { state BACKUP nopreempt interface eth0 virtual_router_id 101 priority 150 advert_int 1 authentication { auth_type AH auth_pass key12345 } virtual_ipaddress { 172.16.0.100 } track_process { track_sshd } smtp_alert }
带负载均衡的故障转移
Keepalived 还提供负载均衡,并有许多可能的算法(请参阅 keepalived.conf(5))。
这是一个可以添加到上述配置中的 HTTP 负载均衡的简单示例。
/etc/keepalived/keepalived.conf
virtual_server 172.16.0.100 80 { delay_loop 6 lvs_sched rr lvs_method NAT protocol TCP real_server 172.16.1.20 80 { TCP_CHECK { connect_timeout 10 } } real_server 172.16.1.21 80 { TCP_CHECK { connect_timeout 10 } } real_server 172.16.1.22 80 { TCP_CHECK { connect_timeout 10 } } real_server 172.16.1.23 80 { TCP_CHECK { connect_timeout 10 } } }
或者,keepalived 也可以与充当负载均衡器的 HAproxy 一起用于故障转移。
安全注意事项
keepalived 使用的 VRRP 协议不能为已在同一子网上的攻击者提供有效的安全保护。在此服务中使用身份验证的主要好处是防止意外添加破坏现有集群的服务器。当使用 auth_type PASS
时,密码会通过本地子网以明文形式随每个多播数据包发送。使用 auth_type AH
(IP 身份验证标头)将提供稍微好一点的抵抗攻击能力,但基本的破坏和攻击(如 ARP 欺骗)仍然是可能的。如果安全性对您来说是高优先级,请使用网络限制来保护 VRRP 流量,例如,为集群使用隔离的子网,并在防火墙中阻止来自其他网络的 VRRP 流量。