- 前言
- 为什么要写这本书
- 读者对象
- 如何阅读本书
- 勘误和支持
- 致谢
- 第一部分 安全运维篇
- 第 1 章 Linux 服务器安全运维
- 第 2 章 Linux 网络安全运维
- 第 3 章 数据安全工具 DRBD、extundelete
- 第二部分 运维故障排查篇
- 第 4 章 Linux 系统运维故障排查思路
- 第 5 章 Linux 故障排查案例实战
- 第三部分 自动化运维篇
- 第 6 章 轻量级运维利器 pssh、pdsh 和 mussh
- 第 7 章 分布式监控系统 Ganglia
- 第 8 章 基于 nagios 的分布式监控报警平台 Centreon
- 第 9 章 通过 Ganglia 与 Centreon 构建智能化监控报警平台
- 第四部分 集群架构篇
- 第 10 章 高性能 Web 服务器 Nginx
- 第 11 章 高性能集群软件 Keepalived
- 第 12 章 千万级高并发负载均衡软件 HAProxy
- 第 13 章 构建高性能的 MySQL 集群系统
- 第 14 章 高性能负载均衡集群软件 HAProxy
14.4 构建双主高可用的 HAProxy 负载均衡系统
在上面介绍的 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论