1. 程式人生 > >RabbitMQ(6) 集群部署

RabbitMQ(6) 集群部署

app 節點類 apt-get all str ech rabbit 客戶端 局域網

單節點部署

rabbitmq單節點部署比較簡單,可以使用apt-get等工具快速安裝部署。

wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
echo ‘deb http://www.rabbitmq.com/debian/ {distriubtion} main‘ | sudo tee /etc/apt/sources.list.d/rabbitmq.list
sudo apt-get update
sudo apt-get install rabbitmq-server

如上,添加倉庫等認證key,更新本地倉庫後安裝即可。其中{distriubtion}需根據不同的系統版本指定。
使用apt-get等工具安裝比較快速,會一次性安裝erlang等依賴。也可以手動安裝erlang後,再安裝rabbitmq,這種方式也無多大成本,下載rabbitmq的tar.gz包
後解壓即可。
rabbitmq安裝後,以下為幾個比較重要的目錄,根據不同的系統和安裝方式,目錄路徑會有所差別:

  • {rabbitHome}/etc: 配置文件目錄,rabbitmq.config文件定義rabbitmq配置
  • {rabbitHome}/sbin:rabbitmq可執行文件目錄,如:rabbitmq-server、rabbitmqctl、rabbitmq-plugins
  • {rabbitHome}/plugins: rabbitmq內置的插件(.ez)放在此目錄,開啟相應的插件即可使用。
  • {rabbitHome}/var/log:日誌目錄

下載後使用 rabbitmq-server [- detached] 即可啟動rabbitmq服務。
技術分享圖片
後臺首先會啟動一個erlang虛擬機機,然後在此虛擬機中啟動rabbitmq服務。

集群部署

rabbitmq提供了多種集群部署的方式:

  • 靜態配置:在rabbit.conf文件中靜態配置集群節點
  • rabbitmqctl: 使用rabbitmqctl工具手動組裝集群
  • 服務發現:基於etcd、consul、k8s等動態配置集群

這裏主要介紹使用rabbitmqctl組集群等方式,這種方式在小規模下靈活高效。
假設局域網中有node1,node2,node3三個節點,配置rabbitmq集群需要以下幾步:

  1. 復制erlang cookie
    如上所述,rabbitmq運行在erlang虛擬機中,erlang節點需要根據erlang cookie通信,為此需要保證三個節點上的cookie一致。cookie默認位於/var/lib/rabbitmq/.erlang.cookie


    目錄下,從一個節點上復制拷貝到其他節點即可。

    root@node1:~# cat /var/lib/rabbitmq/.erlang.cookie 
    JZQIKYDOSOKMADVDSPUO
    
    root@node2:~# echo JZQIKYDOSOKMADVDSPUO > /var/lib/rabbitmq/.erlang.cookie
    root@node3:~# echo JZQIKYDOSOKMADVDSPUO > /var/lib/rabbitmq/.erlang.cookie
  2. 分別啟動節點

    root@node1:~# rabbitmq-server -detached
    Warning: PID file not written; -detached was passed.
    
    root@node2:~# rabbitmq-server -detached
    Warning: PID file not written; -detached was passed.
    
    root@node3:~# rabbitmq-server -detached
    Warning: PID file not written; -detached was passed.

    在三個節點上分別啟動rabbit,此時三個rabbitmq各自獨立。可以使用rabbitmqctl cluster_status命令分別在三個節點上查看集群狀態。

    root@node1:~# rabbitmqctl cluster_status
    Cluster status of node rabbit@node1
    [{nodes,[{disc,[rabbit@node1]}]},
     {running_nodes,[rabbit@node1]},
     {cluster_name,<<"rabbit@node1">>},
     {partitions,[]},
     {alarms,[{rabbit@node1,[]}]}]
  3. 加入集群
    以node1為基礎,將node2和node3加入集群。
    root@node2:~# rabbitmqctl stop_app Stopping rabbit application on node rabbit@node2 root@node2:~# rabbitmqctl reset Resetting node rabbit@node2 root@node2:~# rabbitmqctl join_cluster rabbit@node1 Clustering node rabbit@node2 with rabbit@node1 root@node2:~# rabbitmqctl start_app Starting node rabbit@node2 root@node2:~#
    首先rabbitmqctl stop_app會停止rabbitmq服務,然後rabbitmqctl reset會重置集群狀態,接著將node2加入node1所在集群,最後在啟動node2上
    到rabbitmq服務。node3上執行同樣到操作。
    完成後,三個節點已經組成集群,再次使用rabbitmqctl cluster_status命令任意節點上查看集群狀態:

    root@node3:~# rabbitmqctl cluster_status
    Cluster status of node rabbit@node3
    [{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]},
     {running_nodes,[rabbit@node1,rabbit@node2,rabbit@node3]},
     {cluster_name,<<"rabbit@node1">>},
     {partitions,[]},
     {alarms,[{rabbit@node1,[]},{rabbit@node2,[]},{rabbit@node3,[]}]}]
    root@node3:~# 

到此集群即組建完畢,組建過程並不復雜。

後續如果需要動態將單個節點脫離集群,也很容易:

root@node3:~# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node3
root@node3:~# rabbitmqctl reset
Resetting node rabbit@node3
root@node3:~# rabbitmqctl start_app
Starting node rabbit@node3
root@node3:~#

關閉節點上到rabbitmq服務,重置該節點集群狀態,重啟rabbitmq服務即可。

集群節點類型

上面在使用rabbitmqctl cluster_status查看集群狀態時,會發現node列表中的disc,這是表明節點類型的。
在集群中,存在兩種節點:

  • disc 磁盤節點,元數據存儲到磁盤
  • ram 內存節點,元數據存儲到磁盤

磁盤節點將隊列、交換器、綁定關系等源數據存儲到磁盤中,而內存節點將這些數據存儲在內存中。
上面組建集群時,節點默認為disc類型,也可以在將節點加入集群時指定為ram類型:

root@node2:~# rabbitmqctl join_cluster rabbit@node1 --ram

對於集群中已有等節點,也可以改變其節點類型:

root@node2:~# rabbitmqctl change_cluster_node_typef {disc,ram}

當創建一個隊列、交換器、綁定等時,需要服務端各個節點將源數據寫入後才會響應客戶端,這意味這磁盤節點會具有較慢的響應。在頻繁創建隊列、交換器等創建中,
磁盤節點會拖慢集群響應速度。不過實際中,頻繁創建元數據等場景並不多見,所以可以一般將集群中節點全部設置成磁盤節點。在rpc等頻繁創建元數據等場景下,
可以考慮使用內存節點。
在一個集群中,應該保證至少有一個磁盤節點,這樣才能保證集群重啟後元數據等恢復。

RabbitMQ(6) 集群部署