使用Haproxy代理rabbitmq集群,用keepalive保证haproxy高可用
原文地址:https://www.jianshu.com/p/440b8e1d5339
使用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的入口来使用。