keepalived高可用

keepalived

Keepalived是一个开源的路由软件,主要用于提供高可用性(HA)解决方案,通过VRRP(Virtual Router Redundancy Protocol)协议实现负载均衡和故障转移。

  1. 高可用(HA):Keepalived通过VRRP协议实现高可用性,允许一组路由器(或服务器)共享一个虚拟IP地址(VIP)。当主服务器(Master)故障时,备用服务器(Backup)可以自动接管这个VIP,确保服务不中断。
  2. VRRP:VRRP是一种网络协议,设计用于在多台路由器之间实现冗余。Keepalived利用VRRP来检测和管理服务器或路由器的健康状态。
  3. Keepalived提供健康检查机制,可以监控服务或服务器的健康状态。如果检测到故障,它可以自动进行故障转移,确保服务的高可用性。
  4. 故障转移:当主服务器检测到故障或停止响应时,Keepalived会自动将VIP转移到备用服务器,从而实现无缝的服务转移。
  5. 自定义脚本执行:支持在状态变更时执行自定义脚本,进行特定的操作,如通知管理员、启动或停止服务等。

VRRP相关概念以及工作原理

概念

虚拟路由器冗余协议(VRRP):VRRP是一种网络协议,设计用于在多台路由器或服务器之间提供冗余,以提高网络的可靠性和可用性。
虚拟IP(VIP):VIP是一个共享的IP地址,被配置在VRRP组内的所有路由器或服务器上。客户端使用这个VIP来访问服务,而不直接访问具体的物理设备。
VRRP组:一个VRRP组由一个或多个路由器组成,其中一个被选为主路由器(Master),其余为备用路由器(Backup)。
Master路由器:在VRRP组中,优先级最高的路由器或被指定为Master,它负责处理流量和响应ARP请求。
Backup路由器:如果Master路由器发生故障,Backup路由器中优先级最高的会接管成为新的Master。

工作原理

  • 选举:
    • VRRP通过选举机制确定Master。选举基于以下几个因素:
    • 优先级:每个VRRP实例都有一个优先级,优先级高的路由器被选为Master。
    • IP地址:如果优先级相同,则选择拥有最高IP地址的路由器为Master。
    • VRRP通告(Advertisement):Master路由器会定期发送VRRP通告信息(VRRP Advertisement),告知其他备用路由器自己是活跃的。
  • 故障转移:
    • 当Master路由器停止发送VRRP通告(可能是由于故障或网络问题),Backup路由器会检测到此情况并启动选举过程:备用路由器等待一个预设的间隔(Master Down Interval)后,如果没有收到通告,则认为Master已下线。优先级最高的备用路由器将接管Master角色,接管VIP,并开始处理流量。
  • VRRP报文:
    • VRRP使用组播地址224.0.0.18发送VRRP报文,包括:
      • VRRP Advertisement:由Master发送,用于告知状态。
      • VRRP Request:由新加入的或重启的路由器发送,用于请求当前的VRRP状态。
  • 认证:
    • VRRP支持简单的密码认证(如使用auth_type PASS),以防止非法节点加入VRRP组。
  • 负载均衡:
    • VRRP本身不提供负载均衡,但可以与LVS(Linux Virtual Server)等负载均衡技术结合使用。

keepalived工作模式

  • 抢占模式:keepalived默认为抢占模式,在该模式下,如果一个优先级更高的备用节点(BACKUP)启动或者恢复,它会立即接管master
  • 非抢占模式:在非抢占模式下,即使一个优先级更高的备用节点启动或恢复,它也不会主动接管Master角色,除非当前的Master节点出现故障。通过在VRRP实例配置中添加nopreempt选项来启用非抢占模式。

keepalived相关命令

1
2
3
4
# 启动停止重启服务
systemctl start|stop|restart keepalived
# 配置文件检查
keepalived -f /etc/keepalived/keepalived.conf -t

启动keepalived后可以抓包查看多播信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# ]tcpdump -i ens160 -nn|grep 224.0.0.18
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), snapshot length 262144 bytes
15:44:21.201129 IP 192.168.27.8 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
15:44:22.201379 IP 192.168.27.8 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
15:44:23.201802 IP 192.168.27.8 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
15:44:24.201961 IP 192.168.27.8 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
15:44:25.202133 IP 192.168.27.8 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
15:44:26.202372 IP 192.168.27.8 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
15:44:27.202754 IP 192.168.27.8 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
15:44:28.202836 IP 192.168.27.8 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
# 192.168.27.8 > 224.0.0.18 源地址>组播地址
# VRRPv2, Advertisement 协议和类型
# vrid 51 VRRP实例ID为51
# prio 100 节点优先级为100
# authtype simple 使用简单的密码认证
# intvl 1s 表示VRRP广告报文的发送间隔为1秒
# length 20表示这个VRRP报文的长度为20字节

配置文件实例

keepalived配置文件为/etc/keepalived/keepalived.conf

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
# Keepalived配置文件示例

global_defs {
# 路由id:当前安装keepalived的节点主机标识符,确保全局唯一
router_id MASTER_1 # 对于备用节点,修改为BACKUP_1或其他唯一标识符
}

# 业务应用检测脚本(可选)
#vrrp_script check_component {
# # 业务应用检测脚本路径
# script "/etc/keepalived/check_component.sh"
# # 每隔两秒运行一次脚本
# interval 2
# # 脚本运行的超时时间
# timeout 5
# # 配置几次检测失败才认为服务异常
# fall 2
# # 优先级变化幅度,如果script中的指令执行失败,那么相应的vrrp_instance的优先级会减少10个点。
# weight -10
#}

vrrp_instance VI_1 {
# 表示状态是MASTER主机还是备用机BACKUP
state MASTER # 对于备用节点,修改为BACKUP,主要还是依靠priority来确定哪一个是master
# 该实例绑定的网卡,如:eth0
interface ens160
# 保证主备节点一致即可
virtual_router_id 51
# 权重[1-255],master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
priority 100 # 对于备用节点,设置一个较低的优先级,如70
# 主备之间同步检查时间间隔,单位秒
advert_int 1
# 认证权限密码,防止非法节点进入
authentication {
auth_type PASS
auth_pass password # 替换为实际的密码,支持最多8个字符
}

# 如果需要非抢占模式,可以添加以下行,默认使用抢占模式
#
# nopreempt

# 业务应用检测脚本在本VRRP实例中使用
# track_script {
# check_component
# }

# 虚拟出来的ip,可以有多个(vip)
virtual_ipaddress {
# 注意:主备两台的vip都是一样的,绑定到同一个vip,设置别名
192.168.27.100/24 dev ens160 label ens160:0
}
}

# 如果需要多个VRRP实例,可以添加更多vrrp_instance块
# vrrp_instance VI_2 {
# ...
# }