RabbitMQ队列入门实战(4)---- RabbitMQ集群搭建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a2011480169/article/details/80713448

集群搭建示意图:(4台服务器的节点)

 
RabbitMQ Cluster:
RabbitMQ是一个消息代理,是一个或多个Erlang节点的逻辑分组,每个节点运行RabbitMQ应用程序并共享
用户、虚拟主机、队列、交换、绑定和运行时参数,我们将节点集合称为集群。

(1)主机名解析可以使用任何标准的操作系统提供的方法:
    DNS记录
    本地主机文件(例如/etc/hosts)

(2) 端口访问 telnet  172.22.185.11 5672
    5672: 程序客户端使用
    25672: 用于集群节点间相互通信
    15672:HTTP API客户端、管理UI和rabbitmq admin(仅当管理插件启用时)

集群中的节点:
什么是队列?
运行RabbitMQ代理所需的所有数据/状态都将在所有节点上进行复制。一个例外是消
息队列,默认情况下驻留在一个节点上,尽管它们可以从所有节点看到并且可以访问。要
在集群中的节点间复制队列,请参阅有关高可用性的文档.
队列镜像允许队列内容跨多个群集节点复制。
非镜像队列也可以在群集中使用。节点故障情况下的非镜像队列行为取决于队列的持久性。


节点是平等的同辈
一些分布式系统具有领导者和追随者节点。RabbitMQ通常不适用。RabbitMQ集群
中的所有节点都是相同的对等节点:RabbitMQ内核中没有特殊的节点。当考虑队列镜像和插件时,该主题变得更加细微,
但对于大多数意图和目的,所有群集节点都应该被视为相同.
许多CLI工具操作都可以针对任何节点执行。一个HTTP API客户端可以针对任何群集节点。


节点之间如何相互验证:Erlang Cookie
RabbitMQ节点和CLI工具(例如rabbitmqctl)使用cookie来确定它们是否被允许相互通信。
要使两个节点能够通信,它们必须具有相同的共享密钥,称为Erlang Cookie。该cookie只是一
个字母数字字符串,最多可达255个字符。它通常存储在本地文件中,每个群集节点必须具有相同的cookie。
在UNIX系统上,cookie通常位于/var/lib/rabbitmq/.erlang.cookie(由服务器使用)
和$HOME/.erlang.cookie(由CLI工具使用)中。


节点故障处理
RabbitMQ代理可以容忍单个节点的故障。节点可以随意启动和停止,只要它们
可以联系已关闭时已知的集群成员节点即可。

磁盘和RAM节点
节点可以是磁盘节点或RAM节点。RAM节点仅将内部数据库表存储在RAM中。(这不包括消息,消息存储索引,队列索引和其他节点状态。)
在绝大多数情况下,您希望所有节点都是磁盘节点; ========> 我不是这样想的.
RAM节点是一种特殊情况,可用于改善具有高排队,交换或绑定流失的性能集群。RAM节点不提供更高的消息速率。====> 什么意思啊?
如有疑问,请仅使用磁盘节点。
由于RAM节点仅将内部数据库表存储在RAM中,因此它们必须在启动时从对等节点同步它们。
这意味着群集必须至少包含一个磁盘节点。因此无法手动删除群集中剩余的最后一个磁盘节点。==> 无法手动删除最后一个磁盘节点.


一、单台节点上服务的搭建:(6个步骤) root用户安装.

(1)检查节点的服务是否已经启动:
   rabbitmqctl cluster_status

(2)如果rabbitmqctl服务启动当中,将服务直接卸载:
   yum remove rabbitmq-server

   提示:Removed:  rabbitmq-server.noarch 0:3.6.5-1.el7
       Complete!

(3)安装并启动rabbitMQ服务:
   yum  install  rabbitmq-server
   systemctl  start rabbitmq-server

   注意:在启动服务的过程当中,可能会抛出下面的错误:(可以再次systemctl  start rabbitmq-server可能成功!! )
   [root@BJHC-Client-18511 man1]# systemctl  start rabbitmq-server
   Job for rabbitmq-server.service failed because the control process exited with error code.
   See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details.

   解决方案参考:https://www.cnblogs.com/straycats/p/7719933.html

(4)检查rabbitMQ服务是否启动成功
   [root@BJHC-Client-18511 mnesia]#rabbitmqctl cluster_status
    Cluster status of node 'rabbit@BJHC-Client-18511' ...
    [{nodes,[{disc,['rabbit@BJHC-Client-18511']}]},
     {running_nodes,['rabbit@BJHC-Client-18511']},
     {cluster_name,<<"[email protected]">>},
     {partitions,[]},
     {alarms,[{'rabbit@BJHC-Clirabbitmqctl  cluster_statusent-18511',[]}]}]

(5)开启web管理界面插件
   rabbitmq-plugins enable rabbitmq_management

   校验:登录 http://172.22.185.11:15672 页面进行查看.

   172.22.144.123   BJHC-Client-144123
(6)重启rabbitMQ服务
   systemctl   restart rabbitmq-server


常用命令的总结:
rabbitmqctl  add_vhost xxx                #创建vhost
rabbitmqctl  list_vhosts                  #遍历所有vhost信息
rabbitmqctl  delete_vhost xxx             #删除vhost
rabbitmqctl  add_user jack 123456         #添加用户jack密码为123456
rabbitmqctl  change_password jack 654321  #更改jack用户的密码为654321
rabbitmqctl  set_permissions -p xxx jack ".*" ".*" ".*"  #绑定jack用户对xxx的vhost的读写权限
rabbitmqctl  list_queues #列出所有队列

虚拟主机的使用:
self.conn = pika.BlockingConnection(pika.ConnectionParameters(host='localhost',port=5672,virtual_host=''))
self.channel = self.conn.channel()


集群搭建:
Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。而Erlang的集群
中各节点是通过一个magic cookie来实现的,这个cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,
文件是400的权限。所以必须保证各节点cookie保持一致,否则节点之间就无法通信。

[root@BJHC-Client-144118 dd_edw]# more /var/lib/rabbitmq/.erlang.cookie
CWEMCCIQRYPVADFREMWE


(1)在一的基础上通过scp同步magic cookie.
[root@BJHC-Client-18511 dd_edw]# scp /var/lib/rabbitmq/.erlang.cookie  172.22.185.12:/var/lib/rabbitmq/.erlang.cookie
[email protected]'s password:
.erlang.cookie                                                                          100%   20     0.0KB/s   00:00
[root@BJHC-Client-18511 dd_edw]# scp /var/lib/rabbitmq/.erlang.cookie  172.22.185.13:/var/lib/rabbitmq/.erlang.cookie
[email protected]'s password:
.erlang.cookie                                                                          100%   20     0.0KB/s   00:00


(2)随后停止所有节点的RabbitMQ服务.
systemctl  stop  rabbitmq-server


(3)通过detached参数启动独立节点(所有节点都进行操作)
[root@BJHC-Client-18511 dd_edw]# rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
注意:如果出现下面的错误(是因为在后台这个服务已经启动了,直接找到进程杀死即可.)
ps aux|grep erl
ps -ef |grep rabbitmq
参考博客:https://www.cnblogs.com/Sisiflying/p/6386988.html


(4)查看各rabbitMQ节点的服务状态
[root@BJHC-Client-18511 dd_edw]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJHC-Client-18511' ...  =======>本身就是一个cluster
[{nodes,[{disc,['rabbit@BJHC-Client-18511']}]},
 {running_nodes,['rabbit@BJHC-Client-18511']},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJHC-Client-18511',[]}]}]

[root@BJHC-Client-18512 sister_rabbit_mq]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJHC-Client-18512' ...  =======>本身就是一个cluster
[{nodes,[{disc,['rabbit@BJHC-Client-18512']}]},
 {running_nodes,['rabbit@BJHC-Client-18512']},
 {cluster_name,<<"rabbit@BJHC-Client-18512">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJHC-Client-18512',[]}]}]

[root@BJHC-Client-18513 zhang]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJHC-Client-18513' ...  =======>本身就是一个cluster
[{nodes,[{disc,['rabbit@BJHC-Client-18513']}]},
 {running_nodes,['rabbit@BJHC-Client-18513']},
 {cluster_name,<<"rabbit@BJHC-Client-18513">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJHC-Client-18513',[]}]}]



(5)各节点集群入伙集群,创建集群
为了连接集群中的三个节点,我们告诉其中的两个节点:
rabbit@BJHC-Client-18511、
rabbit@BJHC-Client-18512、
加入第三个节点的集群rabbit@BJHC-Client-18513。

我们首先将rabbit@BJHC-Client-18511与rabbit@BJHC-Client-18513连接在一个集群当中:
[root@BJHC-Client-18511 dd_edw]#  rabbitmqctl  stop_app   #停止应程序
Stopping node 'rabbit@BJHC-Client-18511' ...

[root@BJHC-Client-18511 dd_edw]# rabbitmqctl   reset      #清空元数据
Resetting node 'rabbit@BJHC-Client-18511' ...


注意:因为加入群集会隐式的重置节点,进而删除先前存在于该节点上的所有资源和数据,所以我认为上面这个步骤是多余的.


[root@BJHC-Client-18511 dd_edw]# rabbitmqctl  join_cluster rabbit@BJHC-Client-18513 --ram #将rabbit@BJHC-Client-18511节点添加到rabbit@BJHC-Client-18513节点所在的集群当中,并设置为内存节点,不加--ram默认是磁盘节点
Clustering node 'rabbit@BJHC-Client-18511' with 'rabbit@BJHC-Client-18513' ...

注意:上面一个步骤是将节点rabbit@BJHC-Client-18511加入到rabbit@BJHC-Client-18513节点所在的集群当中.


注意:执行完这个步骤之后我们分别可以在rabbit@BJHC-Client-18511节点和rabbit@BJHC-Client-18513节点查看一
下集群的相关状态(看到的是不一样的,我个人认为这个步骤没有必要).
[root@BJHC-Client-18511 dd_edw]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJHC-Client-18511' ...
[{nodes,[{disc,['rabbit@BJHC-Client-18513']},
         {ram,['rabbit@BJHC-Client-18511']}]},
 {alarms,[{'rabbit@BJHC-Client-18513',[]}]}]

[root@BJHC-Client-18513 dd_edw]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJHC-Client-18513' ...
[{nodes,[{disc,['rabbit@BJHC-Client-18513']},
         {ram,['rabbit@BJHC-Client-18511']}]},
 {running_nodes,['rabbit@BJHC-Client-18513']},
 {cluster_name,<<"rabbit@BJHC-Client-18513">>},  ==> 集群的名字
 {partitions,[]},
 {alarms,[{'rabbit@BJHC-Client-18513',[]}]}]

[root@BJHC-Client-18511 dd_edw]# rabbitmqctl  start_app #不要忘记启动应用程序
Starting node 'rabbit@BJHC-Client-18511' ...

执行完这个步骤之后我们分别可以在rabbit@BJHC-Client-18511节点和rabbit@BJHC-Client-18513节点查看一
下集群的相关状态:(这下看到的是一致的)
[root@BJHC-Client-18511 dd_edw]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJHC-Client-18511' ...
[{nodes,[{disc,['rabbit@BJHC-Client-18513']},
         {ram,['rabbit@BJHC-Client-18511']}]},
 {running_nodes,['rabbit@BJHC-Client-18513','rabbit@BJHC-Client-18511']},
 {cluster_name,<<"rabbit@BJHC-Client-18513">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJHC-Client-18513',[]},{'rabbit@BJHC-Client-18511',[]}]}]

[root@BJHC-Client-18513 dd_edw]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJHC-Client-18513' ...
[{nodes,[{disc,['rabbit@BJHC-Client-18513']},
         {ram,['rabbit@BJHC-Client-18511']}]},
 {running_nodes,['rabbit@BJHC-Client-18511','rabbit@BJHC-Client-18513']},
 {cluster_name,<<"rabbit@BJHC-Client-18513">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJHC-Client-18511',[]},{'rabbit@BJHC-Client-18513',[]}]}]

(6)接下来我们将节点rabbit@BJHC-Client-18512加入到集群rabbit@BJHC-Client-18513当中.
注意:选择进行群集的节点并不重要 - 只需提供一个集群中在线的节点就足够了,并且该节点将聚集到群集指定的节点属于。
[root@BJHC-Client-18512 dd_edw]# rabbitmqctl stop_app
Stopping node 'rabbit@BJHC-Client-18512' ...
[root@BJHC-Client-18512 dd_edw]# rabbitmqctl  join_cluster rabbit@BJHC-Client-18511  #将rabbit@BJHC-Client-18512节点添加到rabbit@BJHC-Client-18512节点所在的集群当中(即随便提供一个集群当中的在线节点就行.)
Clustering node 'rabbit@BJHC-Client-18512' with 'rabbit@BJHC-Client-18511' ...
[root@BJHC-Client-18512 dd_edw]# rabbitmqctl start_app
Starting node 'rabbit@BJHC-Client-18512' ...
[root@BJHC-Client-18512 dd_edw]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJHC-Client-18512' ...
[{nodes,[{disc,['rabbit@BJHC-Client-18512','rabbit@BJHC-Client-18513']},
         {ram,['rabbit@BJHC-Client-18511']}]},
 {running_nodes,['rabbit@BJHC-Client-18511','rabbit@BJHC-Client-18513',
                 'rabbit@BJHC-Client-18512']},
 {cluster_name,<<"rabbit@BJHC-Client-18513">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJHC-Client-18511',[]},
          {'rabbit@BJHC-Client-18513',[]},
          {'rabbit@BJHC-Client-18512',[]}]}]===============>集群搭建完毕.





集群当中重新启动群集节点:
注意:如果集群当中的节点停止(shut down)或者崩溃。在这两种情况下,群集的其余部分节点都会继续运行,并且
当节点再次启动时,节点会自动与其他群集节点同步。

我们现在 shut down 节点rabbit@BJHC-Client-18511和rabbit@BJHC-Client-18512,并检查cluster status.
[root@BJHC-Client-18511 dd_edw]# rabbitmqctl stop  ===> 注意:不是stop_app
Stopping and halting node 'rabbit@BJHC-Client-18511' ...

[root@BJHC-Client-18512 dd_edw]# rabbitmqctl stop  ===> 注意:不是stop_app
Stopping and halting node 'rabbit@BJHC-Client-18512' ...

[root@BJHC-Client-18513 dd_edw]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJHC-Client-18513' ...
[{nodes,[{disc,['rabbit@BJHC-Client-18512','rabbit@BJHC-Client-18513']},
         {ram,['rabbit@BJHC-Client-18511']}]},
 {running_nodes,['rabbit@BJHC-Client-18513']},   ======> 此时正在运行只有一个节点
 {cluster_name,<<"rabbit@BJHC-Client-18513">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJHC-Client-18513',[]}]}]


然后我们在将这两个节点nodes start again, 检查cluster status:
[root@BJHC-Client-18511 dd_edw]# rabbitmq-server -detached
Warning: PID file not written; -detached was passed.

[root@BJHC-Client-18512 dd_edw]# rabbitmq-server -detached
Warning: PID file not written; -detached was passed.

[root@BJHC-Client-18513 dd_edw]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJHC-Client-18513' ...
[{nodes,[{disc,['rabbit@BJHC-Client-18512','rabbit@BJHC-Client-18513']},
         {ram,['rabbit@BJHC-Client-18511']}]},
 {running_nodes,['rabbit@BJHC-Client-18512','rabbit@BJHC-Client-18511',
                 'rabbit@BJHC-Client-18513']},  ===> 此时三个节点都重新回到运行状态
 {cluster_name,<<"rabbit@BJHC-Client-18513">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJHC-Client-18512',[]},
          {'rabbit@BJHC-Client-18511',[]},
          {'rabbit@BJHC-Client-18513',[]}]}]


集群当中加入新的节点:
(1)先执行 ==> 一、单台节点上服务的搭建:(6个步骤) root用户安装.

(2)通过scp同步集群当中的magic cookie.(或者直接粘贴)
[root@BJHC-Client-18511 dd_edw]# scp /var/lib/rabbitmq/.erlang.cookie  172.21.50.10:/var/lib/rabbitmq/.erlang.cookie
[email protected]'s password:
.erlang.cookie

(3)随后停止该节点的RabbitMQ服务.
systemctl  stop  rabbitmq-server


(4)通过detached参数启动该独立节点
[root@BJHC-Client-18511 dd_edw]# rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
注意:如果出现下面的错误(是因为在后台这个服务已经启动了,直接找到进程杀死即可.)
ps aux|grep erl
ps -ef |grep rabbitmq
参考博客:https://www.cnblogs.com/Sisiflying/p/6386988.html


(5)查看该rabbitMQ节点的服务状态
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJLFRZ-Client-50-10' ...
[{nodes,[{disc,['rabbit@BJLFRZ-Client-50-10']}]},
 {running_nodes,['rabbit@BJLFRZ-Client-50-10']},
 {cluster_name,<<"rabbit@BJLFRZ-Client-50-10">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJLFRZ-Client-50-10',[]}]}]


(6)加入RabbitMQ集群当中.
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl stop_app
Stopping node 'rabbit@BJLFRZ-Client-50-10' ...
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl  join_cluster rabbit@BJHC-Client-18511
Clustering node 'rabbit@BJLFRZ-Client-50-10' with 'rabbit@BJHC-Client-18511' ...
[root@BJLFRZ-Client-50-10 bdp_client]# start_app
bash: start_app: command not found
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl start_app
Starting node 'rabbit@BJLFRZ-Client-50-10' ...
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJLFRZ-Client-50-10' ...
[{nodes,[{disc,['rabbit@BJHC-Client-18512','rabbit@BJHC-Client-18513',
                'rabbit@BJLFRZ-Client-50-10']},
         {ram,['rabbit@BJHC-Client-18511']}]},
 {running_nodes,['rabbit@BJHC-Client-18511','rabbit@BJHC-Client-18512',
                 'rabbit@BJHC-Client-18513','rabbit@BJLFRZ-Client-50-10']},
 {cluster_name,<<"rabbit@BJHC-Client-18513">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJHC-Client-18511',[]},
          {'rabbit@BJHC-Client-18512',[]},
          {'rabbit@BJHC-Client-18513',[]},
          {'rabbit@BJLFRZ-Client-50-10',[]}]}]

到这里为止集群就会新增加一个节点了.


集群当中删除某一个节点:(注意:除了下面两种操作,RabbitMQ节点不会从群集中永久删除其对等节点。)
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl stop_app
Stopping node 'rabbit@BJLFRZ-Client-50-10' ...
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl reset
Resetting node 'rabbit@BJLFRZ-Client-50-10' ...
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl start_app
Starting node 'rabbit@BJLFRZ-Client-50-10' ...
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJLFRZ-Client-50-10' ...
[{nodes,[{disc,['rabbit@BJLFRZ-Client-50-10']}]},
 {running_nodes,['rabbit@BJLFRZ-Client-50-10']},
 {cluster_name,<<"rabbit@BJLFRZ-Client-50-10">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJLFRZ-Client-50-10',[]}]}]

此时我们在查看集群的状况:
[root@BJHC-Client-18512 dd_edw]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJHC-Client-18512' ...
[{nodes,[{disc,['rabbit@BJHC-Client-18512','rabbit@BJHC-Client-18513']},
         {ram,['rabbit@BJHC-Client-18511']}]},   ===> 此时集群当中已经不包含rabbit@BJLFRZ-Client-50-10这个节点.
 {running_nodes,['rabbit@BJHC-Client-18511','rabbit@BJHC-Client-18513',
                 'rabbit@BJHC-Client-18512']},
 {cluster_name,<<"rabbit@BJHC-Client-18513">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJHC-Client-18511',[]},
          {'rabbit@BJHC-Client-18513',[]},
          {'rabbit@BJHC-Client-18512',[]}]}]

远程删除节点:
我们也可以远程删除节点。例如,当需要处理无响应的节点时,这非常有用.
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl stop_app  (此时rabbit@BJLFRZ-Client-50-10节点没有响应了.)
Stopping node 'rabbit@BJLFRZ-Client-50-10' ...

[root@BJHC-Client-18513 dd_edw]# rabbitmqctl forget_cluster_node rabbit@BJLFRZ-Client-50-10  ==> 通过rabbit@BJHC-Client-18513远程删除rabbit@BJLFRZ-Client-50-10节点.
Removing node 'rabbit@BJLFRZ-Client-50-10' from cluster ...

此时我们在rabbit@BJHC-Client-18513上面查看一下集群的状态:
[root@BJHC-Client-18513 dd_edw]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJHC-Client-18513' ...
[{nodes,[{disc,['rabbit@BJHC-Client-18512','rabbit@BJHC-Client-18513']},
         {ram,['rabbit@BJHC-Client-18511']}]},  ==> 此时5010节点已经不再集群当中.
 {running_nodes,['rabbit@BJHC-Client-18511','rabbit@BJHC-Client-18512',
                 'rabbit@BJHC-Client-18513']},
 {cluster_name,<<"rabbit@BJHC-Client-18513">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJHC-Client-18511',[]},
          {'rabbit@BJHC-Client-18512',[]},
          {'rabbit@BJHC-Client-18513',[]}]}]

请注意,rabbit@BJLFRZ-Client-50-10仍然认为它是rabbit@BJHC-Client-18513集群当中的一员,并试图启
动它会导致错误。我们需要重置它才能重新启动它。

Stopping node 'rabbit@BJLFRZ-Client-50-10' ...
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl cluster_status    ==>  还认为它是rabbit@BJHC-Client-18513集群当中的一员
Cluster status of node 'rabbit@BJLFRZ-Client-50-10' ...
[{nodes,[{disc,['rabbit@BJHC-Client-18512','rabbit@BJHC-Client-18513',
                'rabbit@BJLFRZ-Client-50-10']},
         {ram,['rabbit@BJHC-Client-18511']}]},
 {alarms,[{'rabbit@BJHC-Client-18511',[]},
          {'rabbit@BJHC-Client-18512',[]},
          {'rabbit@BJHC-Client-18513',[]}]}]
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl start_app  ==> 试图启动它会导致错误.
Starting node 'rabbit@BJLFRZ-Client-50-10' ...


BOOT FAILED
===========

Error description:
   {error,{inconsistent_cluster,"Node 'rabbit@BJLFRZ-Client-50-10' thinks it's clustered with node 'rabbit@BJHC-Client-18513', but 'rabbit@BJHC-Client-18513' disagrees"}}

Log files (may contain more information):
   /var/log/rabbitmq/[email protected]
   /var/log/rabbitmq/[email protected]

Stack trace:
   [{rabbit_mnesia,check_cluster_consistency,0,
                   [{file,"src/rabbit_mnesia.erl"},{line,598}]},
    {rabbit,'-start/0-fun-0-',0,[{file,"src/rabbit.erl"},{line,260}]},
    {rabbit,start_it,1,[{file,"src/rabbit.erl"},{line,296}]},
    {rpc,'-handle_call_call/6-fun-0-',5,[{file,"rpc.erl"},{line,206}]}]

Error: {error,{inconsistent_cluster,"Node 'rabbit@BJLFRZ-Client-50-10' thinks it's clustered with node 'rabbit@BJHC-Client-18513', but 'rabbit@BJHC-Client-18513' disagrees"}}
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl reset   ==> 需要重置它才能重新启动它
Resetting node 'rabbit@BJLFRZ-Client-50-10' ...
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl start_app
Starting node 'rabbit@BJLFRZ-Client-50-10' ...
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BJLFRZ-Client-50-10' ...
[{nodes,[{disc,['rabbit@BJLFRZ-Client-50-10']}]},
 {running_nodes,['rabbit@BJLFRZ-Client-50-10']},
 {cluster_name,<<"rabbit@BJLFRZ-Client-50-10">>},
 {partitions,[]},
 {alarms,[{'rabbit@BJLFRZ-Client-50-10',[]}]}]

重新初始化某个节点的操作(官网):
rabbit2$ rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl reset
Resetting node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl start_app
          Starting node rabbit@rabbit2 ...done.

更改节点类型:
我们可以将节点的类型从ram更改为disc,反之亦然。。为此,我们可以使用
change_cluster_node_type命令,该节点必须先停止。

(1)将rabbit@BJHC-Client-18511节点改为磁盘节点
[root@BJHC-Client-18511 dd_edw]# rabbitmqctl stop_app
Stopping node 'rabbit@BJHC-Client-18511' ...
[root@BJHC-Client-18511 dd_edw]# rabbitmqctl change_cluster_node_type disk
Turning 'rabbit@BJHC-Client-18511' into a disc node ...
[root@BJHC-Client-18511 dd_edw]# rabbitmqctl start_app
Starting node 'rabbit@BJHC-Client-18511' ...


(2)将rabbit@BJLFRZ-Client-50-10节点改为内存节点
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl stop_app
Stopping node 'rabbit@BJLFRZ-Client-50-10' ...
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl change_cluster_node_type ram
Turning 'rabbit@BJLFRZ-Client-50-10' into a ram node ...
[root@BJLFRZ-Client-50-10 bdp_client]# rabbitmqctl start_app
Starting node 'rabbit@BJLFRZ-Client-50-10' ...



rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all","ha-sync-mode":"automatic"}'


搭建rabbitmq的镜像高可用模式集群:https://www.cnblogs.com/knowledgesea/archive/2017/03/11/6535766.html
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

注意:不是下面的命令:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
 

猜你喜欢

转载自blog.csdn.net/a2011480169/article/details/80713448