Docker部署RabbitMQ集群和Haproxy负载均衡和高可用(1)

Docker部署RabbitMQ集群和Haproxy负载均衡和高可用(1)

八月 28, 2019

镜像

1
2
3
docker pull rabbitmq:3-management

docker pull rabbitmq:3-management

node_0

1
docker run -d --hostname node_0_rabbit --name node_0_rabbit -e RABBITMQ_DEFAULT_USER=your username -e RABBITMQ_DEFAULT_PASS=yous pword -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' -p 15672:15672 -p 5672:5672 rabbitmq:3-management

node_1

1
docker run -d --hostname node_1_rabbit --name node_1_rabbit --link node_0_rabbit:node_0_rabbit -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' -e RABBITMQ_DEFAULT_USER=your username -e RABBITMQ_DEFAULT_PASS=yous pword -p 15673:15672 -p 5673:5672 rabbitmq:3-management

node_2

1
docker run -d --hostname node_2_rabbit --name node_2_rabbit --link node_0_rabbit:node_0_rabbit --link node_1_rabbit:node_1_rabbit -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' -e RABBITMQ_DEFAULT_USER=your username -e RABBITMQ_DEFAULT_PASS=yous pword -p 15674:15672 -p 5674:5672 rabbitmq:3-management

network 连接

内网ip一览

  • 172.100.100.3 - node_0_rabbit
  • 172.100.100.4 - node_1_rabbit
  • 172.100.100.5 - node_2_rabbit
  • 172.100.100.6 - haproxy_0
  • 172.100.100.7 - haproxy_1

创建网卡

1
docker network create --subnet=172.100.100.0/24 rabbit_net

注意:docker rabbitmq需要节点设置erlang cookie,节点之间需要一致。服务器则需要拷贝相关.erlang.cookie文件(好像是这个)

node_0

1
2
3
4
5
6
7
8
9
10
docker run -d --hostname node_0_rabbit \
--name node_0_rabbit \
--net=rabbit_net \
--ip=172.100.100.3 \
-e RABBITMQ_DEFAULT_USER=your username \
-e RABBITMQ_DEFAULT_PASS=yous pword \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' \
-p 15672:15672 \
-p 5672:5672 \
rabbitmq:3-management

node_1

1
2
3
4
5
6
7
8
9
10
docker run -d --hostname node_1_rabbit \
--name node_1_rabbit \
--net=rabbit_net \
--ip=172.100.100.4 \
-e RABBITMQ_DEFAULT_USER=your username \
-e RABBITMQ_DEFAULT_PASS=yous pword \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' \
-p 15673:15672 \
-p 5673:5672 \
rabbitmq:3-management

node_2

1
2
3
4
5
6
7
8
9
10
docker run -d --hostname node_2_rabbit \
--name node_2_rabbit \
--net=rabbit_net \
--ip=172.100.100.5 \
-e RABBITMQ_DEFAULT_USER=your username \
-e RABBITMQ_DEFAULT_PASS=yous pword \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' \
-p 15674:15672 \
-p 5674:5672 \
rabbitmq:3-management

haproxy_0

1
2
3
4
5
6
7
8
9
# 5670 web监控 http://your ip address:5670/rabbitmq-stats
# 5671 集群端口
# 关于配置
docker run -d --hostname haproxy_0 \
--name haproxy_0 \
-p 5670-5671:5670-5671 \
-v /home/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg \
--ip=172.100.100.6 \
--net=rabbit_net haproxy

haproxy_1 同理 后面高可用备用

haproxy.cfg

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
global
maxconn 5120
log 127.0.0.1 local0 info #[err warning info debug]
chroot /usr/local/sbin #chroot运行的路径
daemon #以后台形式运行haproxy
nbproc 20
pidfile /var/run/haproxy.pid #haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
defaults
log global
mode tcp #所处理的类别 (#7层 http;4层tcp )
maxconn 2000 #最大连接数
option dontlognull #不记录健康检查的日志信息
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option tcplog
#stats refresh 30 #统计页面刷新间隔
retries 3 #3次连接失败就认为服务不可用,也可以通过后面设置
#balance roundrobin #默认的负载均衡的方式,轮询方式
#balance source #默认的负载均衡的方式,类似nginx的ip_hash
#balance leastconn #默认的负载均衡的方式,最小连接
#timeout connect 5000 #连接超时
#timeout client 50000 #客户端超时
#timeout server 50000 #服务器超时
#timeout check 2000 #心跳检测超时
contimeout 5s
clitimeout 60s
srvtimeout 15s
#配置haproxy web监控
listen stats
bind 0.0.0.0:5670
mode http
option httplog
stats enable
stats uri /rabbitmq-stats #统计页面url
stats refresh 5s
listen rabbitmq_cluster
bind 0.0.0.0:5671
option tcplog
mode tcp
#timeout client 3h
#timeout server 3h
#option clitcpka
balance roundrobin #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数)
#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
server node_0_rabbit 172.100.100.3:5672 check inter 5s rise 2 fall 2 #check inter 2000 是检测心跳频率,rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用
server node_1_rabbit 172.100.100.4:5672 check inter 5s rise 2 fall 2
server node_2_rabbit 172.100.100.5:5672 check inter 5s rise 2 fall 2

设置mq集群

使用rabbitmqctl

1
2
3
4
5
6
7
8
9
10
11
12
# node_0
docker exec -it node_0_rabbit bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

# node_1 node_2 (join_cluster --ram 以内存的方式加入,默认disc)
docker exec -it node_1(2)_rabbit bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node_0_rabbit
rabbitmqctl start_app

开启集群镜像模式

1
2
# 任何rabbitmq节点
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

相关链接