RabbitMQ單機及叢集安裝
RabbitMQ 安裝和使用
一、安裝依賴環境
-
在 http://www.rabbitmq.com/which-erlang.html 頁面檢視安裝rabbitmq需要安裝erlang對應的版本
-
在 https://github.com/rabbitmq/erlang-rpm/releases 頁面找到需要下載的erlang版本,
erlang-*.centos.x86_64.rpm
就是centos版本的。 -
複製下載地址後,使用wget命令下載
wget -P /home/download https://github.com/rabbitmq/erlang-rpm/releases/download/v21.2.3/erlang-21.2.3-1.el7.centos.x86_64.rpm
-
安裝 Erlang
sudo rpm -Uvh /home/download/erlang-21.2.3-1.el7.centos.x86_64.rpm
-
安裝 socat
sudo yum install -y socat
二、安裝RabbitMQ
-
在官方下載頁面找到CentOS7版本的下載連結,下載rpm安裝包
wget -P /home/download https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.9/rabbitmq-server-3.7.9-1.el7.noarch.rpm
提示:可以在
https://github.com/rabbitmq/rabbitmq-server/tags下載歷史版本
-
安裝RabbitMQ
sudo rpm -Uvh /home/download/rabbitmq-server-3.7.9-1.el7.noarch.rpm
三、啟動和關閉
-
啟動服務
sudo systemctl start rabbitmq-server
-
檢視狀態
sudo systemctl status rabbitmq-server
-
停止服務
sudo systemctl stop rabbitmq-server
-
設定開機啟動
sudo systemctl enable rabbitmq-server
四、開啟Web管理外掛
-
開啟外掛
rabbitmq-plugins enable rabbitmq_management
說明:rabbitmq有一個預設的guest使用者,但只能通過localhost訪問,所以需要新增一個能夠遠端訪問的使用者。
-
新增使用者
rabbitmqctl add_user admin admin
-
為使用者分配操作許可權
rabbitmqctl set_user_tags admin administrator
-
為使用者分配資源許可權
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
五、防火牆新增埠
- RabbitMQ 服務啟動後,還不能進行外部通訊,需要將埠新增都防火牆
-
新增埠
sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent sudo firewall-cmd --zone=public --add-port=25672/tcp --permanent sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent
-
重啟防火牆
sudo firewall-cmd --reload
多機多節點叢集部署
一、 環境準備
-
準備三臺安裝好RabbitMQ 的機器,安裝方法見 安裝步驟
- 10.10.1.41
- 10.10.1.42
- 10.10.1.43
提示:如果使用虛擬機器,可以在一臺VM上安裝好RabbitMQ後,建立快照,從快照建立連結克隆,會節省很多磁碟空間
二、修改配置檔案
-
修改
10.10.1.41
機器上的/etc/hosts
檔案sudo vim /etc/hosts
-
新增IP和節點名
10.10.1.41 node1 10.10.1.42 node2 10.10.1.43 node3
-
修改對應主機的hostname
hostname node1
hostname node2
hostname node3
-
將
10.10.1.41
上的hosts檔案複製到另外兩臺機器上sudo scp /etc/hosts root@node2:/etc/ sudo scp /etc/hosts root@node3:/etc/
說明:命令中的root是目標機器的使用者名稱,命令執行後,可能會提示需要輸入密碼,輸入對應使用者的密碼就行了
-
將
10.10.1.41
上的/var/lib/rabbitmq/.erlang.cookie
檔案複製到另外兩臺機器上scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/ scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/
提示:如果是通過克隆的VM,可以省略這一步
三、防火牆新增埠
- 給每臺機器的防火牆新增埠
-
新增埠
sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent sudo firewall-cmd --zone=public --add-port=25672/tcp --permanent sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent
-
重啟防火牆
sudo firewall-cmd --reload
四、啟動RabbitMQ
-
啟動每臺機器的RabbitMQ
sudo systemctl start rabbitmq-server
或者
rabbitmq-server -detached
-
將
10.10.1.42
加入到叢集# 停止RabbitMQ 應用 rabbitmqctl stop_app # 重置RabbitMQ 設定 rabbitmqctl reset # 加入到叢集 rabbitmqctl join_cluster rabbit@node1 --ram # 啟動RabbitMQ 應用 rabbitmqctl start_app
-
檢視叢集狀態,看到
running_nodes,[rabbit@node1,rabbit@node2]
表示節點啟動成功rabbitmqctl cluster_status
提示:在管理介面可以更直觀的看到叢集資訊
-
將
10.10.1.43
加入到叢集# 停止 RabbitMQ 應用 rabbitmqctl stop_app # 重置 RabbitMQ 設定 rabbitmqctl reset # 節點加入到叢集 rabbitmqctl join_cluster rabbit@node1 --ram # 啟動 RabbitMQ 應用 rabbitmqctl start_app
-
重複地3步,檢視叢集狀態
單機多節點部署
一、環境準備
- 準備一臺已經安裝好RabbitMQ 的機器,安裝方法見 安裝步驟
- 10.10.1.41
二、啟動RabbitMQ
-
在啟動前,先修改RabbitMQ 的預設節點名(非必要),在
/etc/rabbitmq/rabbitmq-env.conf
增加以下內容# RabbitMQ 預設節點名,預設是rabbit NODENAME=rabbit1
-
RabbitMQ 預設是使用服務的啟動的,單機多節點時需要改為手動啟動,先停止執行中的RabbitMQ 服務
sudo systemctl stop rabbitmq-server
-
啟動第一個節點
rabbitmq-server -detached
-
啟動第二個節點
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
-
啟動第三個節點
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached
-
將rabbit2加入到叢集
# 停止 rabbit2 的應用 rabbitmqctl -n rabbit2 stop_app # 重置 rabbit2 的設定 rabbitmqctl -n rabbit2 reset # rabbit2 節點加入到 rabbit1的叢集中 rabbitmqctl -n rabbit2 join_cluster rabbit1 --ram # 啟動 rabbit2 節點 rabbitmqctl -n rabbit2 start_app
-
將rabbit3加入到叢集
# 停止 rabbit3 的應用 rabbitmqctl -n rabbit3 stop_app # 重置 rabbit3 的設定 rabbitmqctl -n rabbit3 reset # rabbit3 節點加入到 rabbit1的叢集中 rabbitmqctl -n rabbit3 join_cluster rabbit1 --ram # 啟動 rabbit3 節點 rabbitmqctl -n rabbit3 start_app
-
檢視叢集狀態,看到
{running_nodes,[rabbit3@node1,rabbit2@node1,rabbit1@node1]}
說明節點已啟動成功。rabbitmqctl cluster_status
提示:在管理介面可以更直觀的看到叢集資訊
三、防火牆新增埠
- 需要將每個節點的埠都新增到防火牆
-
新增埠
sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent sudo firewall-cmd --zone=public --add-port=25672/tcp --permanent sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent sudo firewall-cmd --zone=public --add-port=5673/tcp --permanent sudo firewall-cmd --zone=public --add-port=25673/tcp --permanent sudo firewall-cmd --zone=public --add-port=15673/tcp --permanent sudo firewall-cmd --zone=public --add-port=5674/tcp --permanent sudo firewall-cmd --zone=public --add-port=25674/tcp --permanent sudo firewall-cmd --zone=public --add-port=15674/tcp --permanent
-
重啟防火牆
sudo firewall-cmd --reload
映象佇列模式叢集
-
映象佇列屬於RabbitMQ 的高可用方案,見:https://www.rabbitmq.com/ha.html#mirroring-arguments
-
通過前面的步驟搭建的叢集屬於普通模式叢集,是通過共享元資料實現叢集
-
開啟映象佇列模式需要在管理頁面新增策略,新增方式:
-
進入管理頁面 -> Admin -> Policies(在頁面右側)-> Add / update a policy
-
在表單中填入:
name: ha-all Pattern: ^ Apply to: Queues Priority: 0 Definition: ha-mode = all
引數說明
name: 策略名稱,如果使用已有的名稱,儲存後將會修改原來的資訊
Apply to:策略應用到什麼物件上
Pattern:策略應用到物件時,物件名稱的匹配規則(正則表示式)
Priority:優先順序,數值越大,優先順序越高,相同優先順序取最後一個
Definition:策略定義的類容,對於映象佇列的配置來說,只需要包含3個部分:
ha-mode
、ha-params
和ha-sync-mode
。其中,ha-sync-mode
是同步的方式,自動還是手動,預設是自動。ha-mode
和ha-params
組合使用。組合方式如下:
ha-mode ha-params 說明 all (empty) 佇列映象到叢集類所有節點 exactly count 佇列映象到叢集內指定數量的節點。如果叢集內節點數少於此值,佇列將會映象到所有節點。如果大於此值,而且一個包含映象的節點停止,則新的映象不會在其它節點建立。 nodes nodename 佇列映象到指定節點,指定的節點不在叢集中不會報錯。當佇列申明時,如果指定的節點不線上,則佇列會被建立在客戶端所連線的節點上。 -
-
映象佇列模式相比較普通模式,映象模式會佔用更多的頻寬來進行同步,所以映象佇列的吞吐量會低於普通模式
-
但普通模式不能實現高可用,某個節點掛了後,這個節點上的訊息將無法被消費,需要等待節點啟動後才能被消費。
記憶體告警
預設情況下 set_vm_memory_high_watermark
的值為 0.4,即記憶體閾值(臨界值)為 0.4,表示當 RabbitMQ 使用的記憶體超過 40%時,就會產生記憶體告警並阻塞所有生產者的連線。一旦告警被解除(有訊息被消費或者從記憶體轉儲到磁碟等情況的發生), 一切都會恢復正常。
在出現記憶體告警後,所有的客戶端連線都會被阻塞。阻塞分為 blocking
和 blocked
兩種。
- blocking:表示沒有傳送訊息的連結。
- blocked:表示試圖傳送訊息的連結。
如果出現了記憶體告警,並且機器還有可用記憶體,可以通過命令調整記憶體閾值,解除告警。
rabbitmqctl set_vm_memory_high_watermark 1
或者
rabbitmqctl set_vm_memory_high_watermark absolute 1GB
但這種方式只是臨時調整,RabbitMQ 服務重啟後,會還原。如果需要永久調整,可以修改配置檔案。但修改配置檔案需要重啟RabbitMQ 服務才能生效。
-
修改配置檔案:
vim /etc/rabbitmq/rabbitmq.conf
vm_memory_high_watermark.relative = 0.4
或者
vm_memory_high_watermark.absolute = 1GB
模擬記憶體告警
-
調整記憶體閾值,模擬出告警,在RabbitMQ 伺服器上修改。
注意:修改之前,先在管理頁面看一下當前使用了多少,調成比當前值小
rabbitmqctl set_vm_memory_high_watermark absolute 50MB
-
重新整理管理頁面(可能需要重新整理多次),在
Overview -> Nodes
中可以看到Memory變成了紅色,表示此節點記憶體告警了 -
啟動
Producer
和Consumer
-
檢視管理介面的
Connections
頁面,可以看到生產者和消費者的連結都處於blocking
狀態。 -
在
Producer
的控制檯按回車健,再觀察管理介面的Connections
頁面,會發現生產者的狀態成了blocked
。 -
此時雖然在
Producer
控制檯看到了傳送兩條訊息的資訊,但Consumer
並沒有收到任何訊息。並且在管理介面的Queues
頁面也看到不到佇列的訊息數量有變化。 -
解除記憶體告警後,會發現
Consumer
收到了Producer
傳送的兩條訊息。
記憶體換頁
-
在Broker節點的使用記憶體即將達到記憶體閾值之前,它會嘗試將佇列中的訊息儲存到磁碟以釋放記憶體空間,這個動作叫記憶體換頁。
-
持久化和非持久化的訊息都會被轉儲到磁碟中,其中持久化的訊息本身就在磁碟中有一份副本,此時會將持久化的訊息從記憶體中清除掉。
-
預設情況下,在記憶體到達記憶體閾值的 50%時會進行換頁動作。也就是說,在預設的記憶體閾值為 0.4 的情況下,當記憶體超過 0.4 x 0 .5=0.2 時會進行換頁動作。
-
通過修改配置檔案,調整記憶體換頁分頁閾值(不能通過命令調整)。
# 此值大於1時,相當於禁用了換頁功能。 vm_memory_high_watermark_paging_ratio = 0.75
磁碟告警
-
當磁碟剩餘空間低於磁碟的閾值時,RabbitMQ 同樣會阻塞生產者,這樣可以避免因非持久化的訊息持續換頁而耗盡磁碟空間導致服務崩潰
-
預設情況下,磁碟閾值為50MB,表示當磁碟剩餘空間低於50MB 時會阻塞生產者並停止記憶體中訊息的換頁動作
-
這個閾值的設定可以減小,但不能完全消除因磁碟耗盡而導致崩漬的可能性。比如在兩次磁碟空間檢測期間內,磁碟空間從大於50MB被耗盡到0MB
-
通過命令可以調整磁碟閾值,臨時生效,重啟恢復
# disk_limit 為固定大小,單位為MB、GB rabbitmqctl set_disk_free_limit <disk_limit>
或者
# fraction 為相對比值,建議的取值為1.0~2.0之間 rabbitmqctl set_disk_free_limit mem_relative <fraction>
模擬磁碟告警
-
在伺服器通過命令,臨時調整磁碟閾值(需要設定一個絕對大與當前磁碟空間的數值)
rabbitmqctl set_disk_free_limit 102400GB
-
重新整理管理頁面(可能需要重新整理多次),在 Overview -> Nodes 中可以看到Disk space變成了紅色,表示此節點磁碟告警了
-
後續步驟同模擬記憶體告警。