返回介绍

14.4 构建双主高可用的 HAProxy 负载均衡系统

发布于 2025-04-21 21:33:26 字数 10725 浏览 0 评论 0 收藏

在上面介绍的 HAProxy 高可用负载均衡集群架构中,虽然通过 Keepalived 实现了 HAProxy 的高可用,但是严重浪费了服务器资源,因为在一主一备的 Keepalived 环境中,只有主节点处于工作状态,而备用节点则一直处于空闲等待状态,仅当主节点出现问题时备用节点才能开始工作。对于并发量比较大的 Web 应用系统来说,主节点可能会非常繁忙,而备用节点则十分空闲,这种服务器资源分布不均的问题,也是在做应用架构设计时必须要考虑的问题。对于一主一备资源不均衡的问题,可以通过双主互备的方式进行负载分流,下面就详细讲述双主互备的高可用集群系统是如何实现的。

14.4.1 系统架构图与实现原理

为了能充分利用服务器资源并将负载进行分流,可以在一主一备的基础上构建双主互备的高可用 HAProxy 负载均衡集群系统。双主互备的集群架构如图 14-5 所示。

在这个架构中,要实现的功能是:通过 haproxy1 服务器将 www.tb.com 的访问请求发送到 webapp1 和 webapp2 两台主机上,实现 www.tb.com 的负载均衡;通过 haproxy2 将 img.tb.com 的访问请求发送到 webimg1 和 webimg2 两台主机上,实现 img.tb.com 的负载均衡;同时,如果 haproxy1 或 haproxy2 任何一台服务器出现故障,都会将用户访问请求发送到另一台健康的负载均衡节点,进而继续保持两个网站的负载均衡。

在进行实例介绍之前进行约定:操作系统采用 CentOS6.3,地址规划如表 14-2 所示。

图 14-5 HAProxy 双主互备集群架构

表 14-2 双主高可用负载均衡地址规划

注意,为了保证 haproxy1 和 haproxy2 服务器资源得到充分利用,这里对访问进行了分流操作,需要将 www.tb.com 的域名解析到 192.168.66.10 这个 IP 上,将 img.tb.com 域名解析到 192.168.66.20 这个 IP 上。

14.4.2 安装并配置 HAProxy 集群系统

在主机名为 haproxy1 和 haproxy2 的节点依次安装 HAProxy 并配置日志支持,在此略过这个过程。HAProxy 的安装路径仍然指定为/usr/local/haproxy,两个节点的 haproxy.cfg 文件内容完全相同,这里给出配置好的 haproxy.cfg 文件,内容如下:

global
        log 127.0.0.1 local0 info
        maxconn 4096
        user nobody
        group nobody
        daemon
        nbproc 1
        pidfile /usr/local/haproxy/logs/haproxy.pid
defaults
        mode http
        retries 3
        timeout connect 5s
        timeout client 30s
        timeout server 30s
        timeout check 2s
listen admin_stats
        bind 0.0.0.0:19088
        mode http
        log 127.0.0.1 local0 err
        stats refresh 30s
        stats uri /haproxy-status
        stats realm welcome login\ Haproxy
        stats auth admin:xxxxxx
        stats hide-version
        stats admin if TRUE
frontend www
         bind *:80
         mode    http
         option  httplog
         option  forwardfor
         log     global
        acl host_www            hdr_dom(host)   -i      www.tb.com       
        acl host_img            hdr_dom(host)   -i      img.tb.com
        use_backend     server_www              if host_www
        use_backend     server_img              if host_img
backend server_www
        mode            http
        option          redispatch
        option          abortonclose
        balance         roundrobin
        option          httpchk HEAD /index.php
        server          webapp1 192.168.66.31:80 weight 6 check inter 2000 rise 2 fall 3
        server          webapp2 192.168.66.32:80 weight 6 check inter 2000 rise 2 fall 3
backend server_img
        mode            http
        option          redispatch
        option          abortonclose
        balance         roundrobin
        option          httpchk HEAD /index.html
        server webimg1 192.168.66.33:80 weight 6 check inter 2000 rise 2 fall 3
        server webimg2 192.168.66.34:80 weight 6 check inter 2000 rise 2 fall 3

在这个 HAProxy 配置中,通过 ACL 规则将 www.tb.com 站点转到 webapp1、webapp2 两个后端节点,将 img.tb.com 站点转到 webimg1 和 webimg2 两个后端服务节点,分别实现负载均衡。

最后将 haproxy.conf 文件分别复制到 haproxy1 和 haproxy2 两台服务器上,然后在两个负载均衡器上依次启动 HAProxy 服务。

14.4.3 安装并配置双主的 Keepalived 高可用系统

依次在主、备两个节点上安装 Keepalived。关于 Keepalived 的安装这里略过,在 haproxy1 主机和 haproxy2 主机上,keepalived.conf 的内容基本相同,不同的部分已经在后面添加了注释,下面直接给出配置好的 keepalived.conf 文件内容:

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id haproxy_DEVEL
}
vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 2
    }
vrrp_instance haproxy_ha1 {
    state MASTER                #
在 haproxy2
主机上,此处为 BACKUP
    interface eth0
    virtual_router_id 80        #
在一个实例下,virtual_router_id 
是唯一的,因此在 haproxy2
主
                                #
机上,此处 virtual_router_id
也必须为 80
    priority 100                #
在 haproxy2
主机上,priority
值为 80
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    notify_master "/etc/keepalived/mail_notify.py master "
    notify_backup "/etc/keepalived/mail_notify.py backup"
    notify_fault "/etc/keepalived/mail_notify.py fault"
    track_script {
    check_haproxy
    }
    virtual_ipaddress {
        192.168.66.10/24 dev eth0
    }
}
vrrp_instance haproxy_ha2 {
    state BACKUP                #
在 haproxy2
主机上,此处为 MASTER
    interface eth0
    virtual_router_id 81        #
在 haproxy2
主机上,此处 virtual_router_id
也必须为 81
    priority 80                 #
在 haproxy2
主机上,priority
值为 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    notify_master "/etc/keepalived/mail_notify.py master "
    notify_backup "/etc/keepalived/mail_notify.py backup"
    notify_fault "/etc/keepalived/mail_notify.py fault"
    track_script {
    check_haproxy
    }
    virtual_ipaddress {
        192.168.66.20/24 dev eth0
    }
}

在双主互备的配置中,有两个 VIP 地址,在正常情况下,192.168.66.10 将自动加载到 haproxy1 主机上,而 192.168.66.20 将自动加载到 haproxy2 主机上。这里要特别注意的是,haproxy1 和 haproxy2 两个节点上 virtual_router_id 的值要互不相同,并且 MASTER 角色的 priority 值要大于 BACKUP 角色的 priority 值。

在完成所有配置修改后,依次在 haproxy1 和 haproxy2 两个节点启动 Keepalived 服务,并观察 VIP 地址是否正常加载到对应的节点上。

14.4.4 测试双主高可用的 HAProxy 负载均衡集群系统

关于负载均衡功能的测试前面章节已经介绍过多次,这里仅测试双主互备的 HAProxy 负载均衡系统的启动和高可用切换过程。

在 haproxy1 和 haproxy2 节点依次启动 HAProxy 服务和 Keepalived 服务后,首先观察 haproxy1 节点 Keepalived 的启动日志,信息如下:

Apr  5 01:16:22 haproxy1 Keepalived_healthcheckers[29104]: Opening file '/etc/
keepalived/keepalived.conf'.
Apr  5 01:16:22 haproxy1 Keepalived_healthcheckers[29104]: Configuration is using :
7818 Bytes
Apr  5 01:16:22 haproxy1 Keepalived_vrrp[29105]: VRRP_Instance(HAProxy_HA2)
Entering BACKUP STATE
Apr  5 01:16:22 haproxy1 Keepalived_healthcheckers[29104]: Using LinkWatch kernel
netlink reflector...
Apr  5 01:16:22 haproxy1 Keepalived_vrrp[29105]: VRRP sockpool: [ifindex(2),proto(112), 
unicast(0), fd(10,11)]
Apr  5 01:16:22 haproxy1 Keepalived_vrrp[29105]: VRRP_Script(check_haproxy)
succeeded
Apr  5 01:16:24 haproxy1 Keepalived_vrrp[29105]: VRRP_Instance(HAProxy_HA1)
Transition to MASTER STATE
Apr  5 01:16:26 haproxy1 Keepalived_vrrp[29105]: VRRP_Instance(HAProxy_HA1)
Entering MASTER STATE
Apr  5 01:16:26 haproxy1 Keepalived_vrrp[29105]: VRRP_Instance(HAProxy_HA1)
setting protocol VIPs.
Apr  5 01:16:26 haproxy1 Keepalived_vrrp[29105]: VRRP_Instance(HAProxy_HA1) 
Sending gratuitous ARPs on eth0 for 192.168.66.10
Apr  5 01:16:26 haproxy1 Keepalived_healthcheckers[29104]: Netlink reflector
reports IP 192.168.66.10 added
Apr  5 01:16:27 haproxy1 ntpd[29393]: Listening on interface #65 eth0,
192.168.66.10#123 Enabled
Apr  5 01:16:31 haproxy1 Keepalived_vrrp[29105]: VRRP_Instance(HAProxy_HA1)
Sending gratuitous ARPs on eth0 for 192.168.66.10

从输出可知,Keepalived 启动了 HAProxy_HA1 和 HAProxy_HA2 两个实例,在检测到 HAProxy 服务运行正常后,HAProxy_HA1 实例进入 MASTER 状态,而 HAProxy_HA2 自动进入 BACKUP 状态。

接着在 haproxy2 节点查看 Keepalived 的启动日志,信息如下:

Apr  5 01:16:24 haproxy2 Keepalived_vrrp[24550]: Opening file '/etc/keepalived/
keepalived.conf'.
Apr  5 01:16:24 haproxy2 Keepalived_vrrp[24550]: Configuration is using : 70726 Bytes
Apr  5 01:16:24 haproxy2 Keepalived_vrrp[24550]: Using LinkWatch kernel netlink
reflector...
Apr  5 01:16:24 haproxy2 Keepalived_vrrp[24550]: VRRP_Instance(HAProxy_HA1)
Entering BACKUP STATE
Apr  5 01:16:24 haproxy2 Keepalived_vrrp[24550]: VRRP sockpool: [ifindex(2),
proto(112), unicast(0), fd(10,11)]
Apr  5 01:16:24 haproxy2 Keepalived_healthcheckers[24549]: Using LinkWatch kernel
netlink reflector...
Apr  5 01:16:24 haproxy2 Keepalived_vrrp[24550]: VRRP_Script(check_haproxy) succeeded
Apr  5 01:16:26 haproxy2 Keepalived_vrrp[24550]: VRRP_Instance(HAProxy_HA2)
Transition to MASTER STATE
Apr  5 01:16:28 haproxy2 Keepalived_vrrp[24550]: VRRP_Instance(HAProxy_HA2)
Entering MASTER STATE
Apr  5 01:16:28 haproxy2 Keepalived_vrrp[24550]: VRRP_Instance(HAProxy_HA2) 
setting protocol VIPs.
Apr  5 01:16:28 haproxy2 Keepalived_vrrp[24550]: VRRP_Instance(HAProxy_HA2)
Sending gratuitous ARPs on eth0 for 192.168.66.20
Apr  5 01:16:28 haproxy2 Keepalived_healthcheckers[24549]: Netlink reflector
reports IP 192.168.66.20 added
Apr  5 01:16:28 haproxy2 avahi-daemon[1207]: Registering new address record for
192.168.66.20 on eth0.IPv4.
Apr  5 01:16:33 haproxy2 Keepalived_vrrp[24550]: VRRP_Instance(HAProxy_HA2) 
Sending gratuitous ARPs on eth0 for 192.168.66.20

从输出可知,haproxy2 节点的 Keepalived 也启动了 HAProxy_HA1 和 HAProxy_HA2 两个实例,在检测到 HAProxy 服务运行正常后,HAProxy_HA1 实例进入 BACKUP 状态,而 HAProxy_HA2 自动进入 MASTER 状态。

通过查看 haproxy1 和 haproxy2 中 Keepalived 日志的运行状态,可以发现完全符合双主互备高可用集群的运行原理。

下面测试一下双主互备的故障切换功能,这里为模拟故障,将 haproxy1 节点上 HAProxy 服务关闭,然后在 haproxy1 节点观察 Keepalived 的启动日志,信息如下:

Apr  5 01:19:16 haproxy1 Keepalived_vrrp[29105]: VRRP_Script(check_haproxy) failed
Apr  5 01:19:18 haproxy1 Keepalived_vrrp[29105]: VRRP_Instance(HAProxy_HA1)
Entering FAULT STATE
Apr  5 01:19:18 haproxy1 Keepalived_vrrp[29105]: VRRP_Instance(HAProxy_HA1) 
removing protocol VIPs.
Apr  5 01:19:18 haproxy1 Keepalived_vrrp[29105]: VRRP_Instance(HAProxy_HA1) Now 
in FAULT state
Apr  5 01:19:18 haproxy1 Keepalived_healthcheckers[29104]: Netlink reflector
reports IP 192.168.66.10 removed

从输出日志可知,HAProxy_HA1 实例在检测 HAProxy 服务失败后,自动进入 FAULT 状态,同时释放了 VIP 地址 192.168.66.10。

接着查看下 haproxy2 节点中 Keepalived 日志的运行状态,信息如下:

Apr  5 01:19:18 haproxy2 Keepalived_vrrp[24550]: VRRP_Instance(HAProxy_HA1) 
Transition to MASTER STATE
Apr  5 01:19:20 haproxy2 Keepalived_vrrp[24550]: VRRP_Instance(HAProxy_HA1)
Entering MASTER STATE
Apr  5 01:19:20 haproxy2 Keepalived_vrrp[24550]: VRRP_Instance(HAProxy_HA1)
setting protocol VIPs.
Apr  5 01:19:20 haproxy2 Keepalived_vrrp[24550]: VRRP_Instance(HAProxy_HA1)
Sending gratuitous ARPs on eth0 for 192.168.66.10
Apr  5 01:19:20 haproxy2 Keepalived_healthcheckers[24549]: Netlink reflector
reports IP 192.168.66.10 added
Apr  5 01:19:20 haproxy2 avahi-daemon[1207]: Registering new address record for
192.168.66.10 on eth0.IPv4.
Apr  5 01:19:25 haproxy2 Keepalived_vrrp[24550]: VRRP_Instance(HAProxy_HA1) 
Sending gratuitous ARPs on eth0 for 192.168.66.10

从输出日志可知,haproxy2 节点接管了 HAProxy_HA1 实例,并将此实例切换到 MASTER 状态,然后绑定了 VIP 地址 192.168.66.10。

从切换过程看,Keepalived 运行完全正常。类似的测试还可以在 haproxy2 节点关闭 HAProxy 服务,测试过程与上面介绍过的完全相同,因此不再重复讲述。至此,基于 HAProxy 的双主互备高可用负载均衡集群方案讲解完毕。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。