Haproxy、Keepalived双主高可用负载均衡

http://blog.chinaunix.net/uid-25266990-id-3989321.html


在测试了Nginx+Keepalived的负载均衡后,也对Haproxy+Keepalived双主模式做了测试,双主的模式充分利用了服务器资源,这样不会导致服务器浪费。 这里举例说明: 

默认情况下,第一台负载均衡器主要分发www.zhirs.com的请求,第二台负载均衡器主要分发img.zhirs.com的请求。 

任意一台宕机都不会影响网站分发。

实验环境 VIP1=192.168.137.200 (www.zhirs.com) 

VIP2=192.168.137.100 (img.zhirs.com) 

haproxy01=192.168.137.254 

haproxy02=192.168.137.253 

web1=192.168.137.201 

web2=192.168.137.202 

img1=192.168.158.101 

img2=192.168.158.102 

架构图

 

 安装配置过程

1、安装配置过程,(两台Haproxy的安装配置步骤一样) 

haproxy下载地址:http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.24.tar.gz 

#cd /usr/local/src

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

#tar xf haproxy-1.4.24.tar.gz

#cd haproxy-1.4.24

#make TARGET=linux26 ARCH=x86_64

#TARGET是指定内核版本,ARCH指定CPU架构,我使用的是64bit系统

#make install


2、安装完毕后,创建配置文件和启动文件。

  #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

3、编辑配置文件(两台Haproxy配置文件相同)

#vim /etc/haproxy/haproxy.cfg

# this config needs haproxy-1.1.28 or haproxy-1.2.1

global

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

    log 127.0.0.1   local1 notice

    #log loghost    local0 info

    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 },tcp是4层,http是7层,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.zhirs.com

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

    acl img hdr(host) -i img.zhirs.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-rr,leastconn,first,uri等参数

    option  httpchk /index.html

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

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

   server     web01 192.168.137.202:80  check inter 2000 fall 3 weight 20

   server     web01 192.168.137.203:80  check inter 2000 fall 3 weight 10

backend imgserver

    mode http

    option  httpchk /index.php

    balance     roundrobin                          

    server      img01 192.168.137.101:80  check inter 2000 fall 3

    server      img02 192.168.137.102:80  check inter 2000 fall 3


4、启动Haproxy服务,查看状态。

#service haproxy start


5、安装配置keepalived(两台keepalived安装步骤一样)

#cd /root/software

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

#tar -zxvf pcre-8.33.tar.gz

#cd pcre-8.33

#./configure

#make && make install

#wget http://nginx.org/download/nginx-1.2.9.tar.gz

#tar -zxvf nginx-1.2.9.tar.gz

#cd nginx-1.2.9

#./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_sub_module --with-http_stub_status_module --with-http_gzip_static_module

#make && make install


6、第一台keepalived配置文件。第一台做192.168.137.200vip的master,192.168.137.100的backup。

#vim /etc/keepalived/keepalived.conf

global_defs {

   notification_email {

     [email protected]

   }

   notification_email_from [email protected]

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_script chk_http_port {

                #script "/opt/nginx_pid.sh"

                script "/opt/check_haproxy.sh"

                interval 4  ##运行脚本的间隔时间4秒

                weight 2

}

vrrp_instance VI_1 {

    state MASTER        ############ 辅机为 BACKUP

    interface eth0

    virtual_router_id 51

    mcast_src_ip 192.168.137.254

    priority 100                  ########### 权值要比 back 高

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

track_script { 

        chk_http_port ### 执行监控的服务 

        }

    virtual_ipaddress {

       192.168.137.200

    }

}

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 {

        192.168.137.100  

         }

}


7、第二台keepalived的配置文件。

#vim /etc/keepalived/keepalived.conf

global_defs {

   notification_email {

     [email protected]

   }

   notification_email_from [email protected]

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_script chk_http_port {

                #script "/opt/nginx_pid.sh"

                script "/opt/check_haproxy.sh"

                interval 4  ##运行脚本的间隔时间4秒

                weight 2

}

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    mcast_src_ip 192.168.137.253

    priority 99             ##########权值 要比master低

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

track_script { 

        chk_http_port 

        }

    virtual_ipaddress {

       192.168.137.200

    }

}

vrrp_instance VI_2 {

    state MASTER

    interface eth0

    virtual_router_id 52

    priority 100

    advert_int 1

    authentication {

         auth_type PASS

         auth_pass 1111

    }

    virtual_ipaddress {

        192.168.137.100

         }

}


8、检测脚本,为了防止haproxy服务关闭导致keepalived不自动切换。

#vim /opt/check_haproxy.sh

#!/bin/bash

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

     /etc/init.d/haproxy  start

fi

sleep 2

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

       /etc/init.d/keepalived stop

fi


9、启动两台keepalived和Haproxy服务。

#servcie haproxy start

#service keepalived start


10、查看两台服务器的VIP 查看

查看192.168.137.254:

2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000

link/ether 00:0c:29:dc:01:3e brd ff:ff:ff:ff:ff:ff

inet 192.168.137.254/24 brd 192.168.137.255 scope global eth0

inet 192.168.137.200/32 scope global eth0

查看192.168.137.253:

2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000

link/ether 00:0c:29:d5:e7:3d brd ff:ff:ff:ff:ff:ff

inet 192.168.137.253/24 brd 192.168.137.255 scope global eth0

inet 192.168.137.100/32 scope global eth0

inet6 fe80::20c:29ff:fed5:e73d/64 scope link

valid_lft forever preferred_lft forever

11、测试,关闭任意一台keepalived,img和www域名访问正常。 后续会对Nginx+Keepalived 双主结果做测试。



11、附:

/var/log/messages中报错

Dec  5 10:13:48 MyTest Keepalived_vrrp[15936]: Process [25812] didn't respond to SIGTERM

导致这个原因可能是 vrrp_script 运行间隔时间太短了


vrrp_script weight的理解

通常情况下,利用keepalived做热备,其中一台设置为master,一台设置为backup。当master出现异常后,backup自动切换为master。当backup成为master后,master恢复正常后会再次抢占成为master,导致不必要的主备切换。因此可以将两台keepalived初始状态均配置为backup,设置不同的优先级,优先级高的设置nopreempt解决异常恢复后再次抢占的问题。

然而keepalived只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。但是这些还不够,我们还需要监控keepalived所在服务器上的其他业务进程,根据业务进程的运行状态决定是否需要进行主备切换。这个时候,我们可以通过编写脚本对业务进程进行检测监控。


例如编写个简单脚本查看haproxy进程是否存活

#!/bin/bash

count = `ps aux | grep -v grep | grep haproxy | wc -l`

if [ $count > 0 ]; then

    exit 0

else

    exit 1

fi

在keepalived的配置文件中增加相应配置项


vrrp_script checkhaproxy

{

    script "/home/check.sh"

    interval 3

    weight -20

}

 

vrrp_instance test

{

    ...

     

    track_script

    {

        checkhaproxy

    }

     

    ...

}


keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。


如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加


如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少


其他情况,维持原本配置的优先级,即配置文件中priority对应的值。


这里需要注意的是:


1) 优先级不会不断的提高或者降低


2) 可以编写多个检测脚本并为每个检测脚本设置不同的weight


3) 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况


这样可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。

但是利用该方式会存在一个问题,例如:A,B两台keepalived


A的配置大概为:

vrrp_script checkhaproxy

{

    script "/etc/check.sh"

    interval 3

    weight -20

 

}

 

vrrp_instance test

{

    ....

     

    state backup

    priority 80

    nopreempt

 

    track_script

    {

        checkhaproxy

    }

 

    ....

}

B的配置大概为:

vrrp_script checkhaproxy

{

    script "/etc/check.sh"

    interval 3

    weight -20

}

 

vrrp_instance test

{

    ....

     

    state backup

    priority 70

 

    track_script

    {

        checkhaproxy

    }

 

    ....

}

A,B同时启动后,由于A的优先级较高,因此通过选举会成为master。当A上的业务进程出现问题时,优先级会降低到60。此时B收到优先级比自己低的vrrp广播包时,将切换为master状态。那么当B上的业务出现问题时,优先级降低到50,尽管A的优先级比B的要高,但是由于设置了nopreempt,A不会再抢占成为master状态。

所以,可以在检测脚本中增加杀掉keepalived进程(或者停用keepalived服务)的方式,做到业务进程出现问题时完成主备切换。


你可能感兴趣的:(haproxy)