docker部署rabbitmq集群

拉取rabbitmq镜像

拉取rabbitmq management镜像

1
docker pull rabbitmq:3.7-rc-management

若不使用Rabbitmq的management功能,可以拉取镜像:rabbitmq:3.7-rc

参考:https://hub.docker.com/_/rabbitmq/

创建网络

创建rabbitmq私有网络

1
2
3
4
5
# docker network create rabbitmqnet
# docker network ls
NETWORK ID NAME DRIVER SCOPE
65b44ea8847c rabbitmqnet bridge local
...

创建节点

通过docker命令创建三个Rabbitmq nodes;

注意这里使用相同的 RABBITMQ_ERLANG_COOKIE 值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# docker run -d \
--name=rabbitmq1 \
-p 5672:5672 \
-p 15672:15672 \
-e RABBITMQ_NODENAME=rabbitmq1 \
-e RABBITMQ_ERLANG_COOKIE='YZSDHWMFSMKEMBDHSGGZ' \
-h rabbitmq1 \
--net=rabbitmqnet \
rabbitmq:3.7-rc-management

# docker run -d \
--name=rabbitmq2 \
-p 5673:5672 \
-p 15673:15672 \
-e RABBITMQ_NODENAME=rabbitmq2 \
-e RABBITMQ_ERLANG_COOKIE='YZSDHWMFSMKEMBDHSGGZ' \
-h rabbitmq2 \
--net=rabbitmqnet \
rabbitmq:3.7-rc-management

# docker run -d \
--name=rabbitmq3 \
-p 5674:5672 \
-p 15674:15672 \
-e RABBITMQ_NODENAME=rabbitmq3 \
-e RABBITMQ_ERLANG_COOKIE='YZSDHWMFSMKEMBDHSGGZ' \
-h rabbitmq3 \
--net=rabbitmqnet \
rabbitmq:3.7-rc-management

组建rabbitmq集群

登陆Rabbitmq的后两个节点,执行命令加入第一个Rabbitmq节点集群

1
2
3
4
5
6
7
8
9
10
11
12
13
### Disk Node
# docker exec rabbitmq2 bash -c \
"rabbitmqctl stop_app && \
rabbitmqctl reset && \
rabbitmqctl join_cluster rabbitmq1@rabbitmq1 && \
rabbitmqctl start_app"

### Ram Node
# docker exec rabbitmq3 bash -c \
"rabbitmqctl stop_app && \
rabbitmqctl reset && \
rabbitmqctl join_cluster --ram rabbitmq1@rabbitmq1 && \
rabbitmqctl start_app"

退出集群

1
2
3
4
# docker exec rabbitmq3 bash -c \
"rabbitmqctl stop_app && \
rabbitmqctl reset && \
rabbitmqctl start_app"

拉取haproxy镜像

拉取haproxy镜像

1
# docker pull haproxy

启动haproxy

1
2
3
4
5
6
7
8
9
# cat haproxy-create.sh
#! /bin/bash

docker run -d \
--name rabbitmq-haproxy \
-p 1080:80 -p 5677:5677 -p 8001:8001 \
--net=rabbitmqnet \
-v /root/rabbitmq/haproxy-etc:/usr/local/etc/haproxy:ro \
haproxy:latest

haproxy的配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
root@node0:~/rabbitmq# cat haproxy-etc/haproxy.cfg
# Simple configuration for an HTTP proxy listening on port 80 on all
# interfaces and forwarding requests to a single backend "servers" with a
# single server "server1" listening on 127.0.0.1:8000

global
daemon
maxconn 256

defaults
mode http
timeout connect 5000ms
timeout client 5000ms
timeout server 5000ms

listen rabbitmq_cluster
bind 0.0.0.0:5677
option tcplog
mode tcp
balance leastconn
server rabbit1 rabbitmq1:5672 check inter 2s rise 2 fall 3
server rabbit2 rabbitmq2:5672 check inter 2s rise 2 fall 3
server rabbit3 rabbitmq3:5672 check inter 2s rise 2 fall 3

listen http_front
bind 0.0.0.0:80
stats uri /haproxy?stats

listen rabbitmq_admin
bind 0.0.0.0:8001
server rabbit1 rabbitmq1:15672
server rabbit2 rabbitmq2:15672
server rabbit3 rabbitmq3:15672

启动haproxy后,可以通过haproxy来访问rabbitmq集群:

http://external-ip:8001

rabbitmq-haproxy

获取haproxy的状态:

http://external-ip:1080/haproxy?stats

rabbitmq-haproxy-stats

rabbitmq exporter部署

要收集rabbitmq的metrics给prometheus使用的话,可以使用开源的rabbitmq-exporter

参考如下:

https://github.com/kbudde/rabbitmq_exporter

https://hub.docker.com/r/kbudde/rabbitmq-exporter/

拉取镜像

1
# docker pull kbudde/rabbitmq-exporter

启动rabbitmq实例

1
# docker run -d --name=rabbitmq1 -p 5672:5672 -p 15672:15672 -e RABBITMQ_NODENAME=rabbitmq1 -e RABBITMQ_ERLANG_COOKIE='YZSDHWMFSMKEMBDHSGGZ' -h rabbitmq1 --net=rabbitmqnet -p 9090:9090 rabbitmq:3.7-rc-management

开启9090端口,这个是rabbitmq exporter的默认PUBLISH_PORT

启动rabbitmq exporter实例

1
# docker run -d --net=container:rabbitmq1 kbudde/rabbitmq-exporter

获取rabbitmq的metrics

1
# wget http://localhost:9090/metrics

rabbitmq相关端口

  1. 4369 (epmd), 25672 (Erlang distribution)

    Epmd 是 Erlang Port Mapper Daemon 的缩写,在 Erlang 集群中相当于 dns 的作用,供给节点名称到端口的查询,epmd绑定在总所周知的4369端口上。

  2. 5672, 5671 (AMQP 0-9-1 without and with TLS)

    AMQP,即 Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang 中的实现有 RabbitMQ 等。

  3. 15672 (if management plugin is enabled)

    通过 http://serverip:15672 访问 RabbitMQ 的 Web 管理界面,默认用户名密码都是 guest。(注意:RabbitMQ 3.0之前的版本默认端口是55672,下同)

  4. 25672

    管理插件端口,默认是AMQP端口+20000

  5. 61613, 61614 (if STOMP is enabled)

    Stomp 是一个简单的消息文本协议,它的设计核心理念就是简单与可用性,官方文档,现在我们就来实践一下 Stomp 协议,你需要的是:

    • 一个支持 stomp 消息协议的 messaging server (譬如activemq,rabbitmq)
    • 一个终端(譬如linux shell)
    • 一些基本命令与操作(譬如nc,telnet)
  6. 1883, 8883 (if MQTT is enabled)

    MQTT 只是 IBM 推出的一个消息协议,基于 TCP/IP 的。两个 App 端发送和接收消息需要中间人,这个中间人就是消息服务器(比如ActiveMQ/RabbitMQ),三者通信协议就是 MQTT

支持原创