上一篇文章提到,節點按照metadata的存儲方式在集群中可以是RAM node 或者 disc node.這兩種node有什么差別?在實際操作的時候又如何選擇呢?本文回答這一問題.
RAM Node 的性能優勢
在集群中聲明(declare)創建exchange queue binding,這類操作要等到所有的節點都完成創建才會返回:如果是內存節點就要修改內存數據,如果是disk node 就要等待寫磁盤,節點過多這里的速度就會被大大的拖慢.
有些場景exchang queue相當固定,變動很少,那即使全都是disc node,也沒有什么影響.之前提到過使用Rabbitmq做RPC,如果是RPC或者類似RPC的場景這個問題就嚴重了,頻繁創建銷毀臨時隊列,磁盤讀寫能力就很快成為性能瓶頸了.
所以,大多數情況下,我們盡量把Node創建為RAM Node.這里就有一個問題了,要想集群重啟后元數據可以恢復就需要把集群元數據持久化到磁盤,那怎么規划RabbitMQ集群中的RAM Node和Disc Node呢?
RAM Node or Disc Node
只要有一個節點是Disc Node 就能提供條件把集群元數據寫到磁盤,RabbitMQ的確也是這樣要求的:集群中只要有一個disk node就可以,其它的都可以是RAM node.節點加入或退出集群一定至少要通知集群中的一個disk node,來記錄這種變動.這個在上一篇文章中我們做過這種實驗:在只有RAM Node的情況下增加節點或者退出節點,各種混亂啊.
如果集群中disk node都當掉了,就不要變動集群的元數據(集群元數據有哪些?看上一篇文章).聲明 exchange queue 修改用戶權限,添加用戶等等這些變動在節點重啟之后無法恢復.
有一種情況要求所有的disk node都要在線情況在才能操作,那就是增加或者移除節點.RAM node啟動的時候會連接到預設的disk node下載最新的集群元數據.如果你有兩個disk node(d1 d2),一個RAM node加入的時候你只告訴d1,而恰好這個RAM node重啟的時候d1並沒有啟動,重啟就會失敗.上一篇文章的測試中我們嘗試讓集群中的RAM節點先於其他的節點啟動,RAM找不到可以下載集群元數據的disk node 就啟動失敗了.所以我們加入RAM節點的時候,把所有的disk node信息都告訴它,RAM node會把disk node的信息持久化到磁盤以便后續啟動可以按圖索驥.
./rabbitmq-util -n z_91@zen.com reset 在加入退出節點的時候會頻繁用到reset命令.reset要完成的清理工作有:
[1] reset命令會將當前節點內的集群元數據全部清空.
[2] 告訴集群中的所有disc nodes:這個節點要退出集群了
第二步對於RabbitMQ集群很重要:如果不通知集群會認為這個節點當掉了,會等待這個節點恢復,如果要退出的節點是disk node,這種集群內部告知的重要性就更不言而喻了.
在集群元數據有變動的時候需要有disk node在線,但是在節點加入或退出的時候所有的disk node必須全部在線.如果沒有正確退出disk node,集群會認為這個節點當掉了,在這個節點恢復之前不要加入其它節點.所以從節點中移除節點要慎之又慎,確保執行了reset.
最后,小圖一張 她是卡米拉·貝勒 美國百萬網友選出的四大“最美臉蛋”第一名 2011年12月被評為全球最美臉蛋第二名
全球最美臉蛋第一名是誰? Emma Watson