返回介绍

14.2 搭建 HAProxy+Keepalived 高可用负载均衡系统

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

14.2.1 搭建环境描述

下面介绍如何通过 Keepalived 搭建高可用的 HAProxy 负载均衡集群系统,在进行实例介绍之前先进行约定:操作系统采用 CentOS6.3,地址规划如表 14.1 所示。

表 14-1 地址规划

整个高可用 HAProxy 集群系统的拓扑结构如图 14-3 所示。

图 14-3 高可用 HAProxy 集群系统拓扑结构

此结构要实现的功能是:通过 HAProxy 实现三个站点的负载均衡,即当用户通过域名 www.zb.com 访问网站时,HAProxy 要将请求发送到 webapp1 主机;当用户通过域名 static.zb.com 访问网站时,HAProxy 要将请求发送到 webapp2 主机;当用户通过域名 video.zb.com 访问网站时,HAProxy 要将请求发送到 webapp3 主机;当主 HAproxyServer 发送故障后,能立刻将负载均衡服务切换到备用 HAProxy Server 上。

为了实现 HAProxy 的高可用功能,这里采用 Keepalived 作为高可用监控软件,下面依次介绍高可用 HAProxy 的搭建过程。

14.2.2 配置 HAProxy 负载均衡服务器

关于 HAProxy 的安装、配置以及日志支持,前面章节已经做过详细介绍,这里不再重复介绍。首先在主、备 HAProxy 服务器上安装 HAProxy,并且配置日志支持,然后进入 HAProxy 的配置阶段,这里仅仅给出 HAProxy 的配置文件,主、备两个节点的 haproxy.conf 文件内容完全相同,这里假定 HAProxy 的安装路径为/usr/local/haproxy。/usr/local/haproxy/conf/haproxy.conf 文件内容如下:

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 192.168.66.10:80
         mode    http
         option  httplog
         option  forwardfor
         log     global
        acl host_www            hdr_dom(host)   -i      www.zb.com       
        acl host_static         hdr_dom(host)   -i      static.zb.com
        acl host_video          hdr_dom(host)   -i      video.zb.com
        use_backend server_www  if      host_www    
        use_backend server_static       if      host_static
        use_backend server_video        if      host_video
backend server_www
        mode    http
        option          redispatch
        option          abortonclose
        balance         roundrobin
        option          httpchk GET /index.jsp
        server          webapp1 192.168.66.20:80 weight 6 check inter 2000 rise 2 fall 3
backend server_static
        mode    http
        option          redispatch
        option          abortonclose
        balance         roundrobin
        option          httpchk GET /index.html
        server          webapp2 192.168.66.21:80 weight 6 check inter 2000 rise 2 fall 3
backend server_video
        mode    http
        option          redispatch
        option          abortonclose
        balance         roundrobin
        option          httpchk GET /index.html
        server          webapp3 192.168.66.22:80 weight 6 check inter 2000 rise 2 fall 3

在这个 HAProxy 配置中,通过 ACL 规则将三个站点分别转向 webapp1、webapp2 和 webapp3 三个服务节点上,这样变相地实现了负载均衡。三个后端实例 server_www、server_static 和 server_video 虽然只有一台服务器,但是如果站点访问量增加,可以很容易地增加后端服务器,实现真正的负载均衡。

将 haproxy.conf 文件复制到备用的 backup-haproxy 服务器上,然后在主、备 HAProxy 上依次启动 HAProxy 服务。为了方便以后维护,最后将 HAProxy 的服务管理通过一个脚本来实现。HAProxy 管理脚本在第 12 章已经做过介绍,这里不再说明,将 HAProxy 管理脚本加到服务器自启动中,保证 HAProxy 服务开机就能运行。

14.2.3 配置主、备 Keepalived 服务器

依次在主、备两个节点上安装 Keepalived。关于 Keepalived 的安装这里不再介绍,直接给出配置好的 keepalived.conf 文件内容。在 haproxy-server 主机上,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"     #
设置探测 HAProxy
服务运行状态的方式,这里的“killall 
                                #-0 haproxy
”仅仅是检测 HAProxy
服务状态
    interval 2
    weight 21
    }
vrrp_instance HAProxy_HA {
    state BACKUP                        #
在 haproxy-server
和 backup-haproxy
上均配置为 BACKUP
    interface eth0
    virtual_router_id 80
    priority 100
    advert_int 2
    nopreempt   #
不抢占模式,只在优先级高的机器上设置即可,优先级低的机器可不设置
    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 falut"
    track_script {
    check_haproxy
    }
    virtual_ipaddress {
        192.168.66.10/24 dev eth0       #HAProxy
的对外服务 IP
,即 VIP
    }
}

其中,/etc/keepalived/mail_notify.py 文件是一个邮件通知程序,当 Keepalived 进行 Master、Backup、Fault 状态切换时,将会发送通知邮件给运维人员,这样可以及时了解高可用集群的运行状态,以便在适当的时候人为介入处理故障。mail_notify.py 文件的内容如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
reload(sys)
from email.MIMEText import MIMEText
import smtplib
import MySQLdb
sys.setdefaultencoding('utf-8')
import socket, fcntl, struct
def send_mail(to_list,sub,content):
    mail_host="smtp.163.com"    #
设置验证服务器,这里以 163.com
为例
    mail_user="username"        #
设置验证用户名
    mail_pass="xxxxxx"          #
设置验证口令
    mail_postfix="163.com"      #
设置邮箱的后缀
    me=mail_user+"<"+mail_user+"@"+mail_postfix+">"
    msg = MIMEText(content)
    msg['Subject'] = sub
    msg['From'] = me
    msg['To'] = to_list
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(me, to_list, msg.as_string())
        s.close()
        return True
    except Exception, e:
        print str(e)
        return False
def get_local_ip(ifname = 'eth0'):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    inet = fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))
    ret = socket.inet_ntoa(inet[20:24])
    return ret
if sys.argv[1]!="master" and sys.argv[1]!="backup" and sys.argv[1]!="fault":
        sys.exit()
else:
        notify_type = sys.argv[1]
if __name__ == '__main__':
strcontent = get_local_ip()+ " " +notify_type+"
状态被激活,请确认 HAProxy
服务运行状态!"
#
下面这段是设置接收报警信息的邮件地址列表,可设置多个
    mailto_list = ['xxxxxx@163.com', xxxxxx@qq.com']
for mailto in mailto_list:
        send_mail(mailto, "HAProxy
状态切换报警", strcontent.encode('utf-8'))

最后,将 keepalived.conf 文件和 mail_notify.py 文件复制到 backup-haproxy 服务器上对应的位置,然后将 keepalived.conf 文件中 priority 值修改为 90,由于配置的是不抢占模式,因此,还需要在 backup-haproxy 服务器上去掉 nopreempt 选项。

完成所有配置后,分别在 haproxy-server 和 backup-haproxy 主机上依次启动 HAProxy 服务和 Keepalived 服务。注意,这里一定要先启动 HAProxy 服务,因为 Keepalived 服务在启动的时候会自动检测 HAProxy 服务是否正常,如果发现 HAProxy 服务没有启动,那么主、备 Keepalived 将自动进入 Fault 状态。在依次启动服务后,在正常情况下 VIP 地址应该运行在 haproxy-server 服务器上,通过命令“ip a”可以查看 VIP 是否已经正常加载。

发布评论

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