RabbitMQ+Docker+Haproxy 实现高可用
本机或者待安装服务器已经存在 docker 或者自行 Google docker 的安装方法,对 Dcoker >= 18,其实很简单的一个安装过程,主要是网络及如何自动挂载 IP 对应关系到容器内,就当记录下吧。
RabbitMQ
安装
多台服务器启动方式相同相同,要预先配置好 hosts 文件的对应例如:
cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.203 rabbitmq-slave2
192.168.1.153 rabbitmq-master
192.168.1.200 rabbitmq-slave2
docker run -d --net host --restart=always --privileged=true \
$(cat /etc/hosts | awk -F ' ' '{if(NR>2){print "--add-host "$2":"$1}}') \
--hostname ${RABBITMQ_HOST} \
--name ${RABBITMQ_CONTAINER_NAME} \
-e RABBITMQ_DEFAULT_USER=${RABBITMQ_MANAGEMENT_USER} \
-e RABBITMQ_DEFAULT_PASS=${RABBITMQ_MANAGEMENT_PASSWD} \
-e RABBITMQ_DEFAULT_VHOST=${RABBITMQ_VHOST} \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' \ # 此处配置无论几个节点都必须保持一致
-e RABBITMQ_LOGS="/var/log/rabbitmq/rabbitmq.log" \
${RABBITMQ_IMAGE}:${RABBITMQ_IMAGE_VERSION} >> ${LOGS_PATH}/${my_role}.log 2>&1
各位有可用会有疑问,$(cat /etc/hosts | awk -F ' ' '{if(NR>2){print "--add-host "$2":"$1}}')
这个参数我怎么没有见过?,此处我来说明下:在 RabbitMQ 制作集群的过程中添加主机到集群中时,不支持以 IP 的形式进行添加,要么有DNS 帮你自动解析,要就要映射宿主机中的/etc/hosts 文件到 docker,但是各位使用 Docker 的都了解,不能直接挂载/etc/hosts 到容器内,那么我得解决办法就是在启动过程中调用–add-host 参数来进行 host 文件添加,而且是自动读取/etc/hosts 文件并去除头 2 行没有用到的。
集群配置
操作其实就是将其中 2 个节点添加到另外一个节点中形成集群
Master 节点
$ docker exec ${RABBITMQ_CONTAINER_NAME} rabbitmqctl stop_app
$ docker exec ${RABBITMQ_CONTAINER_NAME} rabbitmqctl reset
$ docker exec ${RABBITMQ_CONTAINER_NAME} rabbitmqctl start_app
Slave1 节点
$ docker exec ${RABBITMQ_CONTAINER_NAME} rabbitmqctl stop_app
$ docker exec ${RABBITMQ_CONTAINER_NAME} rabbitmqctl reset
$ docker exec ${RABBITMQ_CONTAINER_NAME} rabbitmqctl join_cluster rabbit@rabbitmq-master # @主节点的主机名
$ docker exec ${RABBITMQ_CONTAINER_NAME} rabbitmqctl start_app
Slave2 节点
$ docker exec ${RABBITMQ_CONTAINER_NAME} rabbitmqctl stop_app
$ docker exec ${RABBITMQ_CONTAINER_NAME} rabbitmqctl reset
$ docker exec ${RABBITMQ_CONTAINER_NAME} rabbitmqctl join_cluster rabbit@rabbitmq-master # @主节点的主机名
$ docker exec ${RABBITMQ_CONTAINER_NAME} rabbitmqctl start_app
集群验证
Haproxy
LDAP 安装很简单,主要配置文件配好即可
安装
docker run \
-p ${HAPROXY_RABBITMQ_TCP_PORT}:5678 -p ${HAPROXY_RABBITMQ_STATS_PORT}:8101 -p ${HAPROXY_RABBITMQ_ADMIN_PORT}:8001 \
--name ${HAPROXY_CONTAINER_NAME} \
-v ${PER_CONF}/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro \
-d ${HAPROXY_IMAGE_NAME}:${HAPROXY_IMAGE_VERSION}
配置文件
docker run -d -p 5678 -p 8101 -p 8001 --name haproxy -v /root/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:latest
global
log 127.0.0.1 local0 info
maxconn 5120
uid 99
gid 99
daemon
quiet
nbproc 20
defaults
log global
#使用4层代理模式,”mode http”为7层代理模式
mode tcp
#if you set mode to tcp,then you nust change tcplog into httplog
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
timeout connect 5s
#客户端空闲超时时间为 60秒 则HA 发起重连机制
timeout client 60s
#服务器端链接超时时间为 15秒 则HA 发起重连机制
timeout server 15s
#front-end IP for consumers and producters
listen rabbitmq_cluster
bind 0.0.0.0:5678
#配置TCP模式
mode tcp
#balance url_param userid
#balance url_param session_id check_post 64
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-cookie
#balance leastconn
#balance source //ip
#简单的轮询
balance roundrobin
#rabbitmq集群节点配置
#inter 每隔五秒对mq集群做健康检查, 2次正确证明服务器可用,2次失败证明服务器不可用,并且配置主备机制
server myrabbit1 192.168.1.153:5672 check inter 5000 rise 2 fall 2
server myrabbit2 192.168.1.200:5672 check inter 5000 rise 2 fall 2
server myrabbit3 192.168.1.203:5672 check inter 5000 rise 2 fall 2
listen stats
bind 0.0.0.0:8101
mode http
option httplog
stats enable
#设置haproxy监控地址为http://localhost:8100/rabbitmq-stats
stats uri /rabbitmq-stats
stats refresh 5s
stats auth admin:123456
listen rabbitmq_admin
bind 0.0.0.0:8001
server myrabbit1 192.168.1.153:15672 check inter 5000 rise 2 fall 2
server myrabbit2 192.168.1.200:15672 check inter 5000 rise 2 fall 2
server myrabbit3 192.168.1.203:15672 check inter 5000 rise 2 fall 2