高可用
# 高可用
nginx 一台机器肯定是不够的,nginx 自身也需要集群与高可用机制。
# Keepalived
Keepalived 是运行在 LVS(Linux Virtual Server) 之上,是一个用于做双机热备(Hot Agent)的软件,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败切换,提高系统的可用性。
# 运行原理
keepalived 通过选举(看服务器设置的权重)挑选出一台热备服务器做 MASTER 机器,MASTER 机器会被分配到一个指定的虚拟 ip,外部程序可通过该 ip 访问这台服务器,如果这台服务器出现故障(断网,重启,或者本机器上的 keepalived crash 等),keepalived 会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做 MASTER 并分配同样的虚拟 IP,充当前一台 MASTER 的角色。
# 选举策略
选举策略是根据 VRRP 协议,完全按照权重大小,权重最大(0~255)的是 MASTER 机器,下面几种情况会触发选举
- keepalived 启动的时候
- master 服务器出现故障(断网,重启,或者本机器上的 keepalived crash 等,而本机器上其他应用程序 crash 不算)
- 有新的备份服务器加入且权重最大
# 双机单播模式
# 环境准备
虚拟 IP: 192.168.31.88
主机 IP: 192.168.31.31
从机 IP: 192.168.31.32
# 主机配置
global_defs {
router_id MASTER_1
}
vrrp_script check_nginx {
script "/etc/keepalived/nginx_check.sh"
# 每 2 秒检测一次
interval 2
weight -20
}
vrrp_instance VI_1 {
# 标识为主服务
state MASTER
# 绑定虚拟 IP 的网络接口,这个和你实际 ip 地址所在接口一致就行
interface eth1
# 虚拟路由 id,和从机保持一致
virtual_router_id 88
# 本机 ip
mcast_src_ip 192.168.31.31
# 权重,需要高于从机
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
# 执行 Nginx 监控的服务
check_nginx
}
# 配置单播的源地址
unicast_src_ip 192.168.31.31
unicast_peer {
# 配置单播的目标地址
192.168.31.32
}
virtual_ipaddress {
192.168.31.88/24
}
}
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
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
# 从机配置
global_defs {
router_id BACKUP_1
}
vrrp_script check_nginx {
script "/etc/keepalived/nginx_check.sh"
# 每 2 秒检测一次
interval 2
weight -20
}
vrrp_instance VI_1 {
# 标识为从服务
state BACKUP
# 绑定虚拟 IP 的网络接口,这个和你实际 ip 地址所在接口一致就行
interface eth1
# 虚拟路由 id,和从机保持一致
virtual_router_id 88
# 本机 ip
mcast_src_ip 192.168.31.32
# 权重,需要高于从机
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
# 执行 Nginx 监控的服务
check_nginx
}
# 配置单播的源地址
unicast_src_ip 192.168.31.32
unicast_peer {
# 配置单播的目标地址
192.168.31.31
}
virtual_ipaddress {
192.168.31.88/24
}
}
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
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
# nginx 探活脚本
#!/usr/bin/env bash
set -e
counter=$(ps -C nginx --no-heading | wc -l)
if ["$counter" -eq 0]; then
/usr/local/nginx/nginx
# sleep 的值必须要小于 keepalived.conf 配置文件中的 “vrrp_script check_nginx” 中的 interval 的值(2)
sleep 1
counter=$(ps -C nginx --no-heading | wc -l)
if ["$counter" -eq 0]; then
systemctl stop keepalived
fi
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# nginx 测试配置
# 主机配置
location /api {
echo "192.168.31.31";
}
# 从机配置
location /api {
echo "192.168.31.32";
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 测试
# 测试虚拟 IP 是否生效
curl 192.168.31.88/api
----------
192.168.31.31
1
2
3
2
3
# 测试主机 nginx 挂了
能够正确热切到从节点
nginx -s stop
curl 192.168.31.88/api
----------
192.168.31.32
1
2
3
4
2
3
4
# 测试主机恢复了
重启主机的 nginx 后,请求再次切回到了主机,如果想要不自动会切只需要在 vrrp_instance
中加上 nopreempt
即可
nginx
curl 192.168.31.88/api
----------
192.168.31.31
1
2
3
4
2
3
4
# 其他的
还有组播模式等可以自行了解。可以看到 keepalived 不只是用于 nginx,其他任何需要高可用的都能使用 keepalived 实现。
在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11