Linux运维:搭建HAProxy+Keepalived高可用负载均衡系统

Posted 计算机与网络安全

tags:

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

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

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

ID:Computer-network


1、搭建环境描述



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

图1  高可用HAProxy集群系统拓扑结构


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


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


2、配置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.html

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的服务管理通过一个脚本来实现。

3、配置主、备Keepalived服务器


依次在主、备两个节点上安装Keepalived。在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 LVS_DEVEL

}            

vrrp_script check_haproxy {

script "killall -0 haproxy"

interval 2

weight 21

}            

vrrp_instance HAProxy_HA {

state 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.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

}

}


其中,/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"

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选项。



ID:Computer-network


【推荐书籍】