0、首先按照http://www.cnblogs.com/zhjh256/p/5922562.html在至少兩個節點安裝好(不建議單機,沒什麼意義)html
一、先了解rabbitmq集羣架構,http://www.cnblogs.com/zhjh256/p/6368288.htmlnode
二、vi /etc/hosts 在兩個節點分別添加別名,互ping對方,確保通。確保防火牆沒有開或者相應的端口開放linux
三、設置erlang集羣通訊用的cookie,一般每種集羣都有一種機制,多是共享磁盤好比rac或者session好比tomcat亦或是token好比分佈式系統git
RabbitMQ節點之間和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一組隨機的數字+字母的字符串。當RabbitMQ服務器啓動的時候,Erlang VM會自動建立一個隨機內容的Cookie文件。若是是經過rpm安裝RabbitMQ的話,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。若是是經過源碼或者二進制解壓安裝的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie。確保組成集羣的每一個erlang節點的cookie相同。web
[root@dev3 ~]# scp .erlang.cookie devel2:/root/
The authenticity of host 'devel2 (172.18.30.192)' can't be established.
RSA key fingerprint is e3:76:d5:eb:d3:7d:86:43:de:bc:5d:31:cb:21:0d:d2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'devel2,172.18.30.192' (RSA) to the list of known hosts.
root@devel2's password:
.erlang.cookie 100% 20 0.0KB/s 00:00
[root@dev3 ~]# cat .erlang.cookie
YQSISAMKQWVOZMRQZJDVtomcat
[root@dev3 ~]# chmod 400 .erlang.cookie服務器
# 必須確保.erlang.cookie的權限位400,不然啓動的時候會報「{error_logger,{{2017,2,27},{20,11,25}},"Cookie file /root/.erlang.cookie must be accessible by owner only",[]}」cookie
[root@devel2 ~]# chmod 400 .erlang.cookiesession
四、後臺模式啓動rabbitmq架構
[root@dev3 ~]# rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
[root@devel2 ~]# rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
[root@devel2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@devel2 ...
[{nodes,[{disc,[rabbit@devel2]}]},
{running_nodes,[rabbit@devel2]},
{cluster_name,<<"rabbit@devel2">>},
{partitions,[]}]
[root@devel2 ~]# rabbitmqctl stop_app
Stopping node rabbit@devel2 ...
[root@devel2 ~]# rabbitmqctl join_cluster rabbit@dev3
Clustering node rabbit@devel2 with rabbit@dev3 ...
[root@devel2 ~]# rabbitmqctl start_app
Starting node rabbit@devel2 ...
[root@devel2 ~]# rabbitmqctl cluster_status ##默認都是disk模式,若是要ram模式,則加上--ram選項
Cluster status of node rabbit@devel2 ...
[{nodes,[{disc,[rabbit@dev3,rabbit@devel2]}]},
{running_nodes,[rabbit@dev3,rabbit@devel2]},
{cluster_name,<<"rabbit@dev3">>},
{partitions,[]}]
五、啓用控制檯插件
[root@devel2 ~]# rabbitmq-plugins list
Configured: E = explicitly enabled; e = implicitly enabled
| Status: * = running on rabbit@devel2
|/
[ ] amqp_client 3.5.7
[ ] cowboy 0.5.0-rmq3.5.7-git4b93c2d
[ ] mochiweb 2.7.0-rmq3.5.7-git680dba8
[ ] rabbitmq_amqp1_0 3.5.7
[ ] rabbitmq_auth_backend_ldap 3.5.7
[ ] rabbitmq_auth_mechanism_ssl 3.5.7
[ ] rabbitmq_consistent_hash_exchange 3.5.7
[ ] rabbitmq_federation 3.5.7
[ ] rabbitmq_federation_management 3.5.7
[ ] rabbitmq_management 3.5.7
[ ] rabbitmq_management_agent 3.5.7
[ ] rabbitmq_management_visualiser 3.5.7
[ ] rabbitmq_mqtt 3.5.7
[ ] rabbitmq_shovel 3.5.7
[ ] rabbitmq_shovel_management 3.5.7
[ ] rabbitmq_stomp 3.5.7
[ ] rabbitmq_test 3.5.7
[ ] rabbitmq_tracing 3.5.7
[ ] rabbitmq_web_dispatch 3.5.7
[ ] rabbitmq_web_stomp 3.5.7
[ ] rabbitmq_web_stomp_examples 3.5.7
[ ] sockjs 0.3.4-rmq3.5.7-git3132eb9
[ ] webmachine 1.10.3-rmq3.5.7-gite9359c7
[root@devel2 ~]# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Applying plugin configuration to rabbit@devel2... started 6 plugins.
六、建立用戶。默認狀況下,內置的guest只能經過localhost訪問,一般咱們都是在linux服務器上安裝rabbitmq,在本地客戶端操做,因此須要建立管理用戶。
[root@devel2 ~]# rabbitmqctl add_user admin admin
Creating user "admin" ..
[root@devel2 ~]# rabbitmqctl set_permissions -p / admin '.*' '.*' '.*' ##僅僅設置權限是不足以登陸服務器進行管理的,還須要爲用戶分配user_tag,簡單理解就是角色
Setting permissions for user "admin" in vhost "/" ...
當前有以下tag:
[root@devel2 ~]# rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator] ...
[root@devel2 ~]# rabbitmqctl add_user monitor monitor
Creating user "monitor" ...
[root@devel2 ~]# rabbitmqctl set_user_tags monitor monitoring
Setting tags for user "monitor" to [monitoring] ...
七、登陸控制檯查看狀態
每一個節點都須要啓用manage插件才能顯示統計信息。
八、設置mirror,通常來講應該在設計階段或者開發早期根據應用模塊或者子系統規劃exchange/queue的命名規範,這樣便於從維護的角度進行統一處理,而不是將MQ做爲一個臨時補充。
好比,設置sys開頭的隊列複製到全部節點:
[root@dev3 ~]# rabbitmqctl set_policy -p / ha-allqueue "^sys" '{"ha-mode":"all"}'
Setting policy "ha-allqueue" for pattern "^sys" to "{\"ha-mode\":\"all\"}" with priority "0" ...
九、測試某節點宕機。
[root@dev3 ~]# kill -9 19496
宕機期間消費消息/並生成新的消息:
重啓宕機的節點:
[root@dev3 ~]# rabbitmq-server -detached #由於已是cluster的一部分,因此就不須要從新join了,啓動的時候會自動join。不然會出錯以下:
[root@dev3 ~]# rabbitmqctl join_cluster rabbit@devel2 Clustering node rabbit@dev3 with rabbit@devel2 ... {"init terminating in do_boot",{function_clause,[{rabbit_ctl_misc,print_cmd_result,[join_cluster,already_member],[]},{rabbit_cli,main,3,[]},{init,start_it,1,[]},{init,start_em,1,[]}]}} Crash dump is being written to: erl_crash.dump...done init terminating in do_boot ()
啓動後,能夠發現有些queue沒有同步,須要人工進行同步。
同步後可見消息都是正確的,已經消費的會刪掉,新增的會拷貝過去。
十、若是某些時候由於過去時間較長、消息較多,不想同步,而是做爲新節點從新join,怎麼辦?
能夠在目標節點執行
rabbitmqctl reset
而後從新執行加入節點的步驟便可。
十一、rabbitmq集羣平常維護的注意事項和故障恢復可參考rabbitmq集羣故障恢復詳解。