首页 > 代码库 > Haproxy+keepalived高可用、负载均衡安装部署方案

Haproxy+keepalived高可用、负载均衡安装部署方案

1     环境说明

前端两台haproxy+keepalived互为主从,提供高可用;另外基于不同域名访问不同的虚拟ip实现负载均衡

1.1     环境描述

服务器A(主、从)eth0:10.241.51.245   eth1:192.168.1.9

服务器B(从、主)eth2:10.241.51.246   eth1:192.168.1.10

服务器C(web01)eth0:10.241.51.247

服务器D(web02)eth0:10.241.51.248

VIP1:10.241.51.240 (www.a.com)

VIP2:10.241.51.250 (www.b.com)

 

System  OSCentOS   5.8     2.6.32-431.el6.x86_64

1.2     系统软件

haproxy-1.4.24.tar.gz

ipvsadm-1.24.tar.gz

keepalived-1.2.12.tar.gz

pcre-8.33.tar.gz

 

2     安装配置部署

2.1     安装前准备

yum  install   gcc   gcc-c++  gcc*   openssl*   popt-devel  -y


[   -d   /root/soft  ]   ||   [   mkdir   /root/soft  ]

wget  http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.24.tar.gz   -P   /root/soft

wget  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.33.tar.gz   -P   /root/soft

wget  http://keepalived.org/software/keepalived-1.2.12.tar.gz   -P   /root/soft

 

2.2     安装配置haproxy

2.2.1      安装haproxy

两台haproxy服务器安装配置完全相同,分别在两台上面安装配置

 

cd   /root/soft

tar   zxvf   haproxy-1.4.24.tar.gz

   cd   haproxy-1.4.24

   make   TARGET=linux26   ARCH=x86_64

   make   install

   mkdir   /etc/haproxy

   cp   examples/haproxy.cfg   /etc/haproxy

   cp   examples/haproxy.init   /etc/init.d/haproxy

   chmod   +x   /etc/init.d/haproxy

   ln   -s   /usr/local/sbin/haproxy   /usr/sbin/

   mkdir   /usr/share/haproxy

   chkconfig   haproxy  on

 

2.2.2      配置haproxy

两台haproxy服务器安装配置完全相同,分别在两台上面安装配置

 

#vim  /etc/haproxy/haproxy.cfg

global

           log   127.0.0.1         local0      #日志输出配置,所有日志都记录在本机,通过local0输出

           log   127.0.0.1         local1   notice

 

           maxconn   4096                                               #最大连接数

           chroot   /usr/share/haproxy         #改变当前工作目录。

           uid   99                                                     #所属用户的uid

           gid   99                                                     #所属用户的gid

           daemon                                                   #以后台形式运行haproxy

           #debug

           #quiet

  

defaults

           log   global

           mode            http

           #默认的模式mode   {   tcp|http|health   }tcp4层,http7层,health只会返回OK

           option      httplog

           option      dontlognull

           option         redispatch

           #serverId对应的服务器挂掉后,强制定向到其他健康的服务器

           option      abortonclose

           #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接

           retries   3                                    #两次连接失败就认为是服务器不可用

           maxconn   2000                                    #默认的最大连接数

           #timeout   http-keep-alive   10s

           #   timeout   queue  1m

           contimeout      5000                        #连接超时

           clitimeout      50000                     #客户端超时

           srvtimeout      50000                     #服务器超时

           timeout   check   5s                                    #心跳检测超时

           stats   refresh   30s                                 #统计页面自动刷新时间

           stats   uri      /stats                                 #统计页面url

           stats   realm   baison-test-Haproxy                    #统计页面密码框上提示文本

           stats   auth   admin:admin123                          #统计页面用户名和密码设置

           stats   hide-version                            #隐藏统计页面上HAProxy的版本信息

frontend  www

           bind   *:80

           #这里建议使用bind   *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。

           acl   web   hdr(host)  -i   www.a.com

           #acl后面是规则名称,-i是要访问的域名,如果访问www.zhirs.com这个域名就分发到下面的webserver   的作用域。

           acl   img   hdr(host)  -i   www.b.com

           #如果访问img.baison.com.cn就分发到imgserver这个作用域。

           use_backend   webserver   if   web

           use_backend   imgserver  if   img

  

backend  webserver                                       #webserver作用域

           mode   http

           balance         roundrobin                 

           #banlance   roundrobin   轮询,balance   source   保存session值,支持static-rrleastconnfirsturi等参数

           option      httpchk   /index.html

           #检测文件,如果分发到后台index.html访问不到就不再分发给它

           server   web01  10.241.51.247:80   check   inter  2000   fall   3   weight   30

           server   web02  10.241.51.248:80   check   inter  2000   fall   3   weight   30

 

backend  imgserver

           mode   http

           option      httpchk   /index.php

           balance               roundrobin                                                                              

          server   img01  10.241.51.247:81   check   inter  2000   fall   3   weight   100

          server   img02  10.241.51.248:81   check   inter  2000   fall   3   weight   10

 

#设置基于权值的轮叫调度,访问服务器A10次,访问B1

启动服务:service   haproxy  start

 

2.2.3      测试haproxy监控界面

10.241.51.245监控:

10.241.51.246监控:

图片

 

2.3     安装配置keepalived

2.3.1      安装keepalived

两台服务器安装相同

 

uname  -r

ln   -s   /usr/src/kernels/2.6.32-431.el6.x86_64/   /usr/src/linux

 

tar  zxvf   ipvsadm-1.24.tar.gz

cd   ipvsadm-1.24

make  &&   make   install

 

tar  zxvf   keepalived-1.1.19.tar.gz

cd   keepalived-1.1.19

./configure   --prefix=/usr/local/keepalived

make && make install
 

cp /usr/local/keepalived/sbin/keepalived   /usr/sbin/

cp /usr/local/keepalived/etc/sysconfig/keepalived/etc/sysconfig/

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived/etc/init.d/

mkdir /etc/keepalived

cp /usr/local/etc/keepalived/keepalived.conf/etc/keepalived/

chkconfig --add keepalived

 

2.3.2      配置keepalived

Keepalived  第一台配置:

 

#vim  /etc/keepalived/keepalived.conf

global_defs   {

        notification_email   {

               xxxxxxxxx@qq.com

        }

        notification_email_from   keepalived@y.to

         smtp_server   127.0.0.1

        smtp_connect_timeout   30

        router_id   LVS_DEVEL

}

vrrp_script   chk_http_port   {

        #script   "/bin/nginx_pid.sh"

        script   "/bin/check_haproxy.sh"

        interval   2

        weight   2

}

vrrp_instance   VI_1  {

           state   MASTER      #辅机为   BACKUP

           interface   eth0

           virtual_router_id   51

           mcast_src_ip   10.241.51.254

           priority   100      #权值要比backup

           advert_int   1

           authentication   {

                        auth_type   PASS

                        auth_pass   1111

           }

track_script   {  

           chk_http_port   ###   执行监控的服务  

            }

           virtual_ipaddress   {

                     10.241.51.250

           }

}

vrrp_instance   VI_2  {

           state   BACKUP

           interface   eth0

           virtual_router_id   52

           priority   99

           advert_int   1

           authentication   {

                           auth_type   PASS

                           auth_pass   1111

           }

           virtual_ipaddress   {

                        10.241.51.240     

                           }

}

 

Keepalived  第二台配置:

 

#vim  /etc/keepalived/keepalived.conf

global_defs   {

        notification_email   {

               xxxxxxx`@qq.com

        }

        notification_email_from   keepalived@y.to

         smtp_server   127.0.0.1

        smtp_connect_timeout   30

        router_id   LVS_DEVEL

}

vrrp_script   chk_http_port   {

        #script   "/bin/nginx_pid.sh"

        script   "/bin/check_haproxy.sh"

        interval   2

        weight   2

}

vrrp_instance   VI_1  {

           state   BACKUP     

           interface   eth2        #注意此处网卡序号

           virtual_router_id   51

           mcast_src_ip   10.241.51.254

           priority   90    

           advert_int   1

           authentication   {

                        auth_type   PASS

                        auth_pass   1111

           }

track_script   {  

           chk_http_port   ###   执行监控的服务  

            }

           virtual_ipaddress   {

                     10.241.51.250

           }

}

vrrp_instance   VI_2  {

           state   MASTER

           interface   eth2  #注意此处网卡序号

           virtual_router_id   52

           priority   100

           advert_int   1

           authentication   {

                           auth_type   PASS

                           auth_pass   1111

           }

           virtual_ipaddress   {

                        10.241.51.240     

                           }

}

 

2.3.3      监控haproxy进程脚本

两台keepalived脚本相同

 

[root@node01 soft]# cat  /bin/check_haproxy.sh

#!/bin/bash

if [ $(ps -C haproxy --no-header | wc -l)-eq 0 ]; then

    /etc/init.d/haproxy  start

fi

sleep 5

if [ $(ps -C haproxy --no-header | wc -l)-eq 0 ]; then

      /etc/init.d/keepalived stop

fi

 

 

 

两台keepalived服务器均启动keepalived服务: service keepalived start

添加到开机启动项目:chkconfig--add keepalived && chkconfig keepalived on

 

2.4     管理haproxy\keepalived

2.4.1      查看虚拟ip信息

# ip addr

 

Keepalived01:10.241.51.245

 图片

Keepalived02:10.241.51.246
图片 

2.4.2      测试网站高可用和负载均衡

正常访问网站:www.a.com www.b.com,前提是绑定本地hosts或者设置dns域名解析

测试基于权值的轮叫调度访问:访问A10次才能访问B1

关闭一台haproxy,访问两个网站:均可以访问(观察虚拟ip的变化,虚拟ip均迁移到第二台)

恢复第一台的haproxy,观察虚拟ip变化:虚拟ip恢复为默认

 

建议:

a.最好是将虚拟两个ip均绑定到两个网站域名,从而实现真正的负载均衡和高可用;或者两个upstream对应后端相同的物理应用服务器

10.241.51.240 www.a.com

10.241.51.240 www.b.com

10.241.51.250 www.a.com

10.241.51.250 www.b.com

b.脚本中可以增加网络层面的监控,保证网络和服务任何一个不可用,均切换

c.对于特殊的url访问规则,haproxy无法实现的情况,可以考虑采用nginx+keepalived+脚本监控服务实现