高可用性探戈:为什么要费心?

想象一下:凌晨三点,你的主服务器突然罢工,宛如铅球般迅速坠落。如果没有适当的高可用性设置,你将面临巨大的麻烦。这时,我们的动态二人组登场了:

  • 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
    }
}

这里的主要区别在于statepriority设置。Node1被设置为MASTER,优先级更高,而node2是BACKUP,优先级较低。

步骤4:启动演出

是时候让我们的作品活起来了!在两个节点上运行:


sudo systemctl start nginx
sudo systemctl start keepalived

如果一切顺利,你现在应该有一个功能正常的高可用性设置。虚拟IP(在我们的例子中是192.168.1.100)将被分配给主节点。

步骤5:测试 - 因为信任,但要验证

现在是见证真相的时刻。让我们确保我们的设置可以处理服务器宕机:

  1. 再次检查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

现在,去征服那些正常运行时间的指标吧!记住,在高可用性的世界里,偏执只是良好的计划。