首页
首页
文章目录
  1. 简介
  2. 规划
  3. 安装
  4. 双主keepalived配置
    1. 192.168.110(nginx1)配置
    2. 192.168.111(nginx2)配置
  5. chk_nginx.sh文件编写
  6. 启动keepalived和nginx服务
  7. 结束

用keepalived+nginx实现双主负载均衡

简介

    keepalived的HA分为抢占模式和非抢占模式,抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。下面主要讲解抢占模式。

规划

VIP 本机IP 系统主机名 nginx端口
129.9.10.120 129.9.10.110 ngxin1 80
129.9.10.121 129.9.10.111 ngxin2 80

描述:

俩台nginx服务器分别是110、111 双主vip分别为120、121

安装

这篇就直接略过了、可以采用yum或者编译源码安装nginx和keepalived,主要讲解配置文件。

双主keepalived配置

192.168.110(nginx1)配置

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
global_defs {
router_id NGINX_1 # 标识本节点的名称,通常为hostname
}
## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
## 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,
## 并且weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_haproxy { # 定义一个脚本
script "/tmp/chk_nginx.sh" # 监测nginx是否正常的脚本
interval 2 # 每2秒检测一次nginx的运行状态
weight 2
}
vrrp_instance VI_1 { # 创建一个主节点 111为backup节点
state MASTER # 状态,主节点为MASTER,备份节点为BACKUP
interface eno16777984 # 绑定VIP的网络接口,通过ifconfig查看自己的网络接口,提供服务的网卡名
virtual_router_id 200 # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
priority 50 # 节点优先级,值范围0~254,MASTER要比BACKUP高
advert_int 1 # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
# 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass kuanglnginx
}
# nginx存活状态检测脚本
track_script {
chk_haproxy
}
# 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
virtual_ipaddress {
129.9.10.120
}
}
vrrp_instance VI_2 { # 创建一个backup节点 111为master节点
state BACKUP # 状态,主节点为MASTER,备份节点为BACKUP
interface eno16777984 # 绑定VIP的网络接口,通过ifconfig查看自己的网络接口,提供服务的网卡名
virtual_router_id 251 # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
priority 100 # 节点优先级,值范围0~254,MASTER要比BACKUP高
advert_int 1 # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
# 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass kuangl
}
# nginx存活状态检测脚本
track_script {
chk_haproxy
}
# 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
virtual_ipaddress {
129.9.10.121
}
}

192.168.111(nginx2)配置

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
global_defs {
router_id NGINX_2
}
vrrp_script chk_haproxy {
script "/tmp/chk_nginx.sh"
interval 2
weight 2
}
vrrp_instance VI_1 { # 创建一个backup节点 110为master节点
state BACKUP
interface eno16777984
virtual_router_id 200 # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
priority 100 # 节点优先级,值范围0~254,MASTER要比BACKUP高
advert_int 1
# 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass kuanglnginx
}
track_script {
chk_haproxy
}
# 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
virtual_ipaddress {
129.9.10.120
}
}
vrrp_instance VI_2 { # 创建一个master节点 110为backup节点
state MASTER
interface eno16777984
virtual_router_id 251 # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
priority 50 # 节点优先级,值范围0~254,MASTER要比BACKUP高
advert_int 1
authentication {
auth_type PASS
auth_pass kuangl
}
track_script {
chk_haproxy
}
# 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
virtual_ipaddress {
129.9.10.121
}
}

chk_nginx.sh文件编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 #!/bin/bash
# description:
# 定时查看nginx是否存在,如果不存在则重启nginx
# 如果启动失败,则停止keepalived
status=$(ps -C nginx --no-heading|wc -l)
if [ "${status}" = "0" ]; then
systemctl restart nginx
status2=$(ps -C nginx --no-heading|wc -l)
if [ "${status2}" = "0" ]; then
systemctl stop keepalived
sleep 1m
systemctl start keepalived
fi
fi

备注:需要讲chk_nginx.sh放到可读目录并要给予可执行权限chmod u+x chk_nginx.sh

启动keepalived和nginx服务

1
2
systemctl start keepalived
systemctl start nginx

执行ip a 查看效果
129.9.10.110(ngixn1)效果
129.9.10.110(ngixn1)效果
129.9.10.111(ngixn2)效果
129.9.10.111(ngixn2)效果

### 测试故障转移

注意测试之前 需要修改下 chk_nginx.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 #!/bin/bash
# description:
# 定时查看nginx是否存在,如果不存在则重启nginx
# 如果启动失败,则停止keepalived
status=$(ps -C nginx --no-heading|wc -l)
if [ "${status}" = "0" ]; then
# systemctl restart nginx 注释掉此行,之后我们停止110上的nginx 观察vip是否会飘到111上
status2=$(ps -C nginx --no-heading|wc -l)
if [ "${status2}" = "0" ]; then
systemctl stop keepalived
sleep 1m
systemctl start keepalived
fi
fi

129.9.10.110(ngixn1)上执行

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
[root@nginx1 ~]# cat /tmp/chk_nginx.sh 
#!/bin/bash
# description:
# 定时查看nginx是否存在,如果不存在则重启nginx
# 如果启动失败,则停止keepalived
status=$(ps -C nginx --no-heading|wc -l)
if [ "${status}" = "0" ]; then
# systemctl restart nginx
status2=$(ps -C nginx --no-heading|wc -l)
if [ "${status2}" = "0" ]; then
systemctl stop keepalived
sleep 1m
systemctl start keepalived
fi
fi
[root@nginx1 ~]# systemctl stop nginx
[root@nginx1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777984: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:50:56:a0:37:a3 brd ff:ff:ff:ff:ff:ff
inet 129.9.10.110/16 brd 129.9.255.255 scope global eno16777984
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fea0:37a3/64 scope link
valid_lft forever preferred_lft forever

129.9.10.111(ngixn2)上执行ip a 查看效果
129.9.10.111(ngixn2)上执行ip a 查看效果

结束

End

支持一下
扫一扫,我会更有动力更新
  • 微信扫一扫
  • 支付宝扫一扫