一、多租戶與權限
每一個RabbitMQ服務器都能創建虛擬的消息服務器,我們稱之爲虛擬主機,簡稱vhost,每個vhost本質上是一個獨立的小型RabbitMQ服務器,擁有自己獨立的隊列交換器及綁定關係,並擁有自己獨立的權限。vhost之間是絕對隔離的,以保證安全性及可移植性。vhost是AMQP概念的基礎,客戶端在連接的時候必須指定一個vhost。
使用rabbitmqctl add_vhost {vhost}
命令創建一個新的vhost;使用rabbitmqctl list_vhosts [vhostInfoItem]
可以查看當前vhost的信息,vhostInfoItem的取值有兩個,name表示vhost的名稱,tracing表示是否使用了RabbitMQ的trace功能;使用rabbitmqctl delete_vhost [hostName]
可以刪除對應的vhost
RabbitMQ中的權限控制是以vhost爲單位的,創建一個用戶時,yoghurt通常會被指派給至少一個vhost,並且只能訪問被指派的vhost內的隊列、交換器和綁定關係,因此RabbitMQ中的授予權限是在vhost級別進行的。授權命令爲rabbitmqctl set_permissions -p [vhost] [user] [conf] [write] [read]
:其中vhost爲vhost名稱,user爲用戶名,conf用於匹配用戶在哪些資源上擁有可配置資源的正則表達式,write用於匹配用戶在哪些資源上擁有可寫資源的正則表達式,read用於匹配用戶在哪些資源上擁有可讀資源的正則表達式。可配置指的是隊列和交換器的創建及刪除的操作,可寫指的是發佈消息,可讀指的是與消息相關的操作。
清除權限的命令爲rabbitmqctl clear_permissions -p [vhost] [userName]
;查看虛擬主機上的權限列表的命令爲rabbitmqctl list_user_permissions -p [vhost]
;查看某個用戶的權限命令爲rabbitmqctl list_user_permissions [userName]
二、用戶管理
RabbitMQ中用戶是訪問控制的基本單元,且單個用戶可以跨越多個vhost進行授權,針對一至多個vhost,用戶可以被賦予不同級別的訪問權限。創建用戶的命令爲rabbitmqctl add_user [userName] [password]
;rabbitmqctl change_password [userName] [newpassword]
命令可以用來更改用戶的密碼;此外rabbitmqctl clear_password [userName]
可以清除密碼,清除密碼後不需要密碼即可登錄;刪除用戶的命令是rabbitmqctl delete_user [userName]
;
rabbitmqctl list_users
命令可以列出當前所有的用戶,後面會緊跟用戶的角色。用戶角色分爲5種:
- node:無任何角色,新創建的用戶角色默認爲none;
- management:可以訪問Web管理頁面;
- policymaker:包含management的所有權限,並且可以管理策略和參數;
- monitoring:包含management的所有權限,並且可以看到所有的連接、信道及節點相關的信息;
- administrator:包含monitoring的所有權限,並且可以管理用戶、虛擬主機、權限、策略、參數等,它是最高權限
用戶的角色可以通過rabbitmqctl set_user_tags [userName] [tag1,tag2..]
進行設置,tag參數可以用於設置0個、1個或多個角色,設置完成後會覆蓋之前的權限
三、Web端管理
使用rabbitmq-plugins enable [plugin-name]
可以啓用相關的插件,rabbitmq-plugins disable [plugin-name]
可以關閉插件
四、應用與集羣管理
1、應用管理
rabbitmqctl stop [pid_file]
用於停止RabbitMQ的Erlang虛擬機和RabbitMQ服務應用,如果指定了pid_file還需要等待指定進程的結束
rabbitmqctl shutdown
用於停止RabbitMQ的虛擬機和RabbitMQ服務應用,執行這個命令後會阻塞直到Erlang虛擬機進程退出,與stop命令不同的是它不需要指定pid_file
rabbitmqctl stop_app
用於通知RabbitMQ服務應用,Erlang虛擬機仍處於運行狀態
rabbitmqctl start_app
用於啓動RabbitMQ應用
rabbitmqctl wait [pid_file]
用於等待RabbitMQ應用的啓動,它會等到pid_file的創建,然後等待pid_file中所代表的進程啓動
rabbitmqctl reset
用於將RabbitMQ節點重置還原到最初的狀態,執行此命令前必須先停止RabbitMQ應用
rabbitmqctl force_reset
用於強制將RabbitMQ節點重置還原到最初狀態,它會無條件地重置節點
rabbitmqctl rotate_logs [suffix]
用於指示RabbitMQ節點輪換日誌文件,RabbitMQ節點會將原來的日誌文件中的內容追加到“原始名稱+後綴”的日誌文件中,然後再將新的日誌內容記錄到新創建的日誌中,當目標文件不存在時會重新創建
rabbitmqctl hipe_compile [directory]
用於將部分RabbitMQ代碼用Hipe(Erlang版的JIT)編譯,並將編譯後的文件保存到指定目錄
2、集羣管理
rabbitmqctl join_cluster [cluster_node] [--ram]
用於將節點加入到指定集羣中,執行前需要停止RabbitMQ並重置節點
rabbitmqctl cluster_status
用於顯示集羣的狀態
rabbitmqctl change_cluster_node_type [disc|ram]
用於修改集羣節點的類型,執行前需要停止RabbitMQ應用
rabbitmqctl forget_cluster_node [--offline]
用於將節點從集羣中刪除,允許離線執行
rabbitmqctl update_cluster_nodes [clusterNode]
用於在集羣中的節點應用啓動前諮詢clusternode節點的最新信息,並更新相應的集羣信息
rabbitmqctl force_boot
用於確保節點可以啓動,即使它不是最後一個關閉的節點(通常情況下RabbitMQ集羣被整個關閉後,重啓的第一個節點應該時最後關閉的節點)
rabbitmqctl sync_queue -p [vhost] [queue]
用於指示未同步隊列queue的slave鏡像可以同步master鏡像行的內容,同步期間此隊列會被阻塞(該隊列的所有生產者消費者),直到同步完成
rabbitmqctl cannel_sync_queue -p [vhost] [queue]
用於取消隊列同步鏡像的操作
rabbitmqctl set_cluster_name [name]
用於設置集羣的名稱,集羣名稱會在客戶端連接時通報給客戶端
五、服務器狀態
rabbitmqctl list_queues -p [vhost] [queueInfoItem...]
命令返回隊列相關的信息,queueInfoItem參數用於指示哪些隊列的信息項顯示在結果集中,結果集的列順序將匹配參數的順序,如果沒有指令queueInfoItem,那麼該命令將顯示隊列額名稱和消息的個數
rabitmqctl list_exchanges -p [vhost] [exchangeInfoItem...]
返回交換器的詳細細節,如果沒有-p vhost將顯示默認的vhost
rabbitmqctl list_bindings - [vhost] [bindingInfoItem...]
將返回綁定關係的細節
rabbitmqctl list_connections [connetionInfoItem...]
返回TCP/IP連接的統計信息
rabbitmqctl list_channels [channelInfoItem...]
返回當前所有信道的信息
rabbitmqctl list_consumers -p [vhost]
列舉消費者信息
rabbitmqctl status
顯示Broker的狀態
rabbitmqctl node_health_check
對RabbitMQ節點進行健康檢查,確定應用是否正常運行,list_queues和list_channels是否能夠正常返回等
rabbitmqctl environment
顯示每個運行程序環境中每個變量的名稱和值
rabbitmqctl report
爲所有服務器狀態生成一個服務器狀態報告,並將輸出重定向到一個文件
rabbitmqctl eval {expr}
執行任意Erlang表達式
若要刪除所有的交換器、隊列及綁定關係,刪除對應的vhost即可,而不需要一個個遍歷刪除
六、HTTP API接口管理
RabbitMQ Management插件提供HTTP API接口來方便調用,如創建隊列可以通過PUT方法調用/api/queues/vhost/name接口來實現。這裏的HTTP API是完全基於RESTful風格的,GET方法一般用來獲取集羣、節點、隊列、交換器等信息,PUT方法用來創建交換器、隊列等資源,DELETE方法用來刪除資源,POST方法同樣用來創建資源,但創建的是無法用具體名稱的資源,如綁定關係及發佈關係
七、環境變量
RabbitMQ提供了三種方式來定製化服務:①通過環境變量配置服務端參數;②通過配置文件定義服務和插件設置;③通過運行時參數和策略定義集羣層面的服務設置
環境變量以RabbitMQ下劃線開頭,可以在Shell中設置,也可以在rabbitmq-env.conf文件中設置,如果在非shell環境中,需要去掉RabbitMQ下劃線開頭。優先級爲Shell環境最優先,conf文件次之,最後是默認的配置。
八、配置文件
1、配置加密
配置文件中一些敏感的信息可以進行加密,RabbitMQ啓動時會對這些信息進行解密,我們需要遵循一些必要的規範,將敏感數據不以文本的形式保存在配置文件中。
比如可以使用{encrypted,<<"加密後的字符串">>}
和{config_enter_decoder,[{passphrase,<<"口令">>}]}
來進行對應的加密和解密,加密後的字符串可以通過rabbitmqctl encode '<<“密碼”>>' 口令
來獲得,解密則可以使用rabbitmqctl encode --decode '{encrypted,<<"加密後的字符串">>}' 口令
來獲取。默認情況下,加密機制PBKDF2用來從口令中派生出密鑰,默認的Hash算法是SHA512,當然這也是可配置的。
2、優化網絡配置
網絡是客戶端和RabbitMQ之間通信的媒介,RabbitMQ支持的所有協議都是基於TCP層面的,除了操作系統內核參數和DNS,所有的RabbitMQ設置都可以通過在rabbitmq.config配置文件中配置實現。
- 默認情況下,RabbitMQ會在所有可用的網絡接口上監聽5672端口,而網絡接口(可以理解爲IP)可以使用rabbit.tcp_listeners選項來配置。
- 增大TCP緩衝區大小可以提高吞吐量,但也會導致服務佔用的內存增大,RabbitMQ中可以使用rabbit.tcp_listen_options來加大配置;另外也可以禁用Nagle算法增大TCP緩衝區大小
- 線程池的大小可以通過Rabbitmq_server_addItional_erl_args環境變量來調節,但並不是越高越能提高吞吐量。
- 在優化併發連接數時需要確保系統有足夠的文件句柄來支撐客戶端和Broker的交互,節點連接數*1.5即爲設置的文件句柄數,增大句柄數會增加閒置內存的使用量
- 禁用Nagle算法可以提高吞吐量,但其主要作用還是用於減少延遲,RabbitMQ內部節點交互式可以在kernel.inet_default_connect_options和kernel.inet_default.tcp_listen_options配置項中配置{nodelay,true}來禁用Nagle算法,rabbitmq.tcp_listen_options中同樣需要添加上述配置;
- 當連接數量過多時,需要確保服務器能夠接受入站連接,爲接受的TCP連接將會放在長度限制的隊列中,可以通過rabbit.tcp_listen_options.backlog參數進行設置,當掛起的連接隊列長度超出此值時,連接將被操作系統拒絕
九、參數及策略
1、RabbitMQ絕大數配置可以通過config文件實現,但部分配置不適合在配置文件中實現,如某項配置需要在運行時更改,因此該類參數也稱爲運行時參數,這裏我們稱之爲Parameter。Parameter可以通過rabbitmqctl工具或者RabbitMQ Management插件提供的HttpAPI接口來設置
2、RabbitMQ中共有兩種類型的Parameter,vhost級別的Parameter和global級別的Parameter。vhost級別的Parameter由一個組件名稱,名稱和值組成,而global級別的參數由一個名稱和值組成,兩者對應的值都是Json格式
vhost級別的參數對應的rabbitmqctl相關的命令有三種:
- set_parameter:用來設置一個參數,
rabbitmqctl set_parameter [-p vhost] {component_name} {name} {value}
- list_parameter:用來列出指定虛擬主機上所有的Parameter,
rabbitmqctl list_parameters [-p vhost]
- clear_parameter:用來清除指定的參數,
rabbitmqctl clear_parameter [-p vhost] {componment_name} {key}
與rabbitmqctl工具對應的HTTPAPI接口如下:
- 設置一個參數:PUT /api/parameters/{componenet_name}/vhost/name
- 清除一個參數:Delete /api/parameters/{componenet_name}/vhost/name
- 列出指定vhost中的所有參數:GET /api/parameters
golbal同上,區別就是將rabbitmqctl命令中的parameter替換爲global_parameter,HTTPAPI接口中的parameters替換爲global-parameter
3、Policy是一種特殊的Parameter用法,它是vhost級別的,一個Policy可以配置一個或多個隊列以便於批量管理,此外Policy支持動態地修改一些屬性參數,如Federation、鏡像、備份交換器、死信等功能,大大提高了應用的靈活度。rabbitmq_managemet插件提供了對Policy的支持,可以在Admin-Poicies中添加一個Policy:
- Virtual host表示當前Policy所在的vhost
- Name表示當前Policy的名稱
- Pattern表示一個正則表達式,用來匹配相關的隊列或者交換器
- Apply to用來指定Policy作用於哪一方;
- Priority表示優先級,如果多個Policy作用於同一個交換器或者隊列,那麼Priority最大的那個Policy纔會有用;
- Definition定義一組或多組鍵值對,爲匹配的交換器或隊列附加相關的功能
Policy作爲一種Parameter,同樣可以使用rabbitmqctl工具或者HTTPAPI接口來操作:
rabbitmqctl set_policy [-p vhost] [--priority] [--apply-to apply-to] {name} {pattern} {definition}
其中參數name、patten和definition是必填項。如果兩個或多個Policy都作用於同一個交換器或者隊列上,且優先級一樣,那麼參數最多的Policy擁有決定權,如果參數一樣多,後添加的Policy具有決定權