RabbitMQ生產部署指南

2022-05-04 13:33:10 字數 4911 閱讀 6232

例如,在單租戶環境中,當您的rabbitmq集群專門為生產中的單個系統供電時,使用預設的虛擬主機(/)是完全正確的

在多租戶環境中,為每個租戶/環境使用單獨的虛擬主機,例如project1_development, project1_production,project2_development和  project2_production等

對於生產環境,請刪除預設使用者(guest),預設使用者只能從本地主機預設連線,因為它具有眾所周知的憑據。不要啟用遠端連線,而應考慮使用具有管理許可權和生成密碼的單獨使用者

建議每個應用程式使用乙個單獨的使用者。例如,如果您有乙個移動應用程式,乙個web應用程式和乙個資料聚合系統,您將有3個獨立的使用者。這使得許多事情更容易:將客戶端連線與應用程式關聯

認證和授權通常會混淆或互換使用。這是錯誤的,在rabbitmq中,兩者是分開的。為了簡單起見,我們將認證定義為「標識使用者是誰」,授權定義為「確定使用者是什麼,不允許做什麼」

預設的虛擬主機和使用者

當伺服器首次開始執行,並檢測到其資料庫未初始化或被刪除時,它將使用一下資源初始化乙個新的資料庫

乙個名為 /虛擬主機

乙個名為guest的使用者,預設密碼為guest,被授予對/虛擬主機的完全訪問許可權

明智的做法是刪除guest使用者或更改密碼,特別是在公共網路上訪問

預設情況下guest使用者被禁止遠端連線到**,它只能通過localhost連線。我們建立的其他使用者預設情況下沒有這種限制

如果我們希望允許guest使用者從遠端主機連線,則應將loopback_users配置設定 為  none,如下:

loopback_users = none

許可權如何工作

當乙個rabbitmq客戶端建立到乙個伺服器的連線時,它指定了乙個虛擬主機。此時執行第一級訪問控制,伺服器檢查使用者是否有權訪問虛擬主機,否則拒絕連線嘗試

資源(即交換和佇列)在特定虛擬主機內被命名為實體;當對資源執行某些操作時,強制執行第二級訪問控制

rabbitmq在資源上有配置、寫入、讀取操作

配置:建立或銷毀資源,或更改其行為

寫: 寫入訊息到資源

讀: 檢索資源的訊息

預設情況下,當rabbitmq檢測到使用的記憶體超過40%(由作業系統報告)時,將不會接收任何訊息:,這是乙個安全的預設值

在修改此值應該小心,即使主機是專用的rabbitmq節點,因為如果沒有足夠的空閒系統記憶體,將會對作業系統交換造成不利影響,甚至會導致rabbitmq程序終止

調整預設vm_memory_high_watermark時的一些建議

託管rabbitmq的節點應始終具有至少128mb的可用記憶體

推薦的vm_memory_high_watermark範圍是  0.40到0.66

值不要超過0.7。作業系統和檔案系統必須至少保留30%的記憶體,否則效能可能因尋呼而嚴重降級

比如修改配置調整為0.6,編輯rabbitmq.conf

vm_memory_high_watermark.relative = 0.6

disk_free_limit預設值是50mb

}是最小推薦值,和記憶體的容量一樣大

例如,在專用於具有4gb系統記憶體的rabbitmq的主機上,如果可用磁碟空間低於4gb,所有發布者將被阻止,並且不會接收新訊息。佇列將需要被排空,通常由消費者,在發布之前將被允許恢復

}是乙個更安全的產品價值

在具有4gb記憶體的rabbitmq節點上,如果可用磁碟空間低於6gb,則所有新訊息都將被阻止,直到磁碟警報清除

}是最保守的產品價值,我們想不出任何理由使用更高的產品。如果您希望rabbitmq擁有所有需要的磁碟空間,編輯rabbitmq.conf,比如修改配置調整為2g

disk_free_limit.absolute = 2gb

保證您的環境至少允許有效的rabbitmq使用者使用至少50k的開放檔案描述符,包括在開發環境中

強烈建議監視系統的幾個方面,從基礎架構和核心度量到rabbitmq到應用程式級度量。雖然監控需要在時間上進行前期投資,但在提前(或根本)解決問題方面非常有效。

參考zabbix監控(

強烈建議所有rabbitmq節點和應用程式(如果可能的話)的日誌都被收集和彙總。日誌對於調查不尋常的系統行為至關重要

節點時間同步

tcp偵聽器配置介面和埠

listeners.tcp.1 = 192.168.1.99:5672

將rabbitmq配置為僅在ipv4和ipv6上的本地主機上偵聽(雙協議)

listeners.tcp.1 = 127.0.0.1:5672

listeners.tcp.2 = :: 1:5672

tcp緩衝區大小

這是關鍵的可調引數之一。每個tcp連線都有為其分配的緩衝區。一般來說,這些緩衝區越大,每個連線使用的記憶體就越多,吞吐量越好

在linux系統上,作業系統缺省會自動調整tcp緩衝區大小,通常在80-120kb之間

可以使用rabbit.tcp_listen_options, rabbitmq_mqtt.tcp_listen_options,  rabbitmq_amqp1_0.tcp_listen_options和相關的配置項來增加緩衝區大小

以下示例將amqp 0-9-1連線的tcp緩衝區設定為192 kib(請注意,將傳送和接收緩衝區大小設定為不同的值是危險的,不推薦使用):即每個連線使用的ram

tcp_listen_options.backlog = 128

tcp_listen_options.nodelay = true

tcp_listen_options.linger.on = true

tcp_listen_options.linger.timeout = 0

tcp_listen_options.sndbuf = 196608

tcp_listen_options.recbuf = 196608

有些環境中每個節點持續併發連線數量比吞吐量更重要,因此需要為每個工作負載找到吞吐量和每個連線的ram使用量之間的最佳值,不建議低於8k

連線握手超時

rabbitmq的連線握手超時,預設10秒。當客戶端執行在嚴重受限的環境中時,可能需要增加超時。這可以通過rabbit.handshake_timeout(毫秒)完成:

handshake_timeout = 20000

os級調整

fs.file-max                     核心將分配的最大檔案數量

net.ipv4.ip_local_port_range 本地ip埠範圍,定義為一對值。範圍必須為併發連線的峰值數量提供足夠的條目

net.ipv4.tcp_tw_reuse 啟用時,允許核心在time_wait 狀態下重新使用套接字

net.ipv4.tcp_fin_timeout 將此值降低到5-10會減少關閉連線保持time_wait狀態的時間。推薦用於預計大量併發連線的情況。

net.core.somaxconn 偵聽佇列的大小(同時建​​立多少個連線)。預設值是128.增加到4096或更高,以支援入站連線突發,例如,當客戶端重新連線時

net.ipv4.tcp_max_syn_backlog 記錄的連線請求的最大數量尚未從連線客戶端收到確認。預設值為128,最大值為65535.當優化吞吐量時,建議使用4096和8192開始值

net.ipv4.conf.default.rp_filter 啟用反向路徑過濾。如果ip位址欺騙 不是您的系統所關心的,請將其禁用

tcp_listen_options.nodelay 設定為true時,禁用 nagle的演算法。預設是真的。強烈建議大多數使用者

tcp_listen_options.sndbuf 預設值由os自動調整,通常在現代linux版本的88 kib至128 kib範圍內。增加緩衝區大小可提高每個連線的消費者吞吐量和ram使用量。減少有相反的效果

tcp_listen_options.recbuf 預設值的效果與rabbit.tcp_listen_options.sndbuf類似,但是對於發布者和協議操作來說一般

tcp_listen_options.backlog 未接受的tcp連線佇列的最大大小。達到這個尺寸時,新的連線將被拒絕。對於具有數千個併發連線和可能的批量客戶端重新連線的環境,設定為4096或更高

tcp_listen_options.keepalive 當設定為true時,啟用tcp保持活動(見上文)。預設是false。對於連線可以長時間閒置(至少10分鐘)的環境有意義,但仍然建議使用心跳

tcp keepalives

net.ipv4.tcp_keepalive_time = 60

net.ipv4.tcp_keepalive_intvl = 15

net.ipv4.tcp_keepalive_probes = 4

tcp包含乙個類似於心跳(aka keepalive)的機制,在訊息傳遞協議和上面的網路核對超時(tcp tickal timeout)中包含tcp保持活動。由於預設設定不足,tcp keepalive通常不會按照預期的方式工作:需要很長時間(例如,乙個小時或更長時間)才能檢測到死亡的對等方。但是,通過調整,它們可以達到與心跳相同的目的,並且有意或無意地清除陳舊的tcp連線,例如選擇不使用心跳的客戶端。下面是tcp keepalive的sysctl配置示例,它認為tcp連線在120秒後宕機或不可達(連線空閒60秒後每15秒4次嘗試):

在rabbitmq操作員無法控制應用程式設定或使用的客戶端庫的環境中,tcp keepalive可以成為有用的附加防禦機制。

分割槽處理策略

在投入生產之前 選擇分割槽處理策略非常重要

強烈建議不要在網路分割槽的環境中部署rabbitmq集群

RabbitMQ使用者指南(RabbitMQ C)

rabbitmq c是乙個用於c語言的,與amqp server進行互動的client庫,amqp協議為版本0 9 1。rabbitmq c與server進行互動前需要首先進行login操作,在操作後,可以根據amqp協議規範,執行一系列操作。介面描述 amqp connection state t...

RabbitMQ使用者指南(RabbitMQ C)

rabbitmq c客戶端使用說明 rabbitmq c是乙個用於c語言的,與amqp server進行互動的client庫,amqp協議為版本0 9 1。rabbitmq c與server進行互動前需要首先進行login操作,在操作後,可以根據amqp協議規範,執行一系列操作。這裡,根據專案需求,...

RabbitMQ使用者指南(RabbitMQ C)

rabbitmq c是乙個用於c語言的,與amqp server進行互動的client庫,amqp協議為版本0 9 1。rabbitmq c與server進行互動前需要首先進行login操作,在操作後,可以根據amqp協議規範,執行一系列操作。介面描述 amqp connection state t...