
环境:
*** 作系统:厘斯6.75
RabbitMQ版本:3.6.5
节点:
节点1:mq01172.16.42.128
节点2:mq02172.16.42.135
配置:
1.两台机器上都安装了RabbitMQ。
这里的安装包括socat、Erlang和rabbitmq-server包的安装,环境变量和配置文件已经配置好了。请参考RabbitMQ安装。不要急于创建用户、虚拟主机和配置权限。等到这些集群创建完毕。
2。配置主机文件
将两个MQ节点的计算机名更改为mq01和mq02,然后修改主机配置文件
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 mq02mq02
[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 mq023。复制erlang.cookie
Rabbitmq的集群是依附于erlang的集群的,所以首先要搭建erlang的集群场景。Erlang的集群中的每个节点都是通过一个神奇的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文件中。
4。启动rabbitmq服务
/etc/init.d/rabbitmq-server start在node2mq02上停止rabbitmq应用,复位(复位只是清除节点的配置,如果没有配置可以省略),然后加入node1集群。
[root@mq02 rabbitmq]# rabbitmqctl stop_app Stopping node rabbit@mq02 ...节点复位
rabbitmqctl reset5。加入集群
rabbitmqctl join_cluster rabbit@mq01启动rabbitmq应用程序
[root@mq02 ~]# rabbitmqctl start_app Starting node rabbit@mq02 ...6。检查集群状态
查看节点2上的集群状态
rabbitmqctl cluster_status查看节点1上的集群状态
[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,[]}]}]7。更改节点类型
有两种类型的节点:磁盘节点和内存节点。群集中必须至少有一个磁盘节点,否则队列元数据无法写入群集中。当磁盘节点关闭时,群集无法写入新的队列元数据信息。
从上面的集群状态可以看出,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,[]}]}]也可以只使用-ram参数将mq02添加到集群中,即设置mq02为内存节点。
注意:在改变节点类型之前,必须停止noderabbitmq的应用。
8。验证节点在崩溃后恢复时是否可以自动加入集群
停止节点2mq02的服务,并检查节点1上的群集状态
查看节点1上的集群状态
[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。
启动节点2的服务
[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,[]}]}]9。当磁盘节点挂起时
停止node1erlang虚拟机。
[root@mq01~]#rabbitmqctlstop
停止和暂停节点rabbit@mq01...
登录rabbitmqweb管理控制台,创建新队列并报告错误。
还原节点1erlang虚拟机服务
[root@mq01~]#/etc/init.d/rabbitMQ-服务器启动
启动rabbitmq-server:成功
rabbitMQ-服务器。
重新创建队列,成功
10。当磁盘节点挂起时
停止节点2erlang虚拟机
[root@mq02~]#rabbitmqctlstop
停止和暂停节点rabbit@mq02...
登录到node1的web管理控制台,创建一个新队列。成功
总结:
根据9和10的测试,如果集群中没有磁盘节点,集群无法创建新的队列元数据,但仍然可以工作。如果内存在某个点挂起,集群不会受到影响,这也是为什么集群中必须至少有一个磁盘节点,不能将单个节点设置为内存节点的原因。
十一。集群镜像模式
上面的集群模式是正常模式,镜像模式是在正常模式的基础上加上一些策略。它的本质不同于普通模式,因为消息实体将在镜像节点之间主动同步,而不是在消费者获取数据时临时拉取数据。这种模式带来的副作用也很明显。除了降低系统性能,如果镜像队列太多,大量消息进来,集群内部的网络带宽也会被这种同步通信大量消耗。因此适用于可靠性要求高的场合。如果一个队列希望成为镜像队列,则必须首先设置策略。然后,当客户端创建队列时,rabbitmqcluster会根据“队列名”自动将其设置为普通集群模式或镜像队列。如下所示:
通过队列策略启用镜像。策略可以随时改变,rabbitmq队列很可能会随着策略的改变而改变队列。非镜像队列和镜像队列是有区别的。前者缺少额外的镜像基础设施,也没有任何从设备,因此运行速度会更快。为了使队列称为镜像队列,您将创建一个策略来匹配该队列。有两个键用于设置策略“ha-mode和ha-params(可选)”。Ha-params根据Ha模式设置不同的值。下表描述了这些键的选项:
解释语法:
在集群中的任意节点启用策略,策略会自动同步到集群节点
rabbitmqctlset_policy-phrsystemha-allqueue""{"ha-mode":"all"}'
该命令在vhost中创建一个名称为HRsystem的策略。策略名为ha-allqueue,策略模式为all,即复制到所有节点,包括新添加的节点。策略正则表达式是“”,这意味着所有匹配的队列名称。
比如rabbitmqctlset_policy-pHRsystemha-allqueue"message"'{"ha-mode":"all"}'
注意:这个"message"的规则要根据自己修改。这是指以“message”开头的队列的名称。我们的配置中使用的适用于所有队列,因此表达式为""
See
set_policy[-pvhostpath]{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,您将为默认/虚拟主机创建策略。
12。将节点移出群集
在将node2移出集群之前,您需要首先停止_app,然后重置该节点。
[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,[]}]查看节点1上的集群状态
[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删除远程脱机的节点
上面的方法是在本地执行命令,将节点从集群中删除,但是如果节点出现故障,无法连接,则无法通过这种方式删除。我们可以从远程节点中删除该节点。
注意:只有当远程节点脱机时,才可以执行此命令来删除节点。否则,报告一个错误。
1.停止节点2上的rabbitmq应用程序
2.在node1上执行deletenode命令,然后检查集群状态。
[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,[]}]}]13.在群集上创建一个帐户。
rabbitmqctl add_user user_name如您所见,在任何节点上创建的帐户都将与其他节点同步。
14。在集群中创建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都将与其他节点同步。
15。设置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 .* .* .*16.设置集群名称。
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,[]}]}]参考:http://www.rabbitmq.com/man/rabbitmqctl.1.man.html
http://www.rabbitmq.com/clustering.html
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)