环境说明:
主机1:192.168.0.234 mq01 DISK
主机2:192.168.0.235 mq02 RAM
主机3:192.168.0.236 mq03 RAM
主机4:测试机器,安装了jdk-8u151-linux-x64,
操作系统:CentOS release 6.9 (Final)
内核版本:2.6.32-696.10.1.el6.x86_64
rabbitmq版本:3.6.11
拓扑图:
步骤:
1,各个主机上下载安装rabbitmq(步骤略)
2,配置3台机器上本地主机名解析
vim /etc/hosts
192.168.0.234 mq01
192.168.0.235 mq02
192.168.0.236 mq03
3,设置3个机器上的节点间统一认证的Erlang Cookie
登录到主机1上传输配置文件:
scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/
在3个节点上分别执行(确保 Cookie file /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only):
chmod 600 /var/lib/rabbitmq/.erlang.cookie
4,在3台主机上使用-detached运行各个节点
在各个主机上启动rabbitmq-server
rabbitmqctl stop
rabbitmq-server -detached
[root@mq01 scripts]# rabbitmqctl cluster_status
[root@mq02 scripts]# rabbitmqctl cluster_status
[root@mq03 scripts]# rabbitmqctl cluster_status
5,创建并部署集群
主机2上的rabbit@mq02:
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@mq01
rabbitmqctl start_app
主机3上的rabbit@mq03:
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@mq01
rabbitmqctl start_app
然后在3台主机上分别执行:
主机1:rabbitmqctl cluster_status
Cluster status of node rabbit@mq01
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq03,rabbit@mq02]}]},
{running_nodes,[rabbit@mq02,rabbit@mq03,rabbit@mq01]},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]},
{alarms,[{rabbit@mq02,[]},{rabbit@mq03,[]},{rabbit@mq01,[]}]}]
主机2:rabbitmqctl cluster_status
Cluster status of node rabbit@mq02
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq03,rabbit@mq02]}]},
{running_nodes,[rabbit@mq03,rabbit@mq01,rabbit@mq02]},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]},
{alarms,[{rabbit@mq03,[]},{rabbit@mq01,[]},{rabbit@mq02,[]}]}]
主机3:rabbitmqctl cluster_status
Cluster status of node rabbit@mq03
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq03,rabbit@mq02]}]},
{running_nodes,[rabbit@mq02,rabbit@mq01,rabbit@mq03]},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]},
{alarms,[{rabbit@mq02,[]},{rabbit@mq01,[]},{rabbit@mq03,[]}]}]
6,配置镜像队列
rabbit@mq01作为备份节点,磁盘节点
在主机2上执行操作:
[root@mq02 scripts]# rabbitmqctl -n rabbit@mq02 set_policy mytest '.*' '{"ha-mode": "nodes", "ha-params": ["rabbit@mq01",], "ha-sync-mode": "automatic"}'
Setting policy "mytest" for pattern ".*" to "{\"ha-mode\": \"nodes\", \"ha-params\": [\"rabbit@mq01\",], \"ha-sync-mode\": \"automatic\"}" with priority "0"
[root@mq02 scripts]# rabbitmqctl -n rabbit@mq02 set_policy -p test mytest '.*' '{"ha-mode": "nodes", "ha-params": ["rabbit@mq01",], "ha-sync-mode": "automatic"}'
Setting policy "mytest" for pattern ".*" to "{\"ha-mode\": \"nodes\", \"ha-params\": [\"rabbit@mq01\",], \"ha-sync-mode\": \"automatic\"}" with priority "0"
查看策略:
主机1:
[root@mq01 scripts]# rabbitmqctl list_policies
Listing policies
/ mytest all .* {"ha-mode":"nodes","ha-params":["rabbit@mq01"],"ha-sync-mode":"automatic"} 0
主机2:
[root@mq02 scripts]# rabbitmqctl list_policies
Listing policies
/ mytest all .* {"ha-mode":"nodes","ha-params":["rabbit@mq01"],"ha-sync-mode":"automatic"} 0
主机3:
[root@mq03 scripts]# rabbitmqctl list_policies
Listing policies
/ mytest all .* {"ha-mode":"nodes","ha-params":["rabbit@mq01"],"ha-sync-mode":"automatic"} 0
7,在3台主机上启动rabbitmq的web管理插件management
[root@mq02 scripts]# rabbitmq-plugins enable rabbitmq_management
[root@mq02 scripts]# rabbitmq-plugins enable rabbitmq_management
[root@mq03 scripts]# rabbitmq-plugins enable rabbitmq_management
8,配置haproxy作为集群的代理
配置文件/etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local3 info
maxconn 5120
gid 507
daemon
quiet
nbproc 4
pidfile /var/run/haproxy.pid
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 5000
contimeout 5s
clitimeout 120s
srvtimeout 120s
listen rmqcluster
bind 0.0.0.0:5672
mode tcp
option tcpka
log 127.0.0.1 local3 info
balance roundrobin
server mq01 192.168.0.234:5672 weight 4 check inter 2000 rise 2 fall 1 backup
server mq02 192.168.0.235:5672 weight 4 check inter 2000 rise 2 fall 1
server mq03 192.168.0.236:5672 weight 4 check inter 2000 rise 2 fall 1
listen rmqmgt
bind 0.0.0.0:15672
mode tcp
option tcpka
log 127.0.0.1 local3 info
balance roundrobin
server mq01 192.168.0.234:15672 weight 4 check inter 2000 rise 2 fall 1 backup
server mq02 192.168.0.235:15672 weight 4 check inter 2000 rise 2 fall 1
server mq03 192.168.0.236:15672 weight 4 check inter 2000 rise 2 fall 1
listen stats
bind 0.0.0.0:8080
mode http
log 127.0.0.1 local3 err
stats enable
stats uri /status
stats refresh 5s
stats auth admin:A9724hxJ
9,关闭集群
disk节点mq01:
rabbitmqctl stop_app
此时beam.smp进程还在运行;
ram节点mq02:
rabbitmqctl stop_app
此时beam.smp进程还在运行;
ram节点Mq03:
rabbitmqctl stop_app
此时beam.smp进程还在运行;
10,启动集群
必须先把磁盘节点启动起来。一个磁盘节点都没有运行的时候,直接启动内存节点会报错如下,出现下面报错之后上面“9,关闭集群”中说的beam.smp进程也会挂掉:
[root@mq03 ~]# rabbitmqctl start_app
Starting node rabbit@mq03
Error: unable to connect to node rabbit@mq03: nodedown
DIAGNOSTICS
===========
attempted to contact: [rabbit@mq03]
rabbit@mq03:
* connected to epmd (port 4369) on mq03
* epmd reports: node 'rabbit' not running at all
no other nodes on mq03
* suggestion: start the node
current node details:
- node name: 'rabbitmq-cli-72@mq03'
- home dir: /var/lib/rabbitmq
- cookie hash: TI04uDcfMAPrk+JQ82hdCw==
解决办法:
先启动磁盘节点,然后再在ram节点主机上的执行/etc/init.d/rabbbitmq-server start来启动节点,然后再start_app。