环境:html
OS:CentOS6.75node
RabbitMQ Vervison :3.6.5web
节点:正则表达式
node1 : mq01 172.16.42.128bash
node2: mq02 172.16.42.135
cookie
配置:
网络
一、两台机器上都安装RabbitMQapp
这里的安装包括socat、Erlang、rabbitmq-server包的安装,已经环境变量和config文件的配置,请参考RabbitMQ安装,先不要急着建立用户、虚拟主机和配置权限。这些等集群建立好了再作dom
二、配置hosts文件ide
更改两台MQ节点的计算机名分别为mq01 和mq02,而后修改hosts配置文件
mq01
[root@mq01 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.42.128 mq01 172.16.42.135 mq02
mq02
[root@mq01 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.42.128 mq01 172.16.42.135 mq02
三、拷贝erlang.cookie
Rabbitmq的集群是依附于erlang的集群来工做的,因此必须先构建起erlang的集群景象。Erlang的集群中各节点是经由过程一个magic cookie来实现的,这个cookie存放在/var/lib/rabbitmq/.erlang.cookie中(像个人root用户安装的就是放在个人root/.erlang.cookie中),文件是400的权限。因此必须包管各节点cookie对峙一致,否则节点之间就没法通讯。
[root@mq01 ~]# cat /var/lib/rabbitmq/.erlang.cookie FNMCAWWQGOJIQKDJQUQG
将cookie中的内容复制到mq02的cookie文件中。
四、启动rabbitmq服务
/etc/init.d/rabbitmq-server start
在node2 mq02上中止rabbitmq应用程序,并重置(重置只是清除节点的配置,若是没有配置过,则能够省略),而后加入node1集群
[root@mq02 rabbitmq]# rabbitmqctl stop_app Stopping node rabbit@mq02 ...
reset节点
rabbitmqctl reset
[root@mq02 rabbitmq]# rabbitmqctl reset Resetting node rabbit@mq02 ...
五、加入集群
rabbitmqctl join_cluster rabbit@mq01
[root@mq02 ~]# rabbitmqctl join_cluster rabbit@mq01 Clustering node rabbit@mq02 with rabbit@mq01 ...
启动rabbitmq应用
[root@mq02 ~]# rabbitmqctl start_app Starting node rabbit@mq02 ...
六、查看集群状态
node2上查看集群状态
rabbitmqctl cluster_status
[root@mq02 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@mq02 ... [{nodes,[{disc,[rabbit@mq01,rabbit@mq02]}]}, {running_nodes,[rabbit@mq01,rabbit@mq02]}, {cluster_name,<<"rabbit@mq01">>}, {partitions,[]}, {alarms,[{rabbit@mq01,[]},{rabbit@mq02,[]}]}]
node1上查看集群状态
[root@mq01 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@mq01 ... [{nodes,[{disc,[rabbit@mq01,rabbit@mq02]}]}, {running_nodes,[rabbit@mq02,rabbit@mq01]}, {cluster_name,<<"rabbit@mq01">>}, {partitions,[]}, {alarms,[{rabbit@mq02,[]},{rabbit@mq01,[]}]}]
七、更改节点类型
节点有两种类型:磁盘节点和内存节点,集群中必须至少有一个磁盘节点,不然队列元数据没法写入到集群中,当磁盘节点宕掉时,集群将没法写入新的队列元数据信息。
从上面集群状态能够看出,mq01和mq02 均为磁盘节点,能够经过命令
rabbitmqctl change_cluster_node_type disc
将mq02更改成内存节点
[root@mq02 ~]# rabbitmqctl stop_app Stopping node rabbit@mq02 ... [root@mq02 ~]# rabbitmqctl change_cluster_node_type ram Turning rabbit@mq02 into a ram node ... [root@mq02 ~]# rabbitmqctl start_app Starting node rabbit@mq02 ... [root@mq02 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@mq02 ... [{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq02]}]}, {running_nodes,[rabbit@mq01,rabbit@mq02]}, {cluster_name,<<"rabbit@mq01">>}, {partitions,[]}, {alarms,[{rabbit@mq01,[]},{rabbit@mq02,[]}]}]
也能够在将mq02 加入集群只带上--ram参数,即设置mq02为内存节点.
注意:更改节点类型前,必须将节点rabbitmq应用停掉。
八、验证节点crash后又恢复时,是否能自动加入集群
将node2 mq02 服务停掉,在node1上查看集群状态
[root@mq02 ~]# rabbitmqctl stop Stopping and halting node rabbit@mq02 ...
node1 上查看集群状态
[root@mq01 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@mq01 ... [{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq02]}]}, {running_nodes,[rabbit@mq01]}, {cluster_name,<<"rabbit@mq01">>}, {partitions,[]}, {alarms,[{rabbit@mq01,[]}]}]
从上面能够看到running_nodes 只有node1了
启动node2的服务
[root@mq02 ~]# /etc/init.d/rabbitmq-server start Starting rabbitmq-server: SUCCESS rabbitmq-server.
再来查看两台机器集群状态
[root@mq01 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@mq01 ... [{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq02]}]}, {running_nodes,[rabbit@mq02,rabbit@mq01]}, {cluster_name,<<"rabbit@mq01">>}, {partitions,[]}, {alarms,[{rabbit@mq02,[]},{rabbit@mq01,[]}]}]
[root@mq02 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@mq02 ... [{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq02]}]}, {running_nodes,[rabbit@mq01,rabbit@mq02]}, {cluster_name,<<"rabbit@mq01">>}, {partitions,[]}, {alarms,[{rabbit@mq01,[]},{rabbit@mq02,[]}]}]
九、当磁盘节点挂了时
将node1erlang虚拟机停掉
[root@mq01 ~]# rabbitmqctl stop
Stopping and halting node rabbit@mq01 ...
登陆rabbitmq web管理控制台,建立新的队列,报错
恢复node1 erlang虚拟机服务
[root@mq01 ~]# /etc/init.d/rabbitmq-server start
Starting rabbitmq-server: SUCCESS
rabbitmq-server.
从新建立队列,成功
十、当磁盘节点挂了时
将node2 erlang虚拟机停掉
[root@mq02 ~]# rabbitmqctl stop
Stopping and halting node rabbit@mq02 ...
登陆node1的web管理控制台,建立新的队列,成功
总结:
结合9 和10 的测试来看,集群中没有没有磁盘节点,那么集群不能建立新的队列元数据,可是仍能继续工做,若是内存几点挂了,则集群不受影响,这也是为何集群中至少要有一个磁盘节点的缘由,单个节点不能设置为内存节点。
十一、集群镜像模式
上面的集群模式为普通模式,镜像模式实在普通模式的基础之上加一些策略。其实质和普通模式不一样之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。该模式带来的反作用也很明显,除了下降系统性能外,若是镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通信大大消耗掉。因此在对可靠性要求较高的场合中适用,一个队列想作成镜像队列,须要先设置policy,而后客户端建立队列的时候,rabbitmq集群根据“队列名称”自动设置是普通集群模式或镜像队列。具体以下:
队列经过策略来使能镜像。策略能在任什么时候刻改变,rabbitmq队列也近可能的将队列随着策略变化而变化;非镜像队列和镜像队列之间是有区别的,前者缺少额外的镜像基础设施,没有任何slave,所以会运行得更快。为了使队列称为镜像队列,你将会建立一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。ha-params根据ha-mode设置不一样的值,下面表格说明这些key的选项:
语法讲解:
在cluster中任意节点启用策略,策略会自动同步到集群节点
rabbitmqctl set_policy -p hrsystem ha-allqueue"^" '{"ha-mode":"all"}'
这行命令在vhost名称为hrsystem建立了一个策略,策略名称为ha-allqueue,策略模式为 all 即复制到全部节点,包含新增节点,策略正则表达式为 “^” 表示全部匹配全部队列名称。
例如rabbitmqctl set_policy -p hrsystem ha-allqueue "^message" '{"ha-mode":"all"}'
注意:"^message" 这个规则要根据本身修改,这个是指同步"message"开头的队列名称,咱们配置时使用的应用于全部队列,因此表达式为"^"
官方set_policy说明参见
set_policy [-p vhostpath] {name} {pattern} {definition} [priority]
(http://www.rabbitmq.com/man/rabbitmqctl.1.man.html)
建立策略
set_policy [-p vhostpath] {name} {pattern} {definition} [priority]
[root@mq02 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' Setting policy "ha-all" for pattern "^" to "{\"ha-mode\":\"all\"}" with priority "0" ...
查看策略:
[root@mq01 ~]# rabbitmqctl list_policies Listing policies ... / ha-all all ^ {"ha-mode":"all"} 0
注意:前面建立策略时没有指定vhost,则对默认的/ 虚拟主机建立策略
十二、将节点移出集群
将节点node2 移出集群前,先要stop_app,人后reset节点。
[root@mq02 ~]# rabbitmqctl stop_app Stopping node rabbit@mq02 ... [root@mq02 ~]# rabbitmqctl reset Resetting node rabbit@mq02 ... [root@mq02 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@mq02 ... [{nodes,[{disc,[rabbit@mq02]}]},{alarms,[]}]
node1上查看集群状态
[root@mq01 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@mq01 ... [{nodes,[{disc,[rabbit@mq01]}]}, {running_nodes,[rabbit@mq01]}, {cluster_name,<<"rabbit@mq01">>}, {partitions,[]}, {alarms,[{rabbit@mq01,[]}]}]
查看策略,仍然存在。
[root@mq01 ~]# rabbitmqctl list_policies Listing policies ... / ha-all all ^ {"ha-mode":"all"} 0
移除远程offline的节点
rabbitmqctl forget_cluster_node rabbit@mq02
上面的方法是在节点本地执行命令,将节点从集群中删除,可是若是节点出现故障,连不上节点时,就没法用这种方式删除节点了,咱们能够从远程节点删除该节点
注意:必须是远程节点offline时,才能执行执行此命令删除节点。不然报错
一、在node2 上停掉rabbitmq应用
[root@mq02 ~]# rabbitmqctl stop_app Stopping node rabbit@mq02 ...
二、在node1上执行删除节点命令,而后查看集群状态
[root@mq01 ~]# rabbitmqctl forget_cluster_node rabbit@mq02 Removing node rabbit@mq02 from cluster ... [root@mq01 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@mq01 ... [{nodes,[{disc,[rabbit@mq01]}]}, {running_nodes,[rabbit@mq01]}, {cluster_name,<<"my_cluster">>}, {partitions,[]}, {alarms,[{rabbit@mq01,[]}]}]
1三、集群上建立帐号
rabbitmqctl add_user user_name
[root@mq02 ~]# rabbitmqctl add_user spms 123456 Creating user "spms" ... [root@mq02 ~]# rabbitmqctl list_users Listing users ... spms [] guest [administrator]
[root@mq01 ~]# rabbitmqctl list_users Listing users ... spms [] guest [administrator]
能够看到,在任意节点上建立的帐号,会同步到其余节点上
1四、集群中建立vhost
rabbitmqctl add_vhost vhost_name
[root@mq01 ~]# rabbitmqctl add_vhost spms Creating vhost "spms" ... [root@mq01 ~]# rabbitmqctl list_vhosts Listing vhosts ... spms /
[root@mq02 ~]# rabbitmqctl list_vhosts Listing vhosts ... spms /
能够看到,在任意节点上建立的vhost,会同步到其余节点上
1五、设置vhost权限
rabbitmqctl set_permissions -p vhost_name username conf write read
[root@mq02 ~]# rabbitmqctl set_permissions -p spms spms '.*' '.*' '.*' Setting permissions for user "spms" in vhost "spms" ... [root@mq02 ~]# rabbitmqctl list_permissions Listing permissions in vhost "/" ... guest .* .* .* [root@mq02 ~]# rabbitmqctl list_permissions -p spms Listing permissions in vhost "spms" ... spms .* .* .*
[root@mq01 ~]# rabbitmqctl list_permissions Listing permissions in vhost "/" ... guest .* .* .* [root@mq01 ~]# rabbitmqctl list_permissions -p spms Listing permissions in vhost "spms" ... spms .* .* .*
1六、设置cluster_name
rabbitmqctl set_cluster_name cluster_name
[root@mq02 ~]# rabbitmqctl set_cluster_name my_cluster Setting cluster name to my_cluster ... [root@mq02 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@mq02 ... [{nodes,[{disc,[rabbit@mq01,rabbit@mq02]}]}, {running_nodes,[rabbit@mq01,rabbit@mq02]}, {cluster_name,<<"my_cluster">>}, {partitions,[]}, {alarms,[{rabbit@mq01,[]},{rabbit@mq02,[]}]}]