搭建前容我先吐槽下,因为第一次接触rabbitmq,从安装到启动到查看rabbitmq-web页面,这些都比较简单,但是关于单机部署多个实例,我按照资料设置,总会遇到各种问题,书本,博文,百度了很多,几乎千片一律,不过最后还是在谷歌上搜到了蛛丝马迹, 由于我们使用的版本太新了,所以有些资料自然就过期了!
下面开始正式搭建:
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,}, {connection_readers,0}, {connection_writers,0}, {connection_channels,0}, {connection_other,2848}, {queue_procs,2848}, {queue_slave_procs,0}, {plugins,}, {other_proc,}, {mnesia,68232}, {metrics,}, {mgmt_db,}, {msg_index,90240}, {other_ets,}, {binary,}, {code,}, {atom,}, {other_system,}]}, {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,}, {disk_free_limit,}, {disk_free,0}, {file_descriptors, [{total_limit,7068}, {total_used,2}, {sockets_limit,6359}, {sockets_used,0}]}, {processes,[{limit,},{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,"::"}]},
讯享网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
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
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,如果有理解有误的地方,麻烦给指出来,也好一起交流学习下!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/75332.html