您的位置:首页 > 其它

RabbitMQ单机集群搭建

2017-06-25 18:20 537 查看
搭建前容我先吐槽下,因为第一次接触rabbitmq,从安装到启动到查看rabbitmq-web页面,这些都比较简单,但是关于单机部署多个实例,我按照资料设置,总会遇到各种问题,书本,博文,百度了很多,几乎千片一律,不过最后还是在谷歌上搜到了蛛丝马迹, 由于我们使用的版本太新了,所以有些资料自然就过期了!

下面开始正式搭建:

系统:mac

rabbitmq:3.6.9,当前时间最新版。

1.安装步骤略。

(建议使用命令brew install rabbitmq, 安装卸载都比较方便)


2.正式启动时,先了解几个概念

a. 先启动默认rabbit


到rabbitmq安装目录的sbin目录下
$ ./rabbitmq-server -detached

(后台式启动,缺点部分错误显示不出来,我就被坑了,可以使用不加【-detached】方式启动,缺点多开几个终端窗口。)


b. 查看状态


zhanghuilongdeMacBook-Pro:sbin zhanghuilong$ ./rabbitmqctl status
Status of node rabbit@localhost ...
[{pid,21180},
{running_applications,
[{rabbitmq_management_visualiser,"RabbitMQ Visualiser","3.6.9"},
{rabbitmq_management,"RabbitMQ Management Console","3.6.9"},
{rabbitmq_stomp,"RabbitMQ STOMP plugin","3.6.9"},
{rabbitmq_amqp1_0,"AMQP 1.0 support for RabbitMQ","3.6.9"},
{rabbitmq_management_agent,"RabbitMQ Management Agent","3.6.9"},
{rabbitmq_mqtt,"RabbitMQ MQTT Adapter","3.6.9"},
{rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.6.9"},
{rabbit,"RabbitMQ","3.6.9"},
{os_mon,"CPO  CXC 138 46","2.4.2"},
{amqp_client,"RabbitMQ AMQP Client","3.6.9"},
{rabbit_common,
"Modules shared by rabbitmq-server and rabbitmq-erlang-client",
"3.6.9"},
{compiler,"ERTS  CXC 138 10","7.0.4"},
{xmerl,"XML parser","1.3.13"},
{cowboy,"Small, fast, modular HTTP server.","1.0.4"},
{ranch,"Socket acceptor pool for TCP protocols.","1.3.0"},
{ssl,"Erlang/OTP SSL application","8.1.1"},
{public_key,"Public key infrastructure","1.4"},
{cowlib,"Support library for manipulating Web protocols.","1.0.2"},
{inets,"INETS  CXC 138 49","6.3.6"},
{asn1,"The Erlang ASN1 compiler version 4.0.4","4.0.4"},
{crypto,"CRYPTO","3.7.3"},
{sasl,"SASL  CXC 138 11","3.0.3"},
{mnesia,"MNESIA  CXC 138 12","4.14.3"},
{syntax_tools,"Syntax tools","2.1.1"},
{stdlib,"ERTS  CXC 138 10","3.3"},
{kernel,"ERTS  CXC 138 10","5.2"}]},
{os,{unix,darwin}},
{erlang_version,
"Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:4:4] [async-threads:64] [hipe] [kernel-poll:true] [dtrace]\n"},
{memory,
[{total,64052888},
{connection_readers,0},
{connection_writers,0},
{connection_channels,0},
{connection_other,2848},
{queue_procs,2848},
{queue_slave_procs,0},
{plugins,2143792},
{other_proc,21306640},
{mnesia,68232},
{metrics,195768},
{mgmt_db,520592},
{msg_index,90240},
{other_ets,2840016},
{binary,149864},
{code,25297221},
{atom,1041593},
{other_system,10586154}]},
{alarms,[]},
**核心点:**
{listeners,
[{clustering,25672,"::"},
{amqp,5672,"127.0.0.1"},
{mqtt,1883,"::"},
{stomp,61613,"::"},
{http,15672,"::"}]},

{vm_memory_high_watermark,0.4},
{vm_memory_limit,2799457075},
{disk_free_limit,50000000},
{disk_free,175823912960},
{file_descriptors,
[{total_limit,7068},
{total_used,2},
{sockets_limit,6359},
{sockets_used,0}]},
{processes,[{limit,1048576},{used,370}]},
{run_queue,0},
{uptime,34586},
{kernel,{net_ticktime,60}}]


一般的文章或者书籍,上来就会让你执行类似于下面的命令

不过我觉得对于新人来说过于简陋和不负责任!!!

RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detached
RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
RABBITMQ_NODE_PORT=5674 RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached


如果你按照类似的文章操作,也许你会成功,但我想大多数可能会遇到错误提示,而且很棘手,让人很无语。

官方文档中关于集群的指导中也是这样提到



我们从刚刚贴出的第一个节点的status 可以看到,这样的一段记录

zhanghuilongdeMacBook-Pro:sbin zhanghuilong$ ./rabbitmqctl status
Status of node rabbit@localhost ...
....略...

{listeners,
[{clustering,25672,"::"},
{amqp,5672,"127.0.0.1"},
{mqtt,1883,"::"},
{stomp,61613,"::"},
{http,15672,"::"}]},


默认启动的是rabbit@localhost

如果在启动过程,你不指定hostname,那默认都是localhost,假如你的hosts又没有配置127.0.0.1 localhost 的话,就会报下面的错了。

ERROR: epmd error for host localhost: nxdomain (non-existing domain)


3.启动第一个节点

下面的一张截图是我配置了hosts,指定了特定hostname启动的,当然你也可以指定 为localhost。

RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit@zhanghuilongdeMacBook-Pro ./rabbitmq-server




成功后的web:http://127.0.0.1:15672/#/



接着上面的,启动第二个节点,如果我们还是按照

RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit_1@zhanghuilongdeMacBook-Pro rabbitmq-server -detached


你可能发现不了什么,假如你去掉-detached 你会发现,最后你得到了一个这样的错误信息:崩溃了的信息。。。

Crash dump is being written to: erl_crash.dump...done


往上翻信息或者查看日志,你会看到这样的提示:

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

Error description:
{could_not_start,rabbitmq_mqtt,
{{shutdown,
{failed_to_start_child,'rabbit_mqtt_listener_sup_:::1883',
{shutdown,
{failed_to_start_child,
{ranch_listener_sup,{acceptor,{0,0,0,0,0,0,0,0},1883}},
{shutdown,
{failed_to_start_child,ranch_acceptors_sup,
{listen_error,
{acceptor,{0,0,0,0,0,0,0,0},1883},
eaddrinuse}}}}}}},
{rabbit_mqtt,start,[normal,[]]}}}


那问题很明显了,端口监听这个位置 ‘rabbit_mqtt_listener_sup_:::1883出现问题了。

详细看下:http://www.rabbitmq.com/clustering.html#overview-hostname-requirements

你就会理解了。如何正确启动第二节点呢?可想而知在端口上要避免冲突,就需要设置一些必要的参数了。

3. 启动第二个节点

#节点2
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}] -rabbitmq_stomp tcp_listeners [61614] -rabbitmq_mqtt  tcp_listeners [1884]" RABBITMQ_NODENAME=rabbit1 ./rabbitmq-server -detached


如果启动正常,会显示下面的提示:

zhanghuilongdeMacBook-Pro:sbin zhanghuilong$ RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}] -rabbitmq_stomp tcp_listeners [61614] -rabbitmq_mqtt  tcp_listeners [1884]" RABBITMQ_NODENAME=rabbit1@zhanghuilongdeMacBook-Pro ./rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
zhanghuilongdeMacBook-Pro:sbin zhanghuilong$


当然,你也可以查看当前节点状态,注意不能使用:./rabbitmqctl status,否则会如下所示:

zhanghuilongdeMacBook-Pro:sbin zhanghuilong$ ./rabbitmqctl status
Status of node rabbit@localhost ...
Error: unable to connect to node rabbit@localhost: nodedown

DIAGNOSTICS
===========

attempted to contact: [rabbit@localhost]

rabbit@localhost:
* unable to connect to epmd (port 4369) on localhost: nxdomain (non-existing domain)

current node details:
- node name: 'rabbitmq-cli-01@zhanghuilongdeMacBook-Pro'
- home dir: /Users/zhanghuilong
- cookie hash: bolAngw+/LHA74YduKm11w==


这里需要指定节点名称:./rabbitmqctl status -n rabbit1

zhanghuilongdeMacBook-Pro:sbin zhanghuilong$ ./rabbitmqctl status  -n rabbit1
Status of node 'rabbit1@zhanghuilongdeMacBook-Pro' ...
[{pid,41257},
{running_applications,
[{rabbitmq_management_visualiser,"RabbitMQ Visualiser","3.6.9"},
...


同理你可以启动节点3,相应的端口号+1即可,只要不冲突就行。

#节点3
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}] -rabbitmq_stomp tcp_listeners [61615] -rabbitmq_mqtt tcp_listeners [1885]" RABBITMQ_NODENAME=rabbit2 ./rabbitmq-server -detached


这样的话你可以通过:http://127.0.0.1:15672/#/http://127.0.0.1:15673/#/http://127.0.0.1:15674/#/

访问web查看相关节点是否真的存在。下面就是如何实现集群操作了。

4.集群操作

建议在操作集群前,先了解集群架构中的,RabbitMQ元数据的概念,以及集群中队列和交换机(器)的行为。—这句属于废话,不了解谁神经病来搭建集群。废话可以略过。

a.把节点rabbit1 加入 rabbit中


1.停止第二个节点的应用程序

./rabbitmqctl -n rabbit1@zhanghuilongdeMacBook-Pro stop_app


2.重新设置第二个节点的元数据和状态为清空状态。

./rabbitmqctl -n rabbit1@zhanghuilongdeMacBook-Pro reset


3.加入第一节点

./rabbitmqctl -n rabbit1@zhanghuilongdeMacBook-Pro join_cluster rabbit@zhanghuilongdeMacBook-Pro


4.重新启动第二节点

./rabbitmqctl -n rabbit1@zhanghuilongdeMacBook-Pro start_app


以下是具体的过程:

  zhanghuilongdeMacBook-Pro:sbin zhanghuilong$ ./rabbitmqctl -n rabbit1@zhanghuilongdeMacBook-Pro stop_app
Stopping rabbit application on node 'rabbit1@zhanghuilongdeMacBook-Pro' ...
zhanghuilongdeMacBook-Pro:sbin zhanghuilong$ ./rabbitmqctl -n rabbit1@zhanghuilongdeMacBook-Pro reset
Resetting node 'rabbit1@zhanghuilongdeMacBook-Pro' ...
zhanghuilongdeMacBook-Pro:sbin zhanghuilong$ ./rabbitmqctl -n rabbit1@zhanghuilongdeMacBook-Pro join_cluster rabbit@zhanghuilongdeMacBook-Pro
Clustering node 'rabbit1@zhanghuilongdeMacBook-Pro' with 'rabbit@zhanghuilongdeMacBook-Pro' ...
zhanghuilongdeMacBook-Pro:sbin zhanghuilong$./rabbitmqctl -n rabbit1@zhanghuilongdeMacBook-Pro start_app
Starting node 'rabbit1@zhanghuilongdeMacBook-Pro' ...
zhanghuilongdeMacBook-Pro:sbin zhanghuilong$


now,你可以到web端看到集群已经存在了!!!。。。斯巴拉稀



b.把rabbit2加入rabbit


步骤同a的1234,其中注意点是,如果你需要设置第三个集群节点为内存模式,而非磁盘模式,可以参考当前版本的命令提示,在最后加上

–ram 参数

Commands:
stop [<pid_file>]
stop_app
start_app
wait <pid_file>
reset
force_reset
rotate_logs <suffix>
hipe_compile <directory>

join_cluster <clusternode> [--ram]


添加第三节点的完整命令

zhanghuilongdeMacBook-Pro:sbin zhanghuilong$ ./rabbitmqctl -n rabbit2@zhanghuilongdeMacBook-Pro stop_app
Stopping rabbit application on node 'rabbit2@zhanghuilongdeMacBook-Pro' ...
zhanghuilongdeMacBook-Pro:sbin zhanghuilong$ ./rabbitmqctl -n rabbit2@zhanghuilongdeMacBook-Pro reset
Resetting node 'rabbit2@zhanghuilongdeMacBook-Pro' ...
zhanghuilongdeMacBook-Pro:sbin zhanghuilong$ ./rabbitmqctl -n rabbit2@zhanghuilongdeMacBook-Pro join_cluster rabbit@zhanghuilongdeMacBook-Pro --ram
Clustering node 'rabbit2@zhanghuilongdeMacBook-Pro' with 'rabbit@zhanghuilongdeMacBook-Pro' ...
zhanghuilongdeMacBook-Pro:sbin zhanghuilong$ ./rabbitmqctl -n rabbit2@zhanghuilongdeMacBook-Pro start_app
Starting node 'rabbit2@zhanghuilongdeMacBook-Pro' ...
zhanghuilongdeMacBook-Pro:sbin zhanghuilong$


查看集群状态

./rabbitmqctl cluster_status -n rabbit@zhanghuilongdeMacBook-Pro


zhanghuilongdeMacBook-Pro:sbin zhanghuilong$ ./rabbitmqctl cluster_status -n rabbit@zhanghuilongdeMacBook-Pro
Cluster status of node 'rabbit@zhanghuilongdeMacBook-Pro' ...
[{nodes,[{disc,['rabbit1@zhanghuilongdeMacBook-Pro',
'rabbit@zhanghuilongdeMacBook-Pro']},
{ram,['rabbit2@zhanghuilongdeMacBook-Pro']}]},
{running_nodes,['rabbit2@zhanghuilongdeMacBook-Pro',
'rabbit1@zhanghuilongdeMacBook-Pro',
'rabbit@zhanghuilongdeMacBook-Pro']},
{cluster_name,<<"rabbit@zhanghuilongdemacbook-pro">>},
{partitions,[]},
{alarms,[{'rabbit2@zhanghuilongdeMacBook-Pro',[]},
{'rabbit1@zhanghuilongdeMacBook-Pro',[]},
{'rabbit@zhanghuilongdeMacBook-Pro',[]}]}]


到web端看下效果吧:



点击节点名称可以查看详细信息,





节点2 和节点3 分别被设置为 磁盘 和 内存类型。

至此,集群搭建完毕, 由于我也是初次学习rabbitmq,如果有理解有误的地方,麻烦给指出来,也好一起交流学习下!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mac 集群