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

生產環境:html

CentOS 6.3 x86_64node

服務器主機名與IP列表:git

mq136      172.28.2.136
mq137      172.28.2.137
mq164      172.28.2.164
mq165      172.28.2.165
shell

在各節點服務器上做好hosts解析安全

 
 
  1. cat >>/etc/hosts/<<EOF 服務器

  2. mq136      172.28.2.136 架構

  3. mq137      172.28.2.137 app

  4. mq164      172.28.2.164 分佈式

  5. mq165      172.28.2.165 ide

  6. EOF

1、簡介
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相對較慢,所以僅做數據備份使用。

2、各節點安裝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/rabbit@mq136.log"} -rabbit sasl_error_logger {file,"/var/log/rabbitmq/rabbit@mq136-sasl.log"} -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)


3、集羣配置

集羣環境說明:

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節點!集羣簡單配置到此完成!!

相關文章
相關標籤/搜索