Nginx+Keepalived搭建高可用集群

集群和负载均衡

使用集群是网站解决高并发的常用手段。当一台服务器的处理能力不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求。这种情况下,更恰当的做法是增加服务器分担原有服务器压力。

通过负载均衡调度服务器,将来自浏览器的访问请求分发到应用服务器集群中的任何一台服务器上,如果有更多的用户,就在集群中加入更多的应用服务器,使应用服务器的负载压力不再成为整个网站的瓶颈。

Nginx基于反向代理可实现负载均衡,可以用Nginx的proxyupstream实现集群的负载均衡。

Keepalived高可用故障转移

Keepalived高可用服务是通过VRRP来实现的。在Keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。当主节点发生故障时,无法给备节点发送心跳消息,如果备节点无法继续检测到来自主节点的心跳。就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。

因此在线上环境中,经常使用Nginx+Keepalived实现高可用集群的搭建。

Nginx+Keepalived

准备工作

至少准备两台以上服务器,例如:

Nginx+Keepalived

配置Nginx集群

Nginx按照一定的算法(权重、轮询),将请求转发到集群中一台服务器上,减轻单个服务器压力,提高系统并发量, 还可以通过心跳检测的方式,判断应用服务器当前是否可以正常工作,如果服务器宕掉,自动将请求发送到其他应用服务器。

两台Linux服务器的Nginx配置参看如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
upstream gitlib {
server 192.168.1.106:8088;
server 192.168.1.107:8088;
}

server {
listen 80;
server_name *.gitlib.com;

location / {
access_log off;
proxy_pass http://gitlib;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}

配置Keepalived高可用

由于Keepalived只检测本机和他机Keepalived是否正常并实现VIP的漂移,而如果本机nginx出现故障不会则不会漂移VIP。所以需要编写脚本来判断本机nginx是否正常,如果发现NginX不正常,重启之。等待2秒再次校验,仍然失败则不再尝试,关Keepalived,其他主机此时会接管VIP。

Nginx检查脚本: check_nginx_pid.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/usr/sbin/nginxd start #启动nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败
service keepalived stop
fi
fi

keepalive.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
! Configuration File for keepalived

global_defs {
notification_email {
}
notification_email_from ravior@gitlib.com
smtp_server smtp.qq.com
smtp_connect_timeout 30
router_id nginx_master
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}

vrrp_script chk_nginx_status {
script "/home/gitlib/shell/check_nginx_pid.sh" #监控脚本
interval 2 # 监控脚本执行时间间隔
weight 2 # 权重
}

vrrp_instance VI_1 {
state BACKUP
interface enp0s3
virtual_router_id 51
priority 10
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx_status # 调用检测脚本
}
virtual_ipaddress {
192.168.1.109/24 # 设置虚拟IP
}
}

配置完成之后,重启Nginx/Keepalived, 即可实现双机热备。可以通过手动关闭Nginx模拟Nginx故障,观察VIP是否会出现漂移。

有用就打赏一下作者吧!