【APP】RabbitMQ集羣環境生產實例部署

生產環境:

CentOS 6.3 x86_64

服務器主機名與IP列表:

mq136      172.28.2.136
mq137      172.28.2.137
mq164      172.28.2.164
mq165      172.28.2.165

在各節點服務器上作好hosts解析

  1. cat >>/etc/hosts/<<EOF

  2. mq136      172.28.2.136

  3. mq137      172.28.2.137

  4. mq164      172.28.2.164

  5. mq165      172.28.2.165

  6. EOF

一、簡介
RabbitMQ
是流行的開源消息隊列系統,用erlang語言開發。Erlang的分佈式通訊安全策略,可以歸結爲 All or None。。RabbitMQAMQP(高級消息隊列協議)的標準實現。RabbitMQ的結構圖如下:

171753607.jpg

幾個概念說明:

Broker:簡單來說就是消息隊列服務器實體。
Exchange
:消息交換機,它指定消息按什麼規則,路由到哪個隊列。
Queue
:消息隊列載體,每個消息都會被投入到一個或多個隊列。
Binding
:綁定,它的作用就是把exchangequeue按照路由規則綁定起來。
Routing Key
:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
vhost
:虛擬主機,一個broker裏可以開設多個vhost,用作不同用戶的權限分離。
producer
:消息生產者,就是投遞消息的程序。
consumer
:消息消費者,就是接受消息的程序。
channel
:消息通道,在客戶端的每個連接裏,可建立多個channel,每個channel代表一個會話任務。

消息隊列的使用過程大概如下:

1)客戶端連接到消息隊列服務器,打開一個channel
2)客戶端聲明一個exchange,並設置相關屬性。
3)客戶端聲明一個queue,並設置相關屬性。
4)客戶端使用routing key,在exchangequeue之間建立好綁定關係。
5)客戶端投遞消息到exchange

exchange接收到消息後,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列裏。

exchange也有幾個類型,完全根據key進行投遞的叫做Direct交換機,例如,綁定時設置了routing key”abc”,那麼客戶端提交的消息,只有設置了key”abc”的纔會投遞到隊列。對key進行模式匹配後進行投遞的叫做Topic交換機,符號”#”匹配一個或多個詞,符號”*”匹配正好一個詞。例如”abc.#”匹配”abc.def.ghi””abc.*”只匹配”abc.def”。還有一種不需要key的,叫做Fanout交換機,它採取廣播模式,一個消息進來時,投遞到與該交換機綁定的所有隊列。

RabbitMQ支持消息的持久化,也就是數據寫在磁盤上,爲了數據安全考慮,我想大多數用戶都會選擇持久化。消息隊列持久化包括3個部分:
1exchange持久化,在聲明時指定durable => 1
2queue持久化,在聲明時指定durable => 1
3)消息持久化,在投遞時指定delivery_mode => 21是非持久化)

如果exchangequeue都是持久化的,那麼它們之間的binding也是持久化的。如果exchangequeue兩者之間有一個持久化,一個非持久化,就不允許建立綁定。

下面我們再瞭解下消息隊列RabbitMQ集羣,由於RabbitMQ是用erlang開發的,RabbitMQ 完全依賴 Erlang Cluster,而Erlang集羣非常方便,因此配置RabbitMQ集羣變得非常簡單。

RabbitMQ的集羣節點包括內存節點、磁盤節點。顧名思義內存節點就是將所有數據放在內存,磁盤節點將數據放在磁盤。不過,如前文所述,如果在投遞消息時,打開了消息的持久化,那麼即使是內存節點,數據還是安全的放在磁盤。

良好的設計架構可以如下:在一個集羣裏,有3臺以上機器,其中1臺使用磁盤模式,其它使用內存模式。其它幾臺爲內存模式的節點,無疑速度更快,因此客戶端(consumerproducer)連接訪問它們。而磁盤模式的節點,由於磁盤IO相對較慢,因此僅作數據備份使用。

二、各節點安裝rabbitmq

安裝非常簡單,只需幾步搞定:

1. 安裝epel源

  1. rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm

  2. wget -O /etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo

2. 安裝erlang

  1. yum install erlang xmlto git -y

  2. rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc

3. 安裝rabbitmq

可以選擇用yum安裝,也可以選擇下載rpm包安裝,也可以用源碼編譯安裝!

下載地址: http://www.rabbitmq.com/download.html

本文選擇rpm包安裝:

  1. wget http://www.rabbitmq.com/releases/rabbitmq-server/v2.8.6/rabbitmq-server-2.8.6.noarch.rpm

  2. rpm -ivh  rabbitmq-server-2.8.6.noarch.rpm  

4. 啓動各節點rabbitmq,並驗證啓動情況

  1. [root@mq136 ~]# rabbitmq-server --detached &

  2. [root@mq136 ~]# ps aux |grep rabbitmq

  3. rabbitmq  1394  0.0  0.0  10828   540 ?        S    Oct08   0:11 /usr/lib64/erlang/erts-5.8.5/bin/epmd -daemon

  4. root      2483  0.0  0.0 103244   836 pts/1    S+   17:40   0:00 grep rabbitmq

  5. rabbitmq  5657  6.3  1.9 2224044 157200 ?      Sl   Oct08 959:17 /usr/lib64/erlang/erts-5.8.5/bin/beam.smp -W w -K true -A30 -P 1048576 -- -root /usr/lib64/erlang -progname erl -- -home /var/lib/rabbitmq -- -noshell -noinput -sname rabbit@mq136 -boot /var/lib/rabbitmq/mnesia/rabbit@mq136-plugins-expand/rabbit -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -sasl sasl_error_logger false -rabbit error_logger {file,"/var/log/rabbitmq/[email protected]"} -rabbit sasl_error_logger {file,"/var/log/rabbitmq/[email protected]"} -os_mon start_cpu_sup false -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/rabbit@mq136" -noshell -noinput

  6. rabbitmq  5698  0.0  0.0  10788   520 ?        Ss   Oct08   0:00 inet_gethost 4

  7. rabbitmq  5699  0.0  0.0  12892   692 ?        S    Oct08   0:00 inet_gethost 4

  8. rabbitmq 11446  0.0  0.0  12892   680 ?        S    Oct13   0:00 inet_gethost 4

  9. [root@mq136 ~]# lsof -i:5672

  10. COMMAND   PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME

  11. beam.smp 5657 rabbitmq   18u  IPv4 5879364      0t0  TCP *:amqp (LISTEN)


三、集羣配置

集羣環境說明:

mq136作爲磁盤節點,其它所有節點都作爲內存節點!

1. 在各節點創建加入集羣腳本

  1. mq136:

  2. cat >>/home/zjqui/scripts/cluster.sh<<EOF

  3. rabbitmqctl stop_app

  4. rabbitmqctl reset

  5. rabbitmqctl cluster  

  6. rabbitmqctl start_app

  7. EOF

  8. mq137:

  9. cat >>/home/zjqui/scripts/cluster.sh<<EOF

  10. rabbitmqctl stop_app

  11. rabbitmqctl reset

  12. rabbitmqctl cluster rabbit@mq136

  13. rabbitmqctl start_app

  14. EOF

  15. mq164:

  16. cat >>/home/zjqui/scripts/cluster.sh<<EOF

  17. rabbitmqctl stop_app

  18. rabbitmqctl reset

  19. rabbitmqctl cluster rabbit@mq136

  20. rabbitmqctl start_app

  21. EOF

  22. mq165:

  23. cat >>/home/zjqui/scripts/cluster.sh<<EOF

  24. rabbitmqctl stop_app

  25. rabbitmqctl reset

  26. rabbitmqctl cluster rabbit@mq136

  27. rabbitmqctl start_app

  28. EOF


2. 各節點加入集羣環境

  1. [root@mq136 ~]# chmod +x /home/zjqui/scripts/cluster.sh

啓動腳本順序:先運行mq136節點集羣腳本,然後再運行其它節點集羣腳本:

  1. [root@mq136 ~]# /home/zjqui/scripts/cluster.sh

各節點運行成功後,查看集羣整體狀態:

  1. [root@mq136 ~]# rabbitmqctl cluster_status

  2. Cluster status of node rabbit@mq136 ...

  3. [{nodes,[{disc,[rabbit@mq136]},

  4.         {ram,[rabbit@mq165,rabbit@mq164,rabbit@mq137]}]},

  5. {running_nodes,[rabbit@mq164,rabbit@mq165,rabbit@mq137,rabbit@mq136]}]

  6. ...done.

可以看到mq136作爲disc節點,其它節點是ram節點!集羣簡單配置到此完成!!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章