Rabbitmq集羣
Distributed Rabbitmq brokers的實現方式有三種,分別是clustering、federation、shovel。本節圍繞clustering(集羣)講述。
- 搭建rabbitmq集羣要求:
- 可靠的網絡環境;
- 集羣中所有機器的Rabbitmq和Erlang版本要一樣。
- Rabbitmq_Clustering工作模式:
- Virtual hosts, exchanges, users和permissions會自動鏡像到集羣的所有節點;
- queues可以只配置在一個節點或者鏡像到多個節點;
- 客戶端連接到集羣的任何一個節點都能看到所有的queues。
搭建Rabbitmq集羣
搭建Rabbitmq集羣的方法有很多種,參考Ways of Forming a Cluster,在此作者使用env variables來搭建集羣。
Rabbitmq是通過ip和port來爲客戶端提供服務的,所以配置Rabbitmq實例的基本要求就是綁定ip:port(默認爲localhost:5672),如果單機部署過mysql、Redis等工具,想必這個原理很好理解了。如果不理解請繼續看示例:
單機啓動多個實例
# 啓動第一個節點
$ RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detached
#啓動第二個節點
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
# 此時查看端口狀態會發現第二個節點並沒有起來!!!
此處報錯,查看日誌:
$ less /var/log/rabbitmq/rabbit2.log
Error description:
init:do_boot/3
init:start_em/1
rabbit:start_it/1 line 446
rabbit:broker_start/0 line 322
rabbit:start_apps/2 line 542
app_utils:manage_applications/6 line 126
lists:foldl/3 line 1263
rabbit:'-handle_app_error/1-fun-0-'/3 line 638
throw:{could_not_start,rabbitmq_management,
{rabbitmq_management,
{bad_return,
{{rabbit_mgmt_app,start,[normal,[]]},
{'EXIT',
{{could_not_start_listener,
[{port,15672}],
{shutdown,
{failed_to_start_child,ranch_acceptors_sup,
{listen_error,rabbit_web_dispatch_sup_15672,eaddrinuse}}}},
{gen_server,call,
[rabbit_web_dispatch_registry,
{add,rabbit_mgmt,
[{port,15672}],
#Fun<rabbit_web_dispatch.0.82427196>,
[{'_',[],
[{[],[],cowboy_static,
{priv_file,rabbitmq_management,"www/index.html"}},
{[<<"api">>,<<"overview">>],[],rabbit_mgmt_wm_overview,[]},
{[<<"api">>,<<"cluster-name">>],
[],rabbit_mgmt_wm_cluster_name,[]},
{[<<"api">>,<<"nodes">>],[],rabbit_mgmt_wm_nodes,[]},
{[<<"api">>,<<"nodes">>,node],[],rabbit_mgmt_wm_node,[]},
總的來說就是Rabbitmq_management啓動失敗,查資料後原因如下:web管理插件端口占用,所以還要指定其web插件佔用的端口號。
# 更改參數後啓動
$ RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
# 查看端口狀態
$ netstat -lntp
tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 10253/beam.smp
tcp 0 0 0.0.0.0:15673 0.0.0.0:* LISTEN 13922/beam.smp
tcp 0 0 127.0.0.1:9797 0.0.0.0:* LISTEN 632/python2
tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 10253/beam.smp
tcp 0 0 0.0.0.0:25673 0.0.0.0:* LISTEN 13922/beam.smp
tcp6 0 0 :::4369 :::* LISTEN 10150/epmd
tcp6 0 0 :::5672 :::* LISTEN 10253/beam.smp
tcp6 0 0 :::5673 :::* LISTEN 13922/beam.smp
# rabbit1、rabbit2啓動成功
# 啓動第三個節點
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached
現在三個節點都已啓動,狀態:
$ netstat -lntp
tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 10150/epmd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 773/sshd
tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 10253/beam.smp
tcp 0 0 0.0.0.0:15673 0.0.0.0:* LISTEN 13922/beam.smp
tcp 0 0 0.0.0.0:15674 0.0.0.0:* LISTEN 14910/beam.smp
tcp 0 0 127.0.0.1:9797 0.0.0.0:* LISTEN 632/python2
tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 10253/beam.smp
tcp 0 0 0.0.0.0:25673 0.0.0.0:* LISTEN 13922/beam.smp
tcp 0 0 0.0.0.0:25674 0.0.0.0:* LISTEN 14910/beam.smp
tcp6 0 0 :::4369 :::* LISTEN 10150/epmd
tcp6 0 0 :::22 :::* LISTEN 773/sshd
tcp6 0 0 :::5672 :::* LISTEN 10253/beam.smp
tcp6 0 0 :::5673 :::* LISTEN 13922/beam.smp
tcp6 0 0 :::5674 :::* LISTEN 14910/beam.smp
搭建集羣
我把rabbit1作爲主節點,剩下兩個設置爲子節點(主節點不動,配置兩個子節點即可)。
-
將rabbit2加入集羣:
$ rabbitmqctl -n rabbit2 stop_app $ rabbitmqctl -n rabbit2 reset $ rabbitmqctl -n rabbit2 join_cluster rabbit1@`hostname -s` $ rabbitmqctl -n rabbit2 start_app
-
將rabbit3加入集羣(同理):
$ rabbitmqctl -n rabbit3 stop_app $ rabbitmqctl -n rabbit3 reset $ rabbitmqctl -n rabbit3 join_cluster rabbit1@`hostname -s` $ rabbitmqctl -n rabbit3 start_app
-
查看集羣狀態:
$ rabbitmqctl cluster_status -n rabbit1@host3 Cluster status of node rabbit1@host3 ... [{nodes,[{disc,[rabbit1@host3,rabbit2@host3,rabbit3@host3]}]}, {running_nodes,[rabbit3@host3,rabbit2@host3,rabbit1@host3]}, {cluster_name,<<"rabbit1@host3">>}, {partitions,[]}, {alarms,[{rabbit3@host3,[]},{rabbit2@host3,[]},{rabbit1@host3,[]}]}]
-
在UI_Management頁面查看集羣狀態(server_ip:port,在此可以通過15672、15673、15674任何一個端口進行訪問):
-
如果想添加新的節點,只需要執行本節操作步驟即可!
-
刪除節點:
$ rabbitmqctl forget_cluster_node [--offline] <existing_cluster_member_node> # 測試未成功
-
參考: