高可用性探戈:为什么要费心?
想象一下:凌晨三点,你的主服务器突然罢工,宛如铅球般迅速坠落。如果没有适当的高可用性设置,你将面临巨大的麻烦。这时,我们的动态二人组登场了:
- Keepalived:管理虚拟IP的守护者。
- Nginx:我们可靠的负载均衡器和反向代理。
它们共同确保即使一台服务器出现问题,另一台也能无缝接管。就像为你的服务器准备了替身演员——演出必须继续!
准备工作:你需要什么
在我们深入细节之前,先确保我们准备充分:
- 两台或更多服务器(我们称它们为node1和node2)
- 一个在服务器之间浮动的虚拟IP地址(VIP)
- Root权限(因为我们要做一些重要的事情)
- 对Linux和网络的基本了解(如果你知道IP是什么,那你就成功了一半)
步骤1:安装我们的明星选手
首先,让我们在两个节点上安装Nginx和Keepalived。我们假设你使用的是基于Debian的系统,因为我们得从某个地方开始。
sudo apt update
sudo apt install nginx keepalived
简单轻松,现在我们有了工具,让我们开始工作吧!
步骤2:配置Nginx - 负载均衡大师
Nginx将是我们的前线战士,分配传入请求并确保顺利进行。让我们将其设置为负载均衡器:
http {
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
这个配置告诉Nginx在我们的两个后端服务器之间分配流量。别忘了用你实际的服务器IP替换这些IP地址!
步骤3:Keepalived配置 - 高可用性木偶大师
现在是Keepalived的魔法时刻。这个家伙将管理我们的虚拟IP,并确保它始终指向健康的服务器。让我们在两个节点上配置它:
在node1(主节点)上:
vrrp_script chk_nginx {
script "pidof nginx"
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass supersecretpassword
}
virtual_ipaddress {
192.168.1.100
}
track_script {
chk_nginx
}
}
在node2(备份节点)上:
vrrp_script chk_nginx {
script "pidof nginx"
interval 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass supersecretpassword
}
virtual_ipaddress {
192.168.1.100
}
track_script {
chk_nginx
}
}
这里的主要区别在于state
和priority
设置。Node1被设置为MASTER,优先级更高,而node2是BACKUP,优先级较低。
步骤4:启动演出
是时候让我们的作品活起来了!在两个节点上运行:
sudo systemctl start nginx
sudo systemctl start keepalived
如果一切顺利,你现在应该有一个功能正常的高可用性设置。虚拟IP(在我们的例子中是192.168.1.100)将被分配给主节点。
步骤5:测试 - 因为信任,但要验证
现在是见证真相的时刻。让我们确保我们的设置可以处理服务器宕机:
- 再次检查IP分配——它应该已经移动到另一个节点!
在活动节点上,停止Nginx:
sudo systemctl stop nginx
检查哪个节点当前持有虚拟IP:
ip addr show eth0
如果一切按预期工作,恭喜你!你刚刚设置了一个基本但有效的高可用性集群。
深入探索:微调和高级概念
现在我们有了一个工作设置,让我们探索一些方法来使其更好:
1. 自定义健康检查
除了检查Nginx是否在运行,我们可以创建更复杂的健康检查:
#!/bin/bash
# /etc/keepalived/check_nginx.sh
if [ $(ps -ef | grep -v grep | grep nginx | wc -l) -eq 0 ]; then
exit 1
else
curl -s -o /dev/null http://localhost
if [ $? -eq 0 ]; then
exit 0
else
exit 1
fi
fi
更新你的Keepalived配置以使用这个脚本:
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight 2
}
2. 实现通知脚本
想知道何时发生故障转移?让我们添加一个通知脚本:
#!/bin/bash
# /etc/keepalived/notify.sh
case $1 in
"MASTER")
echo "$(date) - Became MASTER" >> /var/log/keepalived.log
# 在这里添加你的通知逻辑(例如,发送电子邮件或Slack消息)
;;
"BACKUP")
echo "$(date) - Became BACKUP" >> /var/log/keepalived.log
;;
"FAULT")
echo "$(date) - Entered FAULT state" >> /var/log/keepalived.log
;;
esac
将此添加到你的Keepalived配置中:
vrrp_instance VI_1 {
...
notify /etc/keepalived/notify.sh
...
}
3. 多个虚拟IP
需要管理多个服务?你可以设置多个虚拟IP:
vrrp_instance VI_1 {
...
virtual_ipaddress {
192.168.1.100
192.168.1.101
192.168.1.102
}
...
}
常见陷阱及如何避免
即使是最周密的计划也可能出错。以下是一些常见问题及其解决方法:
1. 分裂脑综合症
如果你的节点无法通信,它们可能都认为自己是主节点。为防止这种情况:
- 使用专用网络进行Keepalived通信
- 实施隔离机制(如STONITH - Shoot The Other Node In The Head)
2. 配置不一致
确保你的Keepalived和Nginx配置在所有节点上都是一致的。考虑使用Ansible等配置管理工具来保持一致性。
3. 防火墙问题
确保你的防火墙允许节点之间的VRRP流量(协议112):
sudo iptables -A INPUT -p vrrp -j ACCEPT
更上一层楼:容器编排
准备好迎接更大的挑战了吗?考虑将你的高可用性设置与Kubernetes等容器编排系统集成。虽然Kubernetes有自己的高可用性机制,但Keepalived仍然可以在管理集群的外部访问中发挥作用。
总结:通往五个九的道路
恭喜你!你已经迈出了实现“99.999%”正常运行时间的重要一步。记住,高可用性不是一种设置后就可以忘记的解决方案。定期测试、监控和维护对于确保你的设置保持稳健至关重要。
一些关键要点:
- 定期测试你的故障转移机制
- 监控你的Keepalived和Nginx日志以发现任何异常
- 将你的配置放入版本控制中
- 为你的团队记录你的设置和故障转移程序
有了Keepalived和Nginx,你已经做好了应对高可用性挑战的准备。祝你美梦成真,愿你的服务器永不休眠!
“避免失败的最佳方法就是不断失败。” - Netflix
现在,去征服那些正常运行时间的指标吧!记住,在高可用性的世界里,偏执只是良好的计划。