1. 程式人生 > 其它 >[喵咪MQ(3)]RabbitMQ叢集安裝配置

[喵咪MQ(3)]RabbitMQ叢集安裝配置

[喵咪MQ(3)]RabbitMQ叢集安裝配置

在各項生產環境使用中,容災總是一個很重要的話題,如果單點故障會導致整個系統奔潰或者是丟失資料是不是好氣好氣的,領導會追著你問這是怎麼了?你只能說是我們沒有經驗什麼什麼元件故障了,這個是低階玩法,高階玩法是配置好叢集容災,告訴老闆死一兩臺機器宕機了沒有事沒有影響,所以我們今天就來講講RabbitMQ的叢集模式...

附上:

喵了個咪的部落格:w-blog.cn

RabbitMQ官網 :http://www.rabbitmq.com/

1.配置叢集

RabbitMQ通過ssh通道進行叢集直接的連結,這裡準備了兩臺伺服器分別如下

  • 192.168.0.1 主機名 RabbitMQ-1
  • 192.168.0.1 主機名 RabbitMQ-2

首先我們需要在這兩臺機器上配置好互相的host可以通過主機名進行訪問

vim /etc/hosts
內網地址 RabbitMQ-1
內網地址 RabbitMQ-2
service network restart


#在 RabbitMQ-1 能通:
ping RabbitMQ-2
#在 RabbitMQ-2 能通:
ping RabbitMQ-1

當我們可以ping通之後我們需要設定一下 Erlang Cookie 讓兩臺機器保持同樣的 Cookie 才能順利的建立叢集

  1. 先啟動雙方的RabbitMQ
  2. 複製 RabbitMQ-1 中 /var/lib/rabbitmq/.erlang.cookie 檔案中的值
  3. 貼上到 RabbitMQ-2 /var/lib/rabbitmq/.erlang.cookie中 使用:wq! 儲存
  4. 重啟RabbitMQ-2 RabbitMQ服務

1.2 join伺服器建立關聯

Cookie我們已經配置好了 接下來需要把兩個叢集關聯起來

對 RabbitMQ-1 節點做如下操作

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

這個是用來在rabbitmq1上執行的,這個也可以不執行,直接在節點伺服器執行下邊的指令碼,不過得保證這個rabbitmq服務是正常啟動的.

RabbitMQ-2 節點服務配置指令碼

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@RabbitMQ-1
rabbitmqctl start_app

1.3 檢視叢集狀態

可以通過 rabbitmqctl cluster_status 檢視到如下狀態證明叢集已經配置成功

[root@Sunmi-RabbitMQ-1 ~]# rabbitmqctl cluster_status
Cluster status of node ‘rabbit@Sunmi-RabbitMQ-1’ …
[{nodes,[{disc,[‘rabbit@Sunmi-RabbitMQ-1’]},
         {ram,[‘rabbit@Sunmi-RabbitMQ-2’]}]},
 {running_nodes,[‘rabbit@Sunmi-RabbitMQ-2’,’rabbit@Sunmi-RabbitMQ-1’]},
 {cluster_name,<<“rabbit@Sunmi-RabbitMQ-1”>>},
 {partitions,[]},
 {alarms,[{‘rabbit@Sunmi-RabbitMQ-2’,[]},{‘rabbit@Sunmi-RabbitMQ-1’,[]}]}]

注意:建立好叢集之後需要重新配置一下使用者 配置的使用者會影響整個叢集

2. 叢集的各項模式

關於RabbitMQ 叢集有兩大模式需要說明,一個是磁碟模式或記憶體模式,一個是普通模式和映象模式,我們先說磁碟和記憶體模式

2.1 磁碟和記憶體模式

磁碟模式故名思議,磁碟模式就是把資料持久化到磁碟讓整個服務重啟時資料也不會丟,缺點是I/O吞吐依賴磁碟效能

記憶體模式也就是把資料存在記憶體空間中讀取寫入速度非常快,缺點是當重啟服務記憶體中的資料會丟失

可以通過web管理介面看到各個節點的執行模式,也可以通過命令來改變節點執行模式但是注意叢集中必須有一個磁碟節點才能執行

2.2 普通模式和映象模式

普通模式就是預設模式,我們現在叢集有 A B 兩臺伺服器,這個時候向A寫入了一條資料,然後連線B去讀取這條資料,B會先找到A去獲取這條資料然後返回給使用者,B並不儲存向A寫入的資料,反過來也是如此向B寫入資料不會再A儲存

這樣看起來並沒有什麼問題,叢集不就是這樣嗎?但是會產生兩個問題

  • A 節點會去找B節點獲取資料 ,如果B節點死了怎麼辦
  • 資料只在B節點儲存B節點是記憶體模式不就丟了嗎

第二點比較好解決,都用磁碟模式,寫都只寫磁碟模式的節點,雖然會降低效能但是沒法解決第一個問題,B節點死了資料就沒有來源了,這個時候就需要映象模式出手了

映象模式會在所有節點之間同步資料,也就是叢集中有一個節點存活就能正常的使用下去,一般我們會用磁碟節點專門做持久化,記憶體節點提供使用

配置映象模式只需要在主節點執行如下命令:

- p 之後加上你需要的Vhost
 rabbitmqctl set_policy -p / ha-all “^” ‘{“ha-mode”:”all”}’

在web管理介面佇列裡面也能夠判斷出來資料儲存在幾個節點上

不要盲目追求映象模式,映象模式節點之間同步資料也會帶來開銷所以更具場景來做出合理的判斷

3 總結

關於RabbitMQ的介紹,單機模式,叢集模式的博文以及列舉完了,在之後又在使用RabbitMQ的心得以及一些有意思的地方,也會分享出啦和大家一起學習討論,多謝大家的支援本小節就到這裡了....

注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!