基于Keepalived+Haproxy搭建四层负载均衡器

来源:互联网 发布:加缪手记淘宝 编辑:程序博客网 时间:2024/06/07 14:28

http://blog.liuts.com/post/223/

基于Keepalived+Haproxy搭建四

层负载均衡器[原创]  不指定

刘天斯 , 2011/03/10 18:17 , Haproxy , 评论(31) , 阅读(55616) , Via 本站原创 大 | 中 | 小  
一、前言
       Haproxy是稳定、高性能、高可用性的负载均衡解决方案,支持HTTP及TCP代理后端服务器池,因支持强大灵活的7层acl规则,广泛作为HTTP反向代理。本文则详细介绍如何利用它的四层交换与Keepalived实现一个负载均衡器,适用于Socket、ICE、Mail、Mysql、私有通讯等任意TCP服务。系统架构图如下:

二、平台环境
引用

OS:Centos5.4(64X)
MASTER:192.168.0.20
BACKUP:192.168.0.21
VIP:192.168.0.100
Serivce Port:11231

三、平台安装配置
1、添加非本机IP邦定支持
引用

#vi /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind=1
#sysctl –p

2、配置平台日志支持
引用

#vi /etc/syslog.conf
添加:
local3.*        /var/log/haproxy.log
local0.*        /var/log/haproxy.log

#vi /etc/sysconfig/syslog
修改:
SYSLOGD_OPTIONS="-r -m 0"
#/etc/init.d/syslog restart

3、关闭SELINUX
引用

vi /etc/sysconfig/selinux
修改:
SELINUX=disabled
#setenforce 0

4、配置iptables,添加VRRP通讯支持
引用

iptables -A INPUT -d 224.0.0.18 -j ACCEPT

5、Keepalived的安装、配置
引用

#mkdir -p /home/install/keepalivedha
#cd /home/install/keepalivedha
#wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz
#tar zxvf keepalived-1.2.2.tar.gz
#cd keepalived-1.2.2
#./configure
#make && make install

引用

#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
#mkdir /etc/keepalived
#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
#cp /usr/local/sbin/keepalived /usr/sbin/

#vi /etc/keepalived/keepalived.conf
view plainprint?
  1. ! Configuration File for keepalived  
  2.   
  3. global_defs {  
  4.    notification_email {  
  5.          liutiansi@gmail.com  
  6.    }  
  7.    notification_email_from liutiansi@gmail.com  
  8.    smtp_connect_timeout 3  
  9.    smtp_server 127.0.0.1  
  10.    router_id LVS_DEVEL  
  11. }  
  12. vrrp_script chk_haproxy {  
  13.     script "killall -0 haproxy"  
  14.     interval 2  
  15.     weight 2  
  16. }  
  17. vrrp_instance VI_1 {  
  18.     interface eth1  
  19.     state MASTER # 从为BACKUP  
  20.     priority 101 # 从为100  
  21.     virtual_router_id 50 #路由ID,可通过#tcpdump vrrp查看。  
  22.     garp_master_delay 1 #主从切换时间,单位为秒。  
  23.   
  24.     authentication {  
  25.         auth_type PASS  
  26.         auth_pass KJj23576hYgu23IP  
  27.     }  
  28.     track_interface {  
  29.        eth0  
  30.        eth1  
  31.     }  
  32.     virtual_ipaddress {  
  33.         192.168.0.100  
  34.     }  
  35.     track_script {  
  36.         chk_haproxy  
  37.     }  
  38.   
  39.     #状态通知  
  40.     notify_master "/etc/keepalived/Mailnotify.py master"  
  41.     notify_backup "/etc/keepalived/Mailnotify.py backup"  
  42.     notify_fault "/etc/keepalived/Mailnotify.py fault"  
  43. }  

6、Haproxy的安装与配置
引用

#cd /home/install/keepalivedha
#wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.11.tar.gz
#tar -zxvf haproxy-1.4.11.tar.gz
#cd haproxy-1.4.11
#make install
#mkdir -p /usr/local/haproxy/etc
#mkdir -p /usr/local/haproxy/sbin
#cp examples/haproxy.cfg /usr/local/haproxy/etc
#ln -s /usr/local/sbin/haproxy /usr/local/haproxy/sbin/haproxy 

#vi /usr/local/haproxy/etc/haproxy.cfg
view plainprint?
  1. # this config needs haproxy-1.1.28 or haproxy-1.2.1  
  2.   
  3. global  
  4. #        log 127.0.0.1   local0  
  5.         log 127.0.0.1   local1 notice  
  6.         maxconn 5000  
  7.         uid 99  
  8.         gid 99  
  9.         daemon  
  10.         pidfile /usr/local/haproxy/haproxy.pid  
  11.   
  12.   
  13. defaults  
  14.         log     global  
  15.         mode    http  
  16.         #option httplog  
  17.         option  dontlognull  
  18.         retries 3  
  19.         option redispatch  
  20.         maxconn 2000  
  21.         contimeout      5000  
  22.         clitimeout      50000  
  23.         srvtimeout      50000  
  24.   
  25. listen  ICE01   192.168.0.100:11231  
  26.         mode tcp #配置TCP模式  
  27.         maxconn 2000  
  28.         balance roundrobin  
  29.         server  ice-192.168.0.128 192.168.0.128:11231 check inter 5000 fall 1 rise 2  
  30.         server  ice-192.168.0.129 192.168.0.129:11231 check inter 5000 fall 1 rise 2  
  31.         server  ice-192.168.0.130 192.168.0.130:11231 check inter 5000 fall 1 rise 2  
  32.         server  ice-192.168.0.131 192.168.0.131:11231 check inter 5000 fall 1 rise 2  
  33.         server  ice-192.168.0.132 192.168.0.132:11231 check inter 5000 fall 1 rise 2  
  34.         server  ice-192.168.0.34 192.168.0.34:11231 check inter 5000 fall 1 rise 2  
  35.         srvtimeout      20000  
  36.   
  37. listen stats_auth 192.168.0.20:80  
  38. # listen stats_auth 192.168.0.21:80 # backup config  
  39.         stats enable  
  40.         stats uri  /admin-status #管理地址  
  41.         stats auth  admin:123456 #管理帐号:管理密码  
  42.         stats admin if TRUE  

7、邮件通知程序(python实现)
#vi /etc/keepalived/Mailnotify.py
view plainprint?
  1. #!/usr/local/bin/python  
  2. #coding: utf-8  
  3. from email.MIMEMultipart import MIMEMultipart  
  4. from email.MIMEText import MIMEText  
  5. from email.MIMEImage import MIMEImage  
  6. from email.header import Header  
  7. import sys  
  8. import smtplib  
  9.   
  10. #---------------------------------------------------------------  
  11. # Name:        Mailnotify.py  
  12. # Purpose:     Mail notify to SA  
  13. # Author:      Liutiansi  
  14. # Email:       liutiansi@gamil.com  
  15. # Created:     2011/03/09  
  16. # Copyright:   (c) 2011  
  17. #--------------------------------------------------------------  
  18. strFrom = 'admin@domain.com'  
  19. strTo = 'liutiansi@gmail.com'  
  20. smtp_server='smtp.domain.com'  
  21. smtp_pass='123456'  
  22.   
  23. if sys.argv[1]!="master" and sys.argv[1]!="backup"  and sys.argv[1]!="fault":  
  24.     sys.exit()  
  25. else:  
  26.     notify_type=sys.argv[1]  
  27.   
  28.   
  29. mail_title='[紧急]负载均衡器邮件通知'  
  30. mail_body_plain=notify_type+'被激活,请做好应急处理。'  
  31. mail_body_html='<b><font color=red>'+notify_type+'被激活,请做好应急处理。</font></b>'  
  32.   
  33. msgRoot = MIMEMultipart('related')  
  34. msgRoot['Subject'] =Header(mail_title,'utf-8')  
  35. msgRoot['From'] = strFrom  
  36. msgRoot['To'] = strTo  
  37.   
  38. msgAlternative = MIMEMultipart('alternative')  
  39. msgRoot.attach(msgAlternative)  
  40.   
  41. msgText = MIMEText(mail_body_plain, 'plain', 'utf-8')  
  42. msgAlternative.attach(msgText)  
  43.   
  44.   
  45. msgText = MIMEText(mail_body_html, 'html','utf-8')  
  46. msgAlternative.attach(msgText)  
  47.   
  48.   
  49. smtp = smtplib.SMTP()  
  50. smtp.connect(smtp_server)  
  51. smtp.login(smtp_user,smtp_pass)  
  52. smtp.sendmail(strFrom, strTo, msgRoot.as_string())  
  53. smtp.quit()  

注:修改成系统python实际路径“#!/usr/local/bin/python”(第一行)
#chmod +x /etc/keepalived/Mailnotify.py
#/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg
#service keepalived start

8、查看VRRP通讯记录
#tcpdump vrrp
引用

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:49:05.270017 IP 192.168.0.20 > VRRP.MCAST.NET: VRRPv2, Advertisement, vrid 50, prio 100, authtype simple, intvl 1s, length 20

四、Haproxy界面
访问http://192.168.0.20/admin-status,输入帐号admin密码123456进入管理监控平台。
点击在新窗口中浏览此图片
haproxy-1.4.9以后版本最大的亮点是添加了手工启用/禁用功能,对升级变更应用时非常有用。

五、邮件通知
点击在新窗口中浏览此图片

如大家有什么疑问或感兴趣的话题可以通过weibo与我交流:http://t.qq.com/yorkoliu
Tags: keepalived , haproxy , 四层 , 4layer , 负载均衡
谢谢 Email Homepage
2014/08/08 14:44
受益匪浅。
械在职 Email Homepage
2014/03/11 16:25
不错的文章呵呵
80h大叔 Email Homepage
2013/07/31 09:57
刘哥,你这邮件通知脚本有点小问题,测试了,提示 smtp_user is not defined... 加一个smtp_user 值就好了,受益匪浅啊....
jason Email
2012/03/25 14:26
hi ,有个问题请教一下,谢谢!
如:Haproxy + tomcat ,

其中tomcat1号 down掉,由tomcat2号接管,但是session无法共享,就如购物车的情况,无法继续使用,需要客户再次登陆一次才行。

请问这种session共享的问题,该采用什么样的方式来处理 ?
刘天斯 回复于 2012/03/25 19:33
将session剥离出去,如用memcached或db存储。
minggong Email
2012/03/15 17:02
这是我的haproxy.cfg:                         global        log 127.0.0.1   local0        log 127.0.0.1   local1 notice        maxconn 4096        chroot /usr/local/haproxy        uid 99        gid 99        daemon        nbproc 1        pidfile /usr/local/haproxy/haproxy.pid        #debug        #quietdefaults        log     global        mode    http        option  httplog        option  dontlognull        retries 3        option redispatch        maxconn 2000        contimeout      5000        clitimeout      50000        srvtimeout      50000listen  web1 192.168.3.50:80        cookie  SERVERID rewrite        balance roundrobin        mode http        server web11 192.168.3.30:80 check inter 5000 fall 1 rise 2        server web12 192.168.3.32:80 check inter 5000 fall 1 rise 2listen stats_auth 192.168.3.21:80        stats enable        stats uri  /admin-status        stats auth  admin:123456        stats admin if TRUE                              192.168.3.30:80 和192.168.3.32:80 是nginx两台前段出来的地址 这是 keepalived.conf的配置:                       ! Configura tion File for keepalivedglobal_defs {   notification_email {      569127679@qq.com   }   notification_email_from 569127679@qq.com   smtp_server 127.0.0.1   smtp_connect_timeout 30   router_id LVS_DEVEL}vrrp_script chk_haproxy {    script "killall -0 haproxy"    interval 2     weight 2vrrp_instance VI_1 {    state MASTER    interface eth0    virtual_router_id 50    priority 101    advert_int 1    authentication {        auth_type PASS        auth_pass 1111    }    virtual_ipaddress {        192.168.3.50    }}rack_script {    chk_haproxy}    notify_master "/etc/keepalived/Mailnotify.py master"    notify_backup "/etc/keepalived/Mailnotify.py backup"    notify_fault "/etc/keepalived/Mailnotify.py fault"}192.168.3.50   启动后是ping 不通的呢? http://192.168.3.20/admin-status    能进去 但进去后没有状态两台地址服务器运行状态是空白的!!! 能加你Q聊吗?
刘天斯 回复于 2012/03/16 09:17
将cookie选项去掉。
minggong
2012/03/14 16:34
[ALERT] 073/123120 (24330) : config : proxy 'AA01' : server cannot have cookie or redirect prefix in non-HTTP mode.[ALERT] 073/123120 (24330) : config : proxy 'AA01' : server cannot have cookie or redirect prefix in non-HTTP mode.[ALERT] 073/123120 (24330) : Fatal errors found in configuration.刘哥  什么问题啊?
刘天斯 回复于 2012/03/14 19:58
提示已经很明显了,配置添加了哪些项?
IT族蚁 Email Homepage
2012/03/10 00:03
您好,刘哥,我想请问下,每当主备中任何一台宕机了keepalived可以成功接管,但是需要手动开启haproxy服务网站才能正常访问,想请教您一下,问题会出在哪呢?
刘天斯 回复于 2012/03/11 10:23
backup haproxy服务是要一直开启的。
cc Email
2012/03/02 11:05
唯一一个问题,haproxy+keepalived为什么需要一个VIP啊
又不是用LVS
请博主指导,谢谢!
刘天斯 回复于 2012/03/02 15:20
支持多个VIP,一个VIP对应后端一组服务。
healthly Email Homepage
2011/12/29 12:51
这个网站配置文件的字符编码有问题。
wjnsmnh
2011/11/19 11:11
刘兄
我想问一下
根据你上面的配置说明我能顺利安装并启用.(Keepalived+Haproxy)
haproxy能正常使用
但是Keepalived能启用  可是所指定的vip似乎没有启动.
进程也有keepalived
不知道问题出在哪
请多我指教
刘天斯 回复于 2011/11/19 17:23
netstat -an|grep vip IP确认是否已监听。
小刘 Email
2011/10/15 11:21
mode http 和mode tcp 有什么区别啊 ,谢谢
刘天斯 回复于 2011/10/15 12:30
七层与四层转发的区别。
林旭 Email
2011/09/06 03:50
刘大哥,那个监控haproxy状态的脚本怎么是把haproxy给kill掉了,很不理解啊,求解释,谢谢啦……
刘天斯 回复于 2011/09/06 22:08
killall -0 haproxy非kill掉,只是一个探测。
kkpalm Email
2011/08/24 00:13
刘天斯 回复于 2011/08/23 21:37你的error_log并没有"%{X-Forwarded-For}参数呀?小弟愚蠢!我應該再補上甚麼code才行呢?請劉兄協助!!
刘天斯 回复于 2011/08/24 10:03
error_log一般只记录apache的错误信息,用户访问的错误信息如503、500、400都会记录在access_log中。
kkpalm Email
2011/08/23 17:18
感謝!!按照您說的, 目前 access_log 已經能獲取用戶IP, 但是error_log 失敗, 以下是httpd.conf 設置, 是否我的設定有問題??該怎麼作才能讓 error_log 也可以獲取用戶IP??httpd.conf :ErrorLog "|/usr/sbin/rotatelogs /etc/httpd/logs/error_log.%Y-%m-%d 86400"LogLevel warnLogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" commonLogFormat "%{Referer}i -> %U" refererLogFormat "%{User-agent}i" agentLogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b " combinedCustomLog "|/usr/sbin/rotatelogs /etc/httpd/logs/access_log.%Y-%m-%d 86400" combined
刘天斯 回复于 2011/08/23 21:37
你的error_log并没有"%{X-Forwarded-For}参数呀?
kkpalm Email
2011/08/23 15:31
看您的文章獲益良多!!想請問, 我在Haproxy配置中添加option forwardfor,後端Apache的設置文件則用X-Forwarded-For来获取用户IP成功, 但是 error_log 還是haproxy的IP, 該如何才能跟access_log 一樣呢??
刘天斯 回复于 2011/08/23 16:08
X-Forwarded-For只面向应用层,日志还需用X-Forwarded的格式支持,如LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
prometheus
2011/08/04 14:16
刘兄我也准备使用HAPROXY+keepalivekeepalive想只是用vrrp功能,故此编译的时候没加内核参数Keepalived configuration------------------------Keepalived version       : 1.2.2Compiler                 : gccCompiler flags           : -g -O2 -DETHERTYPE_IPV6=0x86ddExtra Lib                : -lpopt -lssl -lcrypto Use IPVS Framework       : NoIPVS sync daemon support : NoUse VRRP Framework       : YesUse Debug flags          : No现在问题是VIP有,可以PING通,但是内容页面过不去! 请问这个是为啥!
刘天斯 回复于 2011/08/04 17:19
使用#tcpdump vrrp来跟踪。
刀哥 Email Homepage
2011/07/27 17:10
感谢分享!
kawalamick Email Homepage
2011/06/03 17:16
顶顶更健康啊,多谢LZ分享啊~~~~~~~~~~~
蓝色夏威夷 Email Homepage
2011/03/30 17:10
我要是早点看到这个就好了,上次Haproxy怎么也装不上。后来更新了源。哎
刘天斯 回复于 2011/03/30 17:28
现在还不晚,开始吧 :)
im@sorry.com Email Homepage
2011/03/25 09:11
多谢答复。X-Forwarded-For 只支持HTTP模式吧,TCP模式可以吗?
刘天斯 回复于 2011/03/25 10:44
是的,TCP这块可能需要自己去实现。
分页: 1/2 第一页 1 2 下页 最后页

0 0