rabbitmq集羣功能和原理:node
設計集羣目的:正則表達式
容許消費者和生產者在RabbitMQ節點崩潰的狀況下繼續運行算法
經過增長更多的節點來擴展消息通訊的吞吐量shell
rabbitmq能夠經過三種方式來部署分佈式集羣系統,分別是:cluster、federation、shovel數據庫
cluster:後端
不支持誇網段,用於同一個網段內的局域網安全
能夠隨意動態的增長和減小服務器
節點之間須要運行相同版本的rabbitmq和erlangmarkdown
federation:應用於廣域網,容許單臺服務器上的交換機或隊列接收發布到另外一臺服務器交換機或隊列的消息,能夠是單獨機器或集羣。federation隊列相似於單向點對點鏈接,消息會在聯盟隊列之間轉發任意次,直到被消費者接受。一般使用federation來鏈接internet上的中間服務器,用做訂閱分發消息或工做隊列cookie
shovel:鏈接方式與federation的鏈接方式相似,但它工做在更低層次,能夠應用於廣域網
節點類型
RAM node:內存節點將全部隊列、交換機、綁定、用戶、權限、和vhost的元數據定義存儲在內存中,好處是可使得交換機和隊列聲明等操做更加快捷
Disk node:將元數據存儲在磁盤中,單節點系統只容許磁盤類型的節點,防止重啓rabbitmq的時候,丟失系統的配置信息
說明:rabbitmq要求集羣中至少有一個磁盤節點,全部其餘節點能夠是內存節點,當節點加入或者離開時,必需要將該變動通知一個磁盤節點。若是集羣中惟一的磁盤節點崩潰,集羣扔可保持運行,可是沒法進行其餘操做(增刪改查),直到節點恢復
解決方法:設置兩個磁盤節點,至少一個是可用的,能夠保存元數據的更改
Erlang Cookie
Erlang Cookie是保證不一樣節點能夠相互通訊的密鑰,要保證集羣中的不一樣節點相互通訊必須共享相同的Erlang Cookie。
說明:這就要從rabbitmqctl命令的原理提及,rabbitmq底層是經過erlang架構來實現的,因此rabbitmqctl會啓動erlang節點,並基於erlang節點來使用erlang系統鏈接rabbitmq節點。在鏈接過程當中須要正確的Erlang Cookie和節點名稱,Erlang節點經過交換Erlang Cookie以得到認證
RabbitMQ的Cluster集羣模式通常分爲兩種,普通模式和鏡像模式
普通模式:默認的集羣模式,以兩個節點(rabbit0一、rabbit02)爲例來進行說明。對於Queue來講,消息實體只存在於其中一個節點rabbit01(或者rabbit02),rabbit01和rabbit02兩個節點僅有相同的元數據,即隊列的結構。當消息進入rabbit01節點的Queue後,consumer從rabbit02節點消費時,RabbitMQ會臨時在rabbit0一、rabbit02間進行消息傳輸,把A中的消息實體取出並通過B發送給consumer。因此consumer應儘可能鏈接每個節點,從中取消息。即對於同一個邏輯隊列,要在多個節點創建物理Queue。不然不管consumer連rabbit01或rabbit02,出口總在rabbit01,會產生瓶頸。當rabbit01節點故障後,rabbit02節點沒法取到rabbit01節點中還未消費的消息實體。若是作了消息持久化,那麼得等rabbit01節點恢復,而後纔可被消費;若是沒有持久化的話,就會產生消息丟失的現象
鏡像模式:將須要消費的隊列變爲鏡像隊列,存在於多個節點,這樣就能夠實現RabbitMQ的HA高可用性。做用就是消息實體會主動在鏡像節點之間實現同步,而不是像普通模式那樣,在consumer消費數據時臨時讀取。缺點就是,集羣內部的同步通信會佔用大量的網絡帶寬
實現機制
鏡像隊列實現了RabbitMQ的高可用性(HA),具體的實現策略以下所示:
ha-mode | ha-params | 功能 |
---|---|---|
all | 空 | 鏡像隊列將會在整個集羣中複製。當一個新的節點加入後,也會在這 個節點上覆制一份。 |
exactly | count | 鏡像隊列將會在集羣上覆制count份。若是集羣數量少於count時候,隊列會複製到全部節點上。若是大於Count集羣,有一個節點crash後,新進入節點也不會作新的鏡像。 |
nodes | node name | 鏡像隊列會在node name中複製。若是這個名稱不是集羣中的一個,這不會觸發錯誤。若是在這個node list中沒有一個節點在線,那麼這個queue會被聲明在client鏈接的節點。 |
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
-p Vhost: 可選參數,針對指定vhost下的queue進行設置
Name: policy的名稱
Pattern: queue的匹配模式(正則表達式)
Definition:鏡像定義,包括三個部分ha-mode, ha-params, ha-sync-mode ha-mode:指明鏡像隊列的模式,有效值爲 all/exactly/nodes all:表示在集羣中全部的節點上進行鏡像 exactly:表示在指定個數的節點上進行鏡像,節點的個數由ha-params指定 nodes:表示在指定的節點上進行鏡像,節點名稱經過ha-params指定 ha-params:ha-mode模式須要用到的參數 ha-sync-mode:進行隊列中消息的同步方式,有效值爲automatic和manual priority:可選參數,policy的優先級
下面的命令來查看那些slaves已經完成同步
rabbitmqctl list_queues name slave_pids synchronised_slave_pids
能夠經過手動的方式同步一個queue:
rabbitmqctl sync_queue name
一樣也能夠取消某個queue的同步功能:
rabbitmqctl cancel_sync_queue name
一般隊列由兩部分組成:一部分是AMQQueue,負責AMQP協議相關的消息處理,即接收生產者發佈的消息、向消費者投遞消息、處理消息confirm、acknowledge等等;另外一部分是BackingQueue,它提供了相關的接口供AMQQueue調用,完成消息的存儲以及可能的持久化工做等
在RabbitMQ中BackingQueue又由5個子隊列組成:Q1, Q2, Delta, Q3和Q4。RabbitMQ中的消息一旦進入隊列,不是固定不變的,它會隨着系統的負載在隊列中不斷流動,消息的不斷髮生變化。與這5個子隊列對於,在BackingQueue中消息的生命週期分爲4個狀態:
注意:對於持久化的消息,消息內容和消息全部都必須先保存在DISK上,纔會處於上述狀態中的一種,而Gamma狀態的消息是隻有持久化的消息纔會有的狀態
上述就是RabbitMQ的多層隊列結構的設計,咱們能夠看出從Q1到Q4,基本經歷RAM->DISK->RAM這樣的過程。這樣設計的好處是:當隊列負載很高的狀況下,可以經過將一部分消息由磁盤保存來節省內存空間,當負載下降的時候,這部分消息又漸漸回到內存,被消費者獲取,使得整個隊列具備很好的彈性
rabbitmqctl — 用於管理中間件的命令行工具
rabbitmqctl [-n node] [-t timeout] [-q] {command} [command options…]
RabbitMQ是AMQP的實現, 後者是高性能企業消息通訊的新興標準. RabbitMQ server是AMQP 中間件健壯的,可擴展的實現.
rabbitmqctl 用來管理RabbitMQ中間件的命令行工具.它經過鏈接中間件節點來執行全部操做。
若是中間件沒有運行,將會顯示診斷信息, 不能到達,或因不匹配Erlang cookie而拒絕鏈接.
[-n node]
默認節點是」rabbit@server」,此處的server是本地主機. 在一個名爲」server.example.com」的主機上, RabbitMQ Erlang node 的節點名稱一般是rabbit@server (除非RABBITMQ_NODENAME在啓動時設置了非默認值). hostname -s 的輸出一般是」@」 標誌後的東西.查看rabbitmq-server(1)來了解配置RabbitMQ broker的細節.
[-q]
使用-q標誌來啓用寧靜(quiet)模式,這會一致消息輸出.
[-t timeout]
操做超時時間(秒爲單位). 只適用於"list" 命令. 默認是無窮大.
應用程序和集羣管理
stop [pid_file]
用於中止運行RabbitMQ的Erlang node.若是指定了pid_file,還將等待指定的過程結束。例如: rabbitmqctl stop 此命令會終止RabbitMQ node的運行.
stop_app
中止RabbitMQ application,但Erlang node會繼續運行.此命令主要用於優先執行其它管理操做(這些管理操做須要先中止RabbitMQ application),如. reset.例如: rabbitmqctl stop_app
start_app
啓動RabbitMQ application. 此命令典型用於在執行了其它管理操做以後,從新啓動中止的RabbitMQ application。如reset.例如: rabbitmqctl start_app 此命令來指導RabbitMQ node來啓動RabbitMQ application.
wait {pid_file}
等待RabbitMQ application啓動.此命令用來等待RabbitMQ application來啓動node。它會等待建立pid文件,而後等待pid文件中的特定pid過程啓動,最後等待RabbitMQ application 來啓動node. pid file是經過rabbitmq-server 腳原本建立的.默認狀況下,它存放於Mnesia目錄中. 修改RABBITMQ_PID_FILE 環境變量能夠改變此位置。如: rabbitmqctl wait /var/run/rabbitmq/pid 此命令會在RabbitMQ node啓動後返回.
reset
將RabbitMQ node還原到最初狀態.包括從所在羣集中刪除此node,從管理數據庫中刪除全部配置數據,如已配置的用戶和虛擬主機,以及刪除全部持久化消息. 執行reset和force_reset以前,必須中止RabbitMQ application ,如使用stop_app. 示例: rabbitmqctl reset 此命令會重設RabbitMQ node.
force_reset
強制RabbitMQ node還原到最初狀態. 不一樣於reset , force_reset 命令會無條件地重設node,不論當前管理數據庫的狀態和集羣配置是什麼. 它只能在數據庫或集羣配置已損壞的狀況下才可以使用。 執行reset和force_reset以前,必須中止RabbitMQ application ,如使用stop_app. 示例: rabbitmqctl force_reset 此命令會重設RabbitMQnode.
rotate_logs {suffix}
指示RabbitMQ node循環日誌文件. RabbitMQ 中間件會將原來日誌文件中的內容追加到原始名稱和後輟的日誌文件中,而後再將原始日誌文件內容複製到新建立的日誌上。實際上,當前日誌內容會移到以此後輟結尾的文件上。當目標文件不存在時,將會進行建立。若是不指定後輟,則不會發生循環,日誌文件只是從新打開。示例: rabbitmqctl rotate_logs .1 此命令指示RabbitMQ node將日誌文件的內容追加到新日誌文件(文件名由原日誌文件名和.1後輟構成)中。如. rabbit@mymachine.log.1 和 rabbit@mymachine-sasl.log.1. 最後, 日誌會在原始位置恢復到新文件中.
集羣管理
join_cluster {clusternode} [–ram]
clusternode 加入集羣的節點. [--ram] 若是進行了設置,節點將以RAM節點身份加入集羣. 指導節點成爲集羣中的一員. 在加入集羣以前,節點會重置,所以在使用此命令時,必須當心. 這個命令要成功,RabbitMQ應用程序必須先中止,如stop_app. 集羣節點能夠是兩種類型: 磁盤節點(Disc Node) 或 內存節點(RAM Node).磁盤節點會在RAM和磁盤中複製數據, 經過冗餘能夠防止節點失效事件,並可從斷電這種全局事件中進行恢復. RAM節點只在RAM中複製數據(除了隊列的內容外,還依賴於隊列是不是持久化的或者內容對於內存來講是否過大) ,並主要用於可伸縮性. RAM節點只有當管理資源(如,增長/刪除隊列,交換機,或綁定)的時候才具備更高的性能.一個集羣必須至少有一個磁盤節點,一般來講還不止一個. 默認狀況下,節點是磁盤節點.若是你想要建立內存節點,須要提供--ram 標誌. 在執行cluster命令以後, 不管什麼時候,當前節點上啓動的RabbitMQ 應用程序在節點宕機的狀況下,會嘗試鏈接集羣中的其它節點。 要脫離集羣, 必須重設(reset)節點. 你也能夠經過forget_cluster_node 命令來遠程刪除節點. 更多詳情,參考集羣指南. 例如: rabbitmqctl join_cluster hare@elena --ram 此命令用於指示RabbitMQ node以ram節點的形式將 hare@elena 加入集羣.
cluster_status
按節點類型來分組展現集羣中的全部節點,包括當前運行的節點. 例如: rabbitmqctl cluster_status 此命令會顯示集羣中的全部節點.
change_cluster_node_type {disc | ram}
修改集羣節點的類型. 要成功執行此操做,必須首先中止節點,要將節點轉換爲RAM節點,則此節點不能是集羣中的惟一disc節點。 例如: rabbitmqctl change_cluster_node_type disc 此命令會將一個RAM節點轉換爲disc節點.
forget_cluster_node [–offline]
[--offline] 容許節點從脫機節點中刪除. 這隻在全部節點都脫機且最後一個掉線節點不能再上線的狀況下有用,從而防止整個集羣從啓動。它不能使用在其它狀況下,由於這會致使不一致. 遠程刪除一個集羣節點.要刪除的節點必須是脫機的, 而在刪除節點期間節點必須是在線的,除非使用了--offline 標誌. 當使用--offline 標誌時,rabbitmqctl不會嘗試正常鏈接節點;相反,它會臨時改變節點以做修改.若是節點不能正常啓動的話,這是很是有用的.在這種狀況下,節點將變成集羣元數據的規範源(例如,隊列的存在),即便它不是之前的。所以,若是有可能,你應該在最新的節點上使用這個命令來關閉。 例如: rabbitmqctl -n hare@mcnulty forget_cluster_node rabbit@stringer 此命令會從節點hare@mcnulty中刪除rabbit@stringer節點.
rename_cluster_node {oldnode1} {newnode1} [oldnode2] [newnode2 …]
支持在本地數據庫中重命名集羣節點. 此子命令會促使rabbitmqctl臨時改變節點以做出修改. 所以本地集羣必須是中止的,其它節點能夠是在線或離線的. 這個子命令接偶數個參數,成對錶示節點的舊名稱和新名稱.你必須指定節點的舊名稱和新名稱,由於其它中止的節點也可能在同一時間重命名. 同時中止全部節點來重命名也是能夠的(在這種狀況下,每一個節點都必須給出舊名稱和新名稱)或一次中止一個節點來重命名(在這種狀況下,每一個節點只須要被告知其名句是如何變化的). 例如: rabbitmqctl rename_cluster_node rabbit@misshelpful rabbit@cordelia 此命令來將節點名稱rabbit@misshelpful 重命名爲rabbit@cordelia.
update_cluster_nodes {clusternode}
clusternode 用於諮詢具備最新消息的節點. 指示已集羣的節點醒來時聯繫clusternode.這不一樣於join_cluster ,由於它不會加入任何集羣 - 它會檢查節點已經以clusternode的形式存在於集羣中了. 須要這個命令的動機是當節點離線時,集羣能夠變化.考慮這樣的狀況,節點A和節點B都在集羣裏邊,這裏節點A掉線了,C又和B集羣了,而後B又離開了集羣.當A醒來的時候,它會嘗試聯繫B,但這會失敗,由於B已經不在集羣中了.update_cluster_nodes -n A C 可解決這種場景.
force_boot
確保節點將在下一次啓動,即便它不是最後一個關閉的。一般狀況下,當你關閉整個RabbitMQ 集羣時,你重啓的第一個節點應該是最後一個下線的節點,由於它能夠看到其它節點所看不到的事情. 但有時這是不可能的:例如,若是整個集羣是失去了電力而全部節點都在想它不是最後一個關閉的.
在這種節點掉線狀況下,你能夠調用rabbitmqctl force_boot .這就告訴節點下一次無條件的啓動節點.在此節點關閉後,集羣的任何變化,它都會丟失. 若是最後一個掉線的節點永久丟失了,那麼你須要優先使用rabbitmqctl forget_cluster_node --offline, 由於它能夠確保在丟失的節點上掌握的鏡像隊列獲得提高。 例如: rabbitmqctl force_boot 這能夠強制節點下次啓動時不用等待其它節點.
sync_queue [-p vhost] {queue}
queue 同步隊列的名稱 指示未同步slaves上的鏡像隊列自行同步.同步發生時,隊列會阻塞(全部出入隊列的發佈者和消費者都會阻塞).此命令成功執行後,隊列必須是鏡像的. 注意,未同步隊列中的消息被耗盡後,最終也會變成同步. 此命令主要用於未耗盡的隊列。
cancel_sync_queue [-p vhost] {queue}
queue 取消同步的隊列名稱. 指示同步鏡像隊列中止同步.
purge_queue [-p vhost] {queue}
queue 要清除隊列的名稱. 清除隊列(刪除其中的全部消息).
set_cluster_name {name}
設置集羣名稱. 集羣名稱在client鏈接時,會通報給client,也可用於federation和shovel插件記錄消息的來源地. 羣集名稱默認是來自在羣集中的第一個節點的主機名,但能夠改變。 例如: rabbitmqctl set_cluster_name london 設置集羣名稱爲"london".
用戶管理
注意rabbitmqctl 管理RabbitMQ 內部用戶數據庫. 任何來自其它認證後端的用戶對於rabbitmqctl來講是不可見的.
add_user {username} {password}
username 要建立的用戶名稱. password 設置建立用戶登陸broker的密碼. rabbitmqctl add_user tonyg changeit 此命令用於指示RabbitMQ broker 建立一個擁有非管理權限的用戶,其名稱爲tonyg, 初始密碼爲changeit.
delete_user {username}
username 要刪除的用戶名稱. 例如: rabbitmqctl delete_user tonyg 此命令用於指示RabbitMQ broker刪除名爲tonyg的用戶
change_password {username} {newpassword}
username 要修改密碼的用戶名稱. newpassword 用戶的新密碼. 例如: rabbitmqctl change_password tonyg newpass 此命令用於指定RabbitMQ broker將tonyg 用戶的密碼修改成newpass.
clear_password {username}
username 要清除密碼的用戶名稱. 例如: rabbitmqctl clear_password tonyg 此命令會指示RabbitMQ broker清除名爲tonyg的用戶密碼.如今,此用戶不能使用密碼登陸(但能夠經過SASL EXTERNAL登陸,若是配置了的話).
authenticate_user {username} {password}
username 用戶的名稱. password 用戶的密碼. 例如: rabbitmqctl authenticate_user tonyg verifyit 此命令會指示RabbitMQ broker以名稱爲tonyg, 密碼爲verifyit來進行驗證.
set_user_tags {username} {tag …}
username 要設置tag的用戶名稱. tag 用於設置0個,1個或多個tags.任何現有的tags都將被刪除. 例如: rabbitmqctl set_user_tags tonyg administrator 此命令指示RabbitMQ broker用於確保tonyg 是administrator.當經過AMQP來登陸時,這沒有什麼效果,但用戶經過其它的途經來登陸時,它可用來管理用戶,虛擬主機和權限(如使用管理插件). rabbitmqctl set_user_tags tonyg 此命令會指示RabbitMQ broker刪除tonyg上的任何現有的tag.
list_users
列出用戶. 每一個結果行都包含用戶名,其後緊跟用戶的tags. 例如: rabbitmqctl list_users 此命令指示RabbitMQ broker列出全部用戶.
訪問控制
注意rabbitmqctl 會管理RabbitMQ的內部用戶數據庫. 無權限的用戶將不能使用rabbitmqctl.
add_vhost {vhost}
vhost 要建立虛擬主機名稱. 建立一個虛擬主機. 例如: rabbitmqctl add_vhost test 此命令指示RabbitMQ broker來建立一個新的名爲test的虛擬主機.
delete_vhost {vhost}
vhost 要刪除的虛擬主機的名稱. 刪除一個虛擬主機. 刪除一個虛擬主機,同時也會刪除全部交換機,隊列,綁定,用戶權限,參數和策略. 例如: rabbitmqctl delete_vhost test 此命令指示RabbitMQ broker刪除名爲test的虛擬主機.
list_vhosts [vhostinfoitem …]
列出全部虛擬主機. vhostinfoitem 參數用於標識哪些虛擬主機應該包含在結果集中.結果集中的列順序會匹配參數的順序.vhostinfoitem 可接受下面的值: name 虛擬主機的名稱. tracing 是否對虛擬主機啓用追蹤. 若是沒有指定vhostinfoitem 參數,那麼會顯示虛擬主機名稱. 例如: rabbitmqctl list_vhosts name tracing 此命令用於指示RabbitMQ broker顯示全部虛擬主機.
set_permissions [-p vhost] {user} {conf} {write} {read}
vhost 授予用戶可訪問的虛擬機名稱,默認是/. user 可訪問指定虛擬主機的用戶名稱. conf 一個用於匹配用戶在哪些資源名稱上擁有配置權限的正則表達式 write 一個用於匹配用戶在哪些資源名稱上擁有寫權限的正則表達式. read 一個用於匹配用戶在哪些資源名稱上擁有讀權限的正則表達式. 設置用戶權限. 例如: rabbitmqctl set_permissions -p /myvhost tonyg "^tonyg-.*" ".*" ".*" 此命令表示RabbitMQ broker授予tonyg 用戶可訪問 /myvhost虛擬主機,並在資源名稱以"tonyg-"開頭的全部資源上都具備配置權限,並在全部資源上都擁有讀寫權限。
clear_permissions [-p vhost] {username}
vhost 用於設置禁止用戶訪問的虛擬主機名稱,默認爲/. username 禁止訪問特定虛擬主機的用戶名稱. 設置用戶權限. 例如: rabbitmqctl clear_permissions -p /myvhost tonyg 此命令用於指示RabbitMQ broker禁止tonyg 用戶訪問/myvhost虛擬主機.
list_permissions [-p vhost]
vhost 用於指定虛擬主機名稱,將會列出全部可訪問此虛擬主機的全部用戶名稱和權限.默認爲/. 顯示虛擬機上權限. 例如: rabbitmqctl list_permissions -p /myvhost 此命令指示RabbitMQ broker列出全部已受權訪問/myvhost 虛擬主機的用戶,同時也會列出這些用戶能在虛擬主機資源可操做的權限.注意,空字符串表示沒有任何授予的權限。
list_user_permissions {username}
username 要顯示權限的用戶名稱. 列出用戶權限. 例如: rabbitmqctl list_user_permissions tonyg 此命令指示RabbitMQ broker列出tonyg可受權訪問的全部虛擬主機名稱,以及在這些虛擬主機上的操做.
參數管理
RabbitMQ的某些特性(如聯合插件)是動態控制的. 每一個參數都是與特定虛擬主機相關的組件名稱, name和value構成的. 組件名稱和name都是字符串,值是Erlang term. 參數可被設置,清除和顯示.一般你能夠參考文檔來了解如何設置參數.
set_parameter [-p vhost] {component_name} {name} {value}
設置一個參數. component_name 要設置的組件名稱. name 要設置的參數名稱. value 要設置的參數值,做不JSON項。在多數shells中,你更喜歡將其引發來. 例如: rabbitmqctl set_parameter federation local_username '"guest"' 此命令用於在默認虛擬主機上設置federation 組件的local_username 參數值"guest".
clear_parameter [-p vhost] {component_name} {key}
清除參數. component_name 要清除參數的組件名稱. name 要清除的參數名稱. 例如: rabbitmqctl clear_parameter federation local_username 此命令用於清除默認虛擬主機上的federation 組件的local_username 參數值.
list_parameters [-p vhost]
列出虛擬主機上的全部參數. 示例: rabbitmqctl list_parameters 此命令用於列出默認虛擬主機上的全部參數.
策略管理
策略用於在集羣範圍的基礎上用於控制和修改隊列和交換機的行爲. 策略應用於虛擬主機,由name, pattern, definition或可選的priority組成. 策略可被設置,清除和列舉.
set_policy [-p vhost] [–priority priority] [–apply-to apply-to] {name} {pattern} {definition}
設置策略. name 策略名稱. pattern 正則表達式, 匹配要應用的資源 definition 策略的定義,JSON形式.在大多數shells中,你極可能須要引用這個 priority 策略的整數優先級. 數字越高則優先級越高.默認是0. apply-to 策略適用的對象類型,其值可爲 "queues", "exchanges" 或 "all".默認是"all". 例如: rabbitmqctl set_policy federate-me "^amq." '{"federation-upstream-set":"all"}' 此命令在默認虛擬主機上設置策略爲federate-me,這樣內建的交換器將進行聯合.
clear_policy [-p vhost] {name}
清除策略. name 要清除的策略名稱. 例如: rabbitmqctl clear_policy federate-me 此命令來清除默認虛擬主機上的federate-me 策略.
list_policies [-p vhost]
顯示虛擬主機上的全部策略. 例如: rabbitmqctl list_policies 此命令會顯示默認虛擬主機上的全部策略.
服務器狀態
服務器狀態查詢查詢服務器返回一個結果以製表符分隔的列表. 某些查詢(list_queues, list_exchanges, list_bindings, 和 list_consumers) 接受一個可選的vhost 參數. 若是這個參數出現了,那麼它必須指定在查詢的後面.
list_queues, list_exchanges and list_bindings 命令接受一個可選的虛擬主機參數以顯示其結果.默認值爲」/」.
list_queues [-p vhost] [queueinfoitem …]
返回隊列的詳細信息. 若是無-p標誌,將顯示/虛擬主機上的隊列詳情."-p" 標誌可用來覆蓋此默認值. queueinfoitem 參數用於指示哪些隊列信息項會包含在結果集中.結果集的列順序將匹配參數的順序.queueinfoitem 能夠是下面列表中的任何值: name 非ASCII字符的隊列名稱. durable 服務器重啓後,隊列是否能倖存. auto_delete 再也不使用時,是否須要自動刪除隊列. arguments 隊列參數. policy 應用到隊列上的策略名稱. pid 關聯隊列的Erlang進程ID. owner_pid 表示隊列專用全部者的表明鏈接的Erlang進程ID.若是隊列是非專用的,此值將爲空. exclusive True:若是隊列是專用的(即有owner_pid), 反之false exclusive_consumer_pid 表示此channel的專用消費者訂閱到此隊列的Erlang進程Id. 若是沒有專用消費者,則爲空. exclusive_consumer_tag 專用消費者訂閱到此隊列的Consumer tag.若是沒有專用消費者,則爲空. messages_ready 準備分發給客戶端的消息數目. messages_unacknowledged 分發到客戶端但還沒有應答的消息數目. messages 準備分發和未應答消息的總和(隊列深度). messages_ready_ram 駐留在ram中messages_ready的消息數目. messages_unacknowledged_ram 駐留在ram中messages_unacknowledged的消息數目. messages_ram 駐留在ram中的消息總數. messages_persistent 隊列中持久化消息的數目(對於瞬時隊列老是0). message_bytes 隊列中全部消息體的大小總和.這不包括消息屬性(包括headers) 或任何開銷(overhead)。 message_bytes_ready 相似於message_bytes ,但只統計準備投遞給clients的那些消息. message_bytes_unacknowledged 相似於message_bytes ,但只統計那些已經投遞給clients但還未應答的消息 message_bytes_ram 相似於message_bytes ,但只統計那些在RAM中的消息 message_bytes_persistent 相似於message_bytes ,但只統計那些持久化的消息 head_message_timestamp 若是存在,只顯示隊列中第1個消息的timestamp屬性. 消息的時間戳只出如今分頁狀況下. disk_reads 從隊列啓動開如,已從磁盤上讀取該隊列的消息總次數. disk_writes 從隊列啓動開始,已向磁盤隊列寫消息總次數. consumers 消費者數目. consumer_utilisation 時間分數(0.0與1.0之間),隊列可當即向消費者投遞消息. 它能夠小於1.0,若是消費者受限於網絡堵塞或預提取數量. memory 與隊列相關的Erlang進程消耗的內存字節數,包括棧,堆以及內部結構. slave_pids 若是隊列是鏡像的,這裏給出的是當前slaves的IDs. synchronised_slave_pids 若是隊列是鏡像的,當前slaves的IDs是master同步的- 即它們可在無消息丟失的狀況下,接管master. state 隊列狀態.正常狀況下是'running', 但若是隊列正在同步也多是"{syncing, MsgCount}". 處於集羣下的節點若是掉線了,隊列狀態交顯示'down' (大多數queueinfoitems 將不可用). 若是沒有指定queueinfoitems,那麼將顯示隊列名稱和隊列深度. 例如: rabbitmqctl list_queues -p /myvhost messages consumers 此命令顯示了/myvhost虛擬主機中每一個隊列的深度和消費者數目.
list_exchanges [-p vhost] [exchangeinfoitem …]
返回交換器細節.若是沒有指定"-p"選項,將返回 / 虛擬主機的細節. "-p" 選項可用來覆蓋默認虛擬主機. exchangeinfoitem 參數用來表示哪些交換器信息要包含在結果中. 結果集中列的順序將與參數順序保持一致. exchangeinfoitem 可接受下面的列表中任何值: name 交換器名稱. type 交換器類型(如[direct, topic, headers, fanout]). durable 當服務器重啓時,交換器是否能復活. auto_delete 當再也不使用時,交換器是否須要自動刪除. internal 交換器是不是內部的,即不能由client直接發佈. arguments 交換器參數 policy
應用到交換器上的策略名稱.
若是沒有指定exchangeinfoitems,那麼將會顯示交換器類型和類型
例如:
rabbitmqctl list_exchanges -p /myvhost name type
此命令會顯示/myvhost中每一個交換器的名稱和類型.
list_bindings [-p vhost] [bindinginfoitem …]
返回綁定細節.默認狀況下返回的是 / 虛擬主機上的綁定詳情.可以使用"-p" 標記來覆蓋默認虛擬主機. bindinginfoitem 參數用來表示結果中包含哪些綁定信息. 結果集中列的順序將匹配參數的順序.bindinginfoitem可接受下面列表的任意值: source_name 綁定中消息來源的名稱. C中非ASCII轉義字符. source_kind 綁定中消息來源的類別.當前老是exchange. C中非ASCII轉義字符. destination_name 綁定中消息目的地名稱.C中非ASCII轉義字符. destination_kind 綁定中消息目的地的種類. C中非ASCII轉義字符. routing_key 綁定的路由鍵,C中非ASCII轉義字符. arguments 綁定參數. 若是沒有指定bindinginfoitems,將會顯示全部上述條目. 例如: rabbitmqctl list_bindings -p /myvhost exchange_name queue_name 此命令來顯示/myvhost虛擬主機上綁定的交換器名稱和隊列名稱.
list_connections [connectioninfoitem …]
返回TCP/IP鏈接統計. connectioninfoitem 參數用來表示在結果中包含哪些鏈接信息. 結果集中列的順序將匹配參數的順序. connectioninfoitem可接受下面列表的任意值: pid 與鏈接相關的Erlang進程ID. name 鏈接的可讀名稱. port 服務器端口. host 返回反向DNS獲取的服務器主機名稱,或 IP地址(反向DNS解析失敗) 或者未啓用. peer_port Peer 端口. peer_host 返回反向DNS獲取的Peer主機名稱,或 IP地址(反向DNS解析失敗) 或者未啓用. ssl 用Boolean來表示鏈接是不是SSL的. ssl_protocol SSL 協議(如. tlsv1) ssl_key_exchange SSL key exchange 算法 (如 rsa) ssl_cipher SSL cipher 算法 (如aes_256_cbc) ssl_hash SSL hash 函數 (如 sha) peer_cert_subject peer的 SSL 安全證書的主體, RFC4514形式. peer_cert_issuer peer的 SSL安全證書的發行者, RFC4514 形式. peer_cert_validity peer的SSL安全證書的有效期. state 鏈接狀態(可爲[starting, tuning, opening, running, flow, blocking, blocked, closing, closed]其中一個). channels 使用鏈接的channel數。 protocol 使用的AMQP協議版本(當前是{0,9,1} 或{0,8,0}). 注意,若是client請求的是AMQP 0-9 鏈接, 咱們會視爲AMQP 0-9-1. auth_mechanism 使用的SASL認證機制,如PLAIN. user 與鏈接相關的用戶名 vhost 虛擬主機名稱,C中非ASCII轉義字符. timeout 鏈接超時/協商的心跳間隔,秒爲單位. frame_max 最大 frame 大小(字節). channel_max 此鏈接上channel的最大數目. client_properties 鏈接創建期間由client發送的信息屬性. recv_oct Octets已收到. recv_cnt Packets 已收到. send_oct Octets 發送. send_cnt Packets 發送. send_pend 發送隊列大小. connected_at 鏈接創建的日期和時間,看成timestamp. 若是沒有connectioninfoitems, 那麼會顯示user, peer host, peer port,流量控制和內存塊狀態的時間 例如: rabbitmqctl list_connections send_pend port 此命令會顯示發送隊列的大小以及第個鏈接的服務器端口.
list_channels [channelinfoitem …]
返回全部當前channel上的信息,邏輯容器執行大部分 AMQP命令.這將包含最初AMQP鏈接的部分,以及不一樣插件和其它擴展建立的channels. channelinfoitem 參數用來表示在結果集中包含哪些channel信息.結果集中列的順序將匹配參數的順序. channelinfoitem 可接受下面列表中的任何一個參數: pid 與鏈接相關的Erlang進程ID. connection channel所屬的鏈接Erlang進程ID. name channel的可讀名稱. number channel的數目,在一個鏈接中,它有惟一的標識符. user 與channel相關的用戶名稱. vhost channel操做的虛擬主機. transactional True:若是channel處於事務模式,其它狀況爲false. confirm True:若是channel是確認模式,其它狀況爲false. consumer_count 在channel中接收消息的邏輯AMQP消費者數目. messages_unacknowledged 在channel中消息已投遞但還未應答的消息數目. messages_uncommitted 在channel中已收到消息但尚未提交事務的消息個數. acks_uncommitted 確認收到一個還未提交的事務數。 messages_unconfirmed 還沒有確認已發佈消息的數目。在通道不在確認模式下時,這將是0。 prefetch_count 新消費者QoS預提取限制, 0表示無上限. global_prefetch_count 整個channel QoS預提取限制, 0表示無上限. 若是沒有指定channelinfoitems,那麼將顯示pid, user, consumer_count,messages_unacknowledged. 例如: rabbitmqctl list_channels connection messages_unacknowledged 此命令會顯示每一個channel中鏈接進程和未應答消息的數目.
list_consumers [-p vhost]
列舉消費者, 即訂閱隊列的消息流. 每行將打印出由製表符分隔的已訂閱隊列的名稱,建立並管理訂閱的channel進程的標識,channel中訂閱的consumer tag惟一標識符, boolean值表示投遞到此消費者的消息是否須要應答,整數值表示表示預提取限制(爲0表示無限制), 以及關於此消費者的任何其它參數.
status
顯示 broker 狀態信息,如當前Erlang節點上運行的應用程序, RabbitMQ 和 Erlang 的版本信息, OS 名稱, 內存和文件描述符統計信息. (查看cluster_status 命令來找出那些節點是集羣化的以及正在運行的.) 例如: rabbitmqctl status 此命令顯示了RabbitMQ broker的相關信息.
environment
顯示每一個運行程序環境中每一個變量的名稱和值.
report
爲全部服務器狀態生成一個服務器狀態報告,輸出應該重定向到一個文件. 例如: rabbitmqctl report > server_report.txt 此命令建立了一個服務器報告,可將它附着在支持請求的電子郵件中.
eval {expr}
執行任意Erlang表達式. 例如: rabbitmqctl eval 'node().' 此命令用於返回rabbitmqctl鏈接的節點名稱
雜項
close_connection {connectionpid} {explanation}
connectionpid 要關閉的與鏈接相關的Erlang進程ID. explanation 解釋字符串. 指示broker關閉與Erlang進程id相關的鏈接(可經過list_connections 命令查看), 經過爲鏈接客戶端傳遞解釋字符串(做爲AMQP鏈接關閉協議的一部分). 例如: rabbitmqctl close_connection "<rabbit@tanto.4262.0>" "go away" 此命令指示RabbitMQ broker關閉與Erlang 進程id<rabbit@tanto.4262.0>相關聯的鏈接, 同時向客戶端傳遞go away字符串.
trace_on [-p vhost]
vhost 要開啓追蹤的虛擬主機的名稱. 開啓追蹤.注意,追蹤狀態不是持久化的; 若是服務器重啓,追蹤狀態將會丟失.
trace_off [-p vhost]
vhost 要中止追蹤的虛擬主機名稱. 中止追蹤.
set_vm_memory_high_watermark {fraction}
fraction 當一個浮點數大於或等於0時,會觸發流量控制新內存閾值部分。
set_vm_memory_high_watermark absolute {memory_limit}
memory_limit 流程控制觸發的新內存限制, 以字節來表示大於或等於0的整數或以字符串和內存單位來表示(如 512M或1G). 可用的單位是: k, kiB: kibibytes (2^10 bytes) M, MiB: mebibytes (2^20) G, GiB: gibibytes (2^30) kB: kilobytes (10^3) MB: megabytes (10^6) GB: gigabytes (10^9)
set_disk_free_limit {disk_limit}
disk_limit 以整數或字符串單位的可用磁盤下限限制(查看vm_memory_high_watermark), 如 512M or 1G. 一旦可用磁盤空間達到這個限制,就會設置磁盤報警.
set_disk_free_limit mem_relative {fraction}
fraction 相對於整個可用內存的限制,其值爲非負浮點數. 當值小於1.0時是很危險的,應該謹慎使用