Linux服务器高可用:Keepalived+HAProxy深度配置与优化


Linux服务器高可用:Keepalived+HAProxy深度配置与优化

想象一下这样的场景:你的电商网站正在进行促销活动,流量激增。突然,你的Web服务器宕机了!所有的用户都无法访问,订单丢失,客户抱怨,简直是一场噩梦。为了避免这种情况,我们需要构建高可用的服务器架构。而KeepalivedHAProxy正是构建这种架构的利器。

Keepalived与HAProxy:天生一对

Keepalived是一个高可用解决方案,它通过VRRP协议实现服务器的故障转移。简单来说,它会选举一个主服务器(MASTER)和一个或多个备份服务器(BACKUP)。当主服务器宕机时,备份服务器会自动接管其IP地址,从而保证服务的连续性。

HAProxy则是一个高性能的反向代理和负载均衡器。它可以将用户请求分发到多个后端服务器,从而提高网站的性能和可用性。它支持多种负载均衡算法,可以根据不同的需求选择最合适的算法。

KeepalivedHAProxy结合起来,就可以构建一个高可用且高性能的服务器架构。Keepalived负责服务器的故障转移,HAProxy负责请求的负载均衡。当主服务器宕机时,Keepalived会将VIP(虚拟IP)切换到备份服务器,HAProxy会继续将请求分发到正常的后端服务器。

Keepalived的配置与优化

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 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

这个配置定义了一个VRRP实例,其中:

  • state:指定服务器的角色,可以是MASTERBACKUP
  • interface:指定Keepalived监听的网络接口。
  • virtual_router_id:指定VRRP实例的ID,必须在所有服务器上保持一致。
  • priority:指定服务器的优先级,优先级高的服务器会成为MASTER。
  • advert_int:指定VRRP通告的间隔时间,单位是秒。
  • authentication:指定认证方式和密码,用于防止恶意节点加入VRRP组。
  • virtual_ipaddress:指定虚拟IP地址,也就是对外提供服务的IP地址。

优化Keepalived配置的关键在于合理设置priorityadvert_int 优先级越高,成为MASTER的可能性就越大。通告间隔时间越短,故障转移的速度就越快,但也会增加网络负担。通常,可以将advert_int设置为1或2,并根据服务器的性能和网络状况调整priority

还可以使用vrrp_script来监控服务器的状态,并在服务器出现故障时降低优先级,从而触发故障转移。例如:


vrrp_script chk_http {
    script "/etc/keepalived/check_http.sh"
    interval 2
    weight -20
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    ...
    track_script {
        chk_http
    }
}

这个配置会每2秒执行一次/etc/keepalived/check_http.sh脚本,如果脚本返回非零值,则将服务器的优先级降低20。fall 2表示连续2次检测失败才降低优先级,rise 2表示连续2次检测成功才恢复优先级。

HAProxy的配置与优化

HAProxy的配置主要涉及到haproxy.cfg文件。以下是一个简单的配置示例:


frontend http_front
    bind *:80
    mode http
    default_backend http_back

backend http_back
    balance roundrobin
    server web1 192.168.1.101:80 check
    server web2 192.168.1.102:80 check

这个配置定义了一个前端http_front和一个后端http_back,其中:

  • frontend:定义前端监听的IP地址和端口,以及默认的后端。
  • backend:定义后端服务器的列表和负载均衡算法。
  • balance:指定负载均衡算法,常用的有roundrobin(轮询)、leastconn(最少连接)、source(基于源IP地址)等。
  • server:指定后端服务器的IP地址和端口,以及健康检查参数。

优化HAProxy配置的关键在于选择合适的负载均衡算法和健康检查方式。 轮询算法适用于服务器性能相近的情况,最少连接算法适用于服务器性能差异较大的情况,基于源IP地址的算法可以实现会话保持。

健康检查可以确保HAProxy只将请求分发到正常的后端服务器。常用的健康检查方式有check(TCP连接检查)和httpcheck(HTTP请求检查)。HTTP请求检查可以更准确地判断服务器是否正常工作,例如:


backend http_back
    balance roundrobin
    server web1 192.168.1.101:80 check inter 5000 rise 2 fall 2 httpcheck GET /health.html
    server web2 192.168.1.102:80 check inter 5000 rise 2 fall 2 httpcheck GET /health.html

这个配置会每5秒向后端服务器发送一个GET /health.html请求,如果请求返回200 OK,则认为服务器正常,否则认为服务器故障。rise 2fall 2的含义与Keepalived中的vrrp_script类似。

Keepalived+HAProxy的集成与实战

要将KeepalivedHAProxy集成起来,需要进行以下步骤:

  1. 在所有服务器上安装KeepalivedHAProxy
  2. 配置Keepalived,指定主服务器和备份服务器,并配置虚拟IP地址。
  3. 配置HAProxy,指定后端服务器的列表和负载均衡算法。
  4. 配置Keepalivedvrrp_script,监控HAProxy的状态。
  5. 启动KeepalivedHAProxy服务。

例如,可以在Keepalivedvrrp_script中检查HAProxy是否正在运行:


vrrp_script chk_haproxy {
    script "pidof haproxy"
    interval 2
    weight -10
    fall 2
    rise 2
}

如果HAProxy没有运行,则pidof haproxy会返回空值,从而降低服务器的优先级,触发故障转移。

在实际应用中,还需要考虑以下因素:

  • 会话保持: 如果应用程序需要会话保持,可以使用source负载均衡算法,或者使用Cookie来实现会话保持