Linux运维:构建双主高可用的HAProxy负载均衡系统

Posted 计算机与网络安全

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux运维:构建双主高可用的HAProxy负载均衡系统相关的知识,希望对你有一定的参考价值。

一次性付费进群,长期免费索取教程,没有付费教程。

 教程列表  见微信公众号底部菜单 |   本文底部有推荐书籍 

ID:Computer-network


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


1、系统架构图与实现原理


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

图1  HAProxy双主互备集群架构


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



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


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.zb.com

acl host_img hdr_dom(host) -i img.zb.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 GET /index.html

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服务。


3、安装并配置双主的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 LVS_DEVEL

}           

vrrp_script check_haproxy {

script "killall -0 haproxy"

interval 2

}            

vrrp_instance HAProxy_HA {

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.sh master"

notify_backup "/etc/keepalived/mail_notify.sh backup"

notify_fault "/etc/keepalived/mail_notify.sh 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.sh master"

notify_backup "/etc/keepalived/mail_notify.sh backup"

notify_fault "/etc/keepalived/mail_notify.sh fault"            

track_script {

check_haproxy

}            

virtual_ipaddress {

192.168.66.20/24 dev eth0

}

}




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


这里仅测试双主互备的HAProxy系统的启动和高可用切换过程。


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


Jul 25 10:06:34 haproxy1 Keepalived_vrrp[33167]: VRRP_Instance(HAProxy_HA) Transition to MASTER STATE

Jul 25 10:06:36 haproxy1 Keepalived_vrrp[33167]: VRRP_Instance(HAProxy_HA) Entering MASTER STATE

Jul 25 10:06:36 haproxy1 Keepalived_vrrp[33167]: VRRP_Instance(HAProxy_HA) setting protocol VIPs.

Jul 25 10:06:36 haproxy1 Keepalived_vrrp[33167]: VRRP_Instance(HAProxy_HA) Sending gratuitous ARPs on eth0 for 192.168.66.10

Jul 25 10:06:36 data-1-1 Keepalived_healthcheckers[33166]: Netlink reflector reports IP 192.68.66.10 added

Jul 25 10:06:53 haproxy1 Keepalived_vrrp[33167]: VRRP_Instance(HAProxy_HA2) Received higher prio advert

Jul 25 10:06:53 haproxy1 Keepalived_vrrp[33167]: VRRP_Instance(HAProxy_HA2) Entering BACKUP STATE


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


Jul 25 14:42:09 haproxy1 Keepalived_vrrp[33167]: VRRP_Script(check_haproxy) failed

Jul 25 14:42:10 haproxy1 Keepalived_vrrp[33167]: VRRP_Instance(HAProxy_HA) Entering FAULT STATE

Jul 25 14:42:10 haproxy1 Keepalived_vrrp[33167]: VRRP_Instance(HAProxy_HA) removing protocol VIPs.

Jul 25 14:42:10 haproxy1 Keepalived_vrrp[33167]: VRRP_Instance(HAProxy_HA) Now in FAULT state

Jul 25 14:42:10 haproxy1 Keepalived_healthcheckers[33166]: Netlink reflector reports IP 192.168.66.10 removed


从切换过程看,Keepalived运行完全正常。


ID:Computer-network


【推荐书籍】