2011年9月16日 星期五

[RabbitMQ] cluster setting

在Ubuntu機器上面安裝很方便, 先安裝完erlang,另外要在裝erlang-nox, 接著直接把抓下來的rabbitmq-server deb安裝就行


$ sudo apt-get install erlang
$ sudo apt-get install erlang-nox
$ dpkg -i rabbitmq-server_2.6.1-1_all.deb
$

另外rabbitmq有提供使用plugin, 如果你是用deb安裝, 那你只需要把所有plugin (.ez)放到 /usr/lib/rabbitmq/lib/rabbitmqserver-2.6.1/plugins下就行了.
我是安裝rabbitmq-management plugin, 在cluster裡面, 只需要有一台安裝完整management plugin, 其他台都指需要裝management
agent就行~


$ ls /usr/lib/rabbitmq/lib/rabbitmq_server-2.6.1/plugins/
amqp_client-2.6.1.ez
rabbitmq_mochiweb-2.6.1.ez
mochiweb-1.3-rmq2.6.1-git9a53dbd.ez
README
rabbitmq_management-2.6.1.ez
webmachine-1.7.0-rmq2.6.1-hg0c4b60a.ez
rabbitmq_management_agent-2.6.1.ez

在erlang的世界裡面, 需要設定同樣的cookie,不同的node彼此之間才可以溝通, 所以假設我們有lab1, lab2, lab3三台機器, 只要把lab1 上面的/var/lib/rabbitmq/.erlang.cookie copy到其他兩台機器上面, 就可以溝通了, 之後就可以透過rabbitmqctl來建立cluster, 有幾點要特別注意

  • 更換.erlang.cookie完之後, 要記得rm -rf /var/lib/rabbitmq/mnesia
  • 要記得更改/etc/hosts裡面關於cluster ip host mapping, 這樣erlang才可以查到domain name的ip
  • 之後要自動設定, 可以寫檔案在/etc/rabbitmq 下面

$ rm -rf /var/lib/rabbitmq/mnesia
$ rabbitmqctl cluster_status
...
$ rabbitmqctl stop_app
...
$ rabbitmqctl reset
...
$ rabbitmqctl cluster rabbit@lab001 # add lab002 as mem mode
...
$ rabbitmqctl cluster rabbit@lab001 rabbit@lab003 # add lab003 as disk mode
...
$ rabbitmqctl cluster_status
...
$ cat /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf
$ cat /etc/rabbitmq/rabbitmq.conf
[ {rabbit, [ {cluster_nodes, ['rabbit@lab001', 'rabbit@lab003']} ]} ].
$

另外提到一點, erlang的shell可以拿來幫助debug, 當你選定某組cookie來跑rabbitmq server, 假設跑在lab001, 可以利用erlang shell確認連線有沒有錯誤,
假如回傳的是pang, 那代表連線有問題~ 另外也要確定epmd 這個erlang內建的daemon有沒有跑起來~


lab002 $ erl -sname ooo -setcookie
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4 (abort with ^G)
(oo@lab002)1> net_adm:ping('rabbit@lab001').
pong
(oo@lab002)2>

$ epmd -names
epmd: up and running on port 4369 with data:
name rabbit at port 58909

Reference
http://www.rabbitmq.com/clustering.html