博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Erlang 0088] RabbitMQ 集群 Disc Node 一点实现细节
阅读量:7097 次
发布时间:2019-06-28

本文共 3276 字,大约阅读时间需要 10 分钟。

    刚开始使用rabbitmqctl 创建集群的时候会有一个问题,怎么控制节点是disk node还是ram node?翻看了rabbitmq2.8.7的代码看了一下才知道原委,记录一下:

 

 

先看下面的实验

   这个实验其实之前已经做过了,这里抽出来做对比:

[root@localhost scripts]#[root@localhost scripts]# RABBITMQ_NODE_PORT=9991 RABBITMQ_NODENAME=z_91@zen.com ./rabbitmq-server -detachedActivating RabbitMQ plugins ...0 plugins activated:[root@localhost scripts]# RABBITMQ_NODE_PORT=9992 RABBITMQ_NODENAME=z_92@zen.com ./rabbitmq-server -detachedActivating RabbitMQ plugins ...0 plugins activated:[root@localhost scripts]#  ./rabbitmq-util -n z_91@zen.com stop_appStopping node 'z_91@zen.com' ......done.[root@localhost scripts]#  ./rabbitmq-util -n z_91@zen.com resetResetting node 'z_91@zen.com' ......done.[root@localhost scripts]#  ./rabbitmq-util -n z_91@zen.com cluster z_92@zen.comClustering node 'z_91@zen.com' with ['z_92@zen.com'] ......done.[root@localhost scripts]#  ./rabbitmq-util -n z_91@zen.com start_appStarting node 'z_91@zen.com' ......done.[root@localhost scripts]#  ./rabbitmq-util -n z_91@zen.com cluster_statusCluster status of node 'z_91@zen.com' ...[{nodes,[{disc,['z_92@zen.com']},{ram,['z_91@zen.com']}]},{running_nodes,['z_92@zen.com','z_91@zen.com']}]...done.

 

   细心的你一定发现了,这里的结果有点奇怪,91节点将92节点拉入组成集群,但是disc节点是92,91节点是ram节点!这是怎么回事?下面换一种方式组建集群,目的是观察rabbitmq在构建集群是如何选择Disc node的.和第一种组建方式的差异在于这行命令: ./rabbitmq-util -n z_91@zen.com cluster z_92@zen.com z_91@zen.com    这样完成组建之后,查看一下集群状态,注意disk node的已经变成了:   [{nodes,[{disc,['z_91@zen.com','z_92@zen.com']}]},{running_nodes,['z_92@zen.com','z_91@zen.com']}]

[root@localhost scripts]#  ./rabbitmq-util -n z_91@zen.com stop_app     Stopping node 'z_91@zen.com' ......done.[root@localhost scripts]#  ./rabbitmq-util -n z_91@zen.com resetResetting node 'z_91@zen.com' ......done.[root@localhost scripts]#  ./rabbitmq-util -n z_91@zen.com cluster z_92@zen.com z_91@zen.comClustering node 'z_91@zen.com' with ['z_92@zen.com','z_91@zen.com'] ......done.[root@localhost scripts]#  ./rabbitmq-util -n z_91@zen.com start_appStarting node 'z_91@zen.com' ......done.[root@localhost scripts]#  ./rabbitmq-util -n z_91@zen.com cluster_statusCluster status of node 'z_91@zen.com' ...[{nodes,[{disc,['z_91@zen.com','z_92@zen.com']}]},{running_nodes,['z_92@zen.com','z_91@zen.com']}]...done.[root@localhost scripts]#  ./rabbitmq-util -n z_92@zen.com cluster_statusCluster status of node 'z_92@zen.com' ...[{nodes,[{disc,['z_91@zen.com','z_92@zen.com']}]},{running_nodes,['z_91@zen.com','z_92@zen.com']}]...done.[root@localhost scripts]#

 

WHY?

 

   我们先把答案说了,这是因为方法should_be_disc_node

 

should_be_disc_node(ClusterNodes) ->    ClusterNodes == [] orelse lists:member(node(), ClusterNodes).

 

   当集群初建的时候,没有节点是disk node,ClusterNodes为[]所以会把加入集群的第一个新节点设置为disk node;当ClusterNodes不为空的时候,只要ClusterNodes包含当前节点,就会把当前节点设置为disk node;ClusterNodes就是来自于rabbitmqctl cluster命令后跟的参数.

 

 下面是详细的代码跟进过程,不再赘述,代码里面对一些关键的地方加了补充说明,比较容易理解.

 

  rabbitmqctl的实现逻辑实际上是在rabbitcontrol模块,我们关注的是action(cluster...)分支:

..\rabbitmq-server-2.8.7\src\rabbit_control.erlaction(cluster, Node, ClusterNodeSs, _Opts, Inform) ->    ClusterNodes = lists:map(fun list_to_atom/1, ClusterNodeSs),    Inform("Clustering node ~p with ~p",           [Node, ClusterNodes]),    rpc_call(Node, rabbit_mnesia, cluster, [ClusterNodes]);

 

 rabbitcontrol 调用的是rabbit_mnesia的cluster方法,跟进去看:

 

rabbit_mnesia.erl

 

  代码太长了,展开看吧 : ) 

 

 最后,小图一张 我有一个一样的台灯

 

转载地址:http://yheql.baihongyu.com/

你可能感兴趣的文章
Ceph体系结构
查看>>
祝贺下,我终于在网上有个家啦~~~
查看>>
8086汇编——课堂笔记整理4
查看>>
按照Right-BICEP要求设计四则运算2程序的单元测试用例
查看>>
SpringMVC-Handler-Return Values返回值
查看>>
KVM网络桥接模式解说
查看>>
WebApp开发之--"rem"单位(转)
查看>>
TOPCODER->Practice Room->SRAM 144 DIV 1 (550)
查看>>
mysql 远程连接速度慢的解决方案
查看>>
一刷leetcode——dp
查看>>
android软键盘挡住输入框问题解决方法
查看>>
Angular企业级开发(10)-Smart Table插件开发
查看>>
POJ-3295 Tautology 构造法
查看>>
HDU-3573 Buy Sticks
查看>>
验证码的封装
查看>>
javascript与服务器1
查看>>
自制面试宝典
查看>>
PHP对象的复制
查看>>
使用代码模拟请求和提交网页数据
查看>>
C语言内存分配
查看>>