前面提到nginx可以实现后端服务的负载均衡,来使得后端的服务能力得到水平的扩展。但是怎么保证nginx的高可用呢,如果nginx挂了,还怎么持续提供服务呢?今天我们就来讲一讲Keepalived实现高可用的方案。
简单来说,高可用就是让你的网站服务时刻在线,即使出现硬件故障、网络波动等问题,也能快速恢复,保证用户访问不受影响。
Keepalived 是一款轻量级的高可用解决方案,它基于 VRRP 协议(虚拟路由冗余协议),可以实现 IP 漂移,即当主服务器出现故障时,备用服务器会自动接管虚拟 IP,继续提供服务,从而保证服务的高可用性。
Keepalived架构中,我们至少需要两台服务器部署Nginx和Keepalived:
主服务器 (Master): 正常情况下,用户访问的流量会指向主服务器的虚拟 IP,由主服务器的 Nginx 提供服务。
备用服务器 (Backup): 当主服务器出现故障时,Keepalived 会检测到并将虚拟 IP 漂移到备用服务器,由备用服务器的 Nginx 接管服务。
架构方案如下图所示
准备工作:
两台服务器:192.168.1.101(主)、192.168.1.102(备)
虚拟 IP:192.168.1.100
操作系统:CentOS 7.x
1. 安装Keepalived
yum install keepalived -y
2. 配置Keepalived
编辑主服务器的 Keepalived 配置文件 /etc/keepalived/keepalived.conf
:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.100
}
}
state MASTER
:表示这台服务器是主服务器。
priority 100
:优先级是 100,数字越大优先级越高。
virtual_ipaddress
:虚拟 IP 是 192.168.1.100。
编辑备用服务器的 Keepalived 配置文件 /etc/keepalived/keepalived.conf
:
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.100
}
}
state BACKUP
:表示这台是备用服务器。
priority 90
:优先级比主服务器低。
保存配置后,启动 Keepalived:
sudo systemctl start keepalived
3. 安装并配置nginx
yum install nginx
在两台服务器上,配置 Nginx 都是一样的。编辑 Nginx 配置文件(通常在/etc/nginx/nginx.conf
),写一个简单的配置:
server {
listen 80;
server_name example.com;
location / {
return 200 "Hello, I'm server $hostname\n";
}
}
保存配置后,启动 Nginx:
sudo systemctl start nginx
1. 访问虚拟 IP
在浏览器中访问虚拟 IP(192.168.1.100),应该能看到主服务器返回的消息,比如:
Hello, I'm server master
2. 模拟主服务器故障
停止主服务器的 Keepalived 服务:
sudo systemctl stop keepalived
再次访问虚拟 IP,你会发现流量已经切换到了备用服务器,返回的消息变成了:
Hello, I'm server backup
在实际生产环境中,我们不能只靠手动停止 Keepalived 来模拟故障。Keepalived 可以配置健康检查,自动检测 Nginx 是否正常运行。如果 Nginx 挂了,Keepalived 会自动切换到备用服务器。
1. 配置健康检查
在主服务器和备用服务器的 Keepalived 配置文件中,添加以下内容:
vrrp_script chk_nginx {
script "killall -0 nginx"
interval 2
weight 2
}
track_script {
chk_nginx
}
killall -0 nginx
:检查 Nginx 进程是否存在。
interval 2
:每 2 秒检查一次。
weight 2
:如果检查失败,优先级降低 2。
在主服务器上,手动停止 Nginx:
sudo systemctl stop nginx
你会发现 Keepalived 检测到 Nginx 停止后,会自动将流量切换到备用服务器。
通过上面的步骤,我们成功搭建了一个 Nginx + Keepalived 的高可用集群。用户访问虚拟 IP 时,流量会在主服务器和备用服务器之间自动切换,保证服务一直可用。
在实际部署中,你还可以根据需求扩展,比如增加更多的备用服务器,或者结合负载均衡让多台服务器分担流量。
获取更多内容,关注公众号:全栈程序员老马