- 前言
- 为什么要写这本书
- 读者对象
- 如何阅读本书
- 勘误和支持
- 致谢
- 第一部分 安全运维篇
- 第 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.2 搭建 HAProxy+Keepalived 高可用负载均衡系统
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 是否已经正常加载。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论