使用Haproxy代理rabbitmq集群,用keepalive保证haproxy高可用

使用Haproxy代理rabbitmq集群

上一篇文章教了rabbitmq集群搭建。但是这样搭建出来的集群是3个IP:port。客户端一般只会填写一个Ip端口,这个时候就需要有个服务器去代理3个rabbitmq服务。这个时候haproxy就派上用场了。
架构图如下:

HaProxy搭建

1、下载Haproxy tar包

https://www.haproxy.org/download/1.7/src/


下载haproxy-1.7.0.tar.gz

 

2、安装Haproxy

安装gcc包
yum install -y gcc
上传tar包
tar -xvf haproxy-1.7.0.tar.gz
安装
cd haproxy-1.7.0
sudo make TARGET=linux31 PREFIX=/usr/local/haproxy
sudo make install PREFIX=/usr/local/haproxy
cd /usr/local/haproxy
sudo vi haproxy-rabbitmq.cfg
填入如下配置

global
    log 127.0.0.1 local1
    log-tag haproxy
    maxconn 4096
    #user haproxy
    #group haproxy
    daemon
    stats socket /var/run/haproxy.sock mode 600 level admin
    stats timeout 2m
defaults
    log global
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
    option dontlognull
    option http-server-close
listen admin
    bind *:8008
    mode http
    stats uri /stats
frontend rabbitmq
    mode tcp
    bind *:5679
    #把client的超时时间设置的长一点很重要,HAProxy默认是50秒,这样如果50秒还没有消息到来,HAProxy就会断开客户端,这是不合适的
    timeout client 168h
    default_backend rabbitmq_nodes
    log global
    option tcplog
    option logasap
backend rabbitmq_nodes
    mode tcp
    balance roundrobin
    timeout server 168h
    server  rabbit1 rabbit1:5672 check inter 1000 fall 3 rise 3
    server  rabbit2 rabbit2:5672 check inter 1000 fall 3 rise 3
    server  rabbit3 rabbit1:5672 check inter 1000 fall 3 rise 3

listen rabbitmq_admin 
    bind  0.0.0.0:15679
    mode http
    timeout server 168h
    balance roundrobin
    server rabbit1 rabbit1:15672 check inter 1000 fall 3 rise 3
    server rabbit2 rabbit2:15672 check inter 1000 fall 3 rise 3
    server rabbit3 rabbit3:15672 check inter 1000 fall 3 rise 3

3、配置与启动

./sbin/haproxy -f haproxy-rabbitmq.cfg
查看页面 ip:8008/stats查看haproxy的状态
查看页面 ip:15679查看rabbitmq的管理后台
客户端连接用ip:5672去连接
ps:ip是安装haproxy的机器的ip

使用Keepalived实现HAProxy高可用

尽管HAProxy非常稳定,但仍然无法规避操作系统故障、主机硬件故障、网络故障甚至断电带来的风险。所以必须对HAProxy实施高可用方案。

下文将介绍利用Keepalived实现的HAProxy热备方案。即两台主机上的两个HAProxy实例同时在线,其中权重较高的实例为MASTER,MASTER出现问题时,另一台实例自动接管所有流量。

原理

在两台HAProxy的主机上分别运行着一个Keepalived实例,这两个Keepalived争抢同一个虚IP地址,两个HAProxy也尝试去绑定这同一个虚IP地址上的端口。
显然,同时只能有一个Keepalived抢到这个虚IP,抢到了这个虚IP的Keepalived主机上的HAProxy便是当前的MASTER。
Keepalived内部维护一个权重值,权重值最高的Keepalived实例能够抢到虚IP。同时Keepalived会定期check本主机上的HAProxy状态,状态OK时权重值增加。

安装keepalived后结构图如下

 

安装keepalived

yum -y install openssl-devel
wget --no-check-certificate http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
tar -xzf keepalived-1.2.19.tar.gz
cd keepalived-1.2.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/
chmod +x /etc/init.d/keepalived

配置Keepalived

为了使用killall命令

yum install psmisc
mkdir -p /etc/keepalived/
vi /etc/keepalived/keepalived.conf

主机文件配置

global_defs {
    router_id LVS_DEVEL  #虚拟路由名称
}

#HAProxy健康检查配置
vrrp_script chk_haproxy {
    script "killall -0 haproxy"  #使用killall -0检查haproxy实例是否存在,性能高于ps命令
    interval 2   #脚本运行周期
    weight 2   #每次检查的加权权重值
}

#虚拟路由配置
vrrp_instance VI_1 {
    state MASTER           #本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
    interface ens33      #本机网卡名称,使用ifconfig命令查看
    virtual_router_id 51   #虚拟路由编号,主备机保持一致
    priority 101           #本机初始权重,备机请填写小于主机的值(例如100)
    advert_int 1           #争抢虚地址的周期,秒
    virtual_ipaddress {
        192.168.2.200      #虚地址IP,主备机保持一致
    }
    track_script {
        chk_haproxy        #对应的健康检查配置
    }
}

副机文件配置

global_defs {
    router_id LVS_DEVEL  #虚拟路由名称
}

#HAProxy健康检查配置
vrrp_script chk_haproxy {
    script "killall -0 haproxy"  #使用killall -0检查haproxy实例是否存在,性能高于ps命令
    interval 2   #脚本运行周期
    weight 2   #每次检查的加权权重值
}

#虚拟路由配置
vrrp_instance VI_1 {
    state BACKUP           #本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
    interface ens33      #本机网卡名称,使用ifconfig命令查看
    virtual_router_id 51   #虚拟路由编号,主备机保持一致
    priority 100           #本机初始权重,备机请填写小于主机的值(例如100)
    advert_int 1           #争抢虚地址的周期,秒
    virtual_ipaddress {
        192.168.2.200      #虚地址IP,主备机保持一致
    }
    track_script {
        chk_haproxy        #对应的健康检查配置
    }
}

启动

service keepalived start

验证

启动后,先分别在两台主机查看虚IP 192.168.8.201由谁持有,执行命令:

ip addr sh ens33   (将ens33替换成主机的网卡名)

访问192.168.2.200:8008/stats(自己配置的虚拟IP),192.168.2.200:15679(rabbitmq管理台)。如果能访问,则可以使用192.168.2.200:5679作为rabbitmq的入口来使用。