rabbitmq集群功能和原理:
設計集群目的:
允許消費者和生產者在RabbitMQ節點崩潰的情況下繼續運行
通過增加更多的節點來擴展消息通信的吞吐量
rabbitmq可以通過三種方式來部署分布式集群系統,分別是:cluster、federation、shovel
cluster:
不支持誇網段,用於同一個網段內的局域網
可以隨意動態的增加和減少
節點之間需要運行相同版本的rabbitmq和erlang
federation:應用於廣域網,允許單台服務器上的交換機或隊列接收發布到另一台服務器交換機或隊列的消息,可以是單獨機器或集群。federation隊列類似於單向點對點連接,消息會在聯盟隊列之間轉發任意次,直到被消費者接受。通常使用federation來連接internet上的中間服務器,用作訂閱分發消息或工作隊列
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集群模式一般分為兩種,普通模式和鏡像模式
普通模式:默認的集群模式,以兩個節點(rabbit01、rabbit02)為例來進行說明。對於Queue來說,消息實體只存在於其中一個節點rabbit01(或者rabbit02),rabbit01和rabbit02兩個節點僅有相同的元數據,即隊列的結構。當消息進入rabbit01節點的Queue后,consumer從rabbit02節點消費時,RabbitMQ會臨時在rabbit01、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個狀態:
- Alpha:消息的內容和消息索引都在RAM中。Q1和Q4的狀態。
- Beta:消息的內容保存在DISK上,消息索引保存在RAM中。Q2和Q3的狀態。
- Gamma:消息內容保存在DISK上,消息索引在DISK和RAM都有。Q2和Q3的狀態。
- Delta:消息內容和索引都在DISK上。Delta的狀態
注意:對於持久化的消息,消息內容和消息所有都必須先保存在DISK上,才會處於上述狀態中的一種,而Gamma狀態的消息是只有持久化的消息才會有的狀態
上述就是RabbitMQ的多層隊列結構的設計,我們可以看出從Q1到Q4,基本經歷RAM->DISK->RAM這樣的過程。這樣設計的好處是:當隊列負載很高的情況下,能夠通過將一部分消息由磁盤保存來節省內存空間,當負載降低的時候,這部分消息又漸漸回到內存,被消費者獲取,使得整個隊列具有很好的彈性
RabbitMQ-官方指南-rabbitmqctl(1) 指南
名稱
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)模式,這會一致消息輸出.
- 1
- 2
[-t timeout]
操作超時時間(秒為單位). 只適用於"list" 命令. 默認是無窮大.
- 1
- 2
命令
應用程序和集群管理
stop [pid_file]
用於停止運行RabbitMQ的Erlang node.如果指定了pid_file,還將等待指定的過程結束。例如:
rabbitmqctl stop
此命令會終止RabbitMQ node的運行.
- 1
- 2
- 3
- 4
- 5
- 6
stop_app
停止RabbitMQ application,但Erlang node會繼續運行.此命令主要用於優先執行其它管理操作(這些管理操作需要先停止RabbitMQ application),如. reset.例如:
rabbitmqctl stop_app
- 1
- 2
- 3
- 4
start_app
啟動RabbitMQ application.
此命令典型用於在執行了其它管理操作之后,重新啟動停止的RabbitMQ application。如reset.例如:
rabbitmqctl start_app
此命令來指導RabbitMQ node來啟動RabbitMQ application.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
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啟動后返回.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
reset
將RabbitMQ node還原到最初狀態.包括從所在群集中刪除此node,從管理數據庫中刪除所有配置數據,如已配置的用戶和虛擬主機,以及刪除所有持久化消息.
執行reset和force_reset之前,必須停止RabbitMQ application ,如使用stop_app.
示例:
rabbitmqctl reset
此命令會重設RabbitMQ node.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
force_reset
強制RabbitMQ node還原到最初狀態.
不同於reset , force_reset 命令會無條件地重設node,不論當前管理數據庫的狀態和集群配置是什么. 它只能在數據庫或集群配置已損壞的情況下才可使用。
執行reset和force_reset之前,必須停止RabbitMQ application ,如使用stop_app.
示例:
rabbitmqctl force_reset
此命令會重設RabbitMQnode.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
rotate_logs {suffix}
指示RabbitMQ node循環日志文件.
RabbitMQ 中間件會將原來日志文件中的內容追加到原始名稱和后輟的日志文件中,然后再將原始日志文件內容復制到新創建的日志上。實際上,當前日志內容會移到以此后輟結尾的文件上。當目標文件不存在時,將會進行創建。如果不指定后輟,則不會發生循環,日志文件只是重新打開。示例:
rabbitmqctl rotate_logs .1
此命令指示RabbitMQ node將日志文件的內容追加到新日志文件(文件名由原日志文件名和.1后輟構成)中。如. rabbit@mymachine.log.1 和 rabbit@mymachine-sasl.log.1. 最后, 日志會在原始位置恢復到新文件中.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
集群管理
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 加入集群.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
cluster_status
按節點類型來分組展示集群中的所有節點,包括當前運行的節點.
例如:
rabbitmqctl cluster_status
此命令會顯示集群中的所有節點.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
change_cluster_node_type {disc | ram}
修改集群節點的類型. 要成功執行此操作,必須首先停止節點,要將節點轉換為RAM節點,則此節點不能是集群中的唯一disc節點。
例如:
rabbitmqctl change_cluster_node_type disc
此命令會將一個RAM節點轉換為disc節點.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
forget_cluster_node [–offline]
[--offline]
允許節點從脫機節點中刪除. 這只在所有節點都脫機且最后一個掉線節點不能再上線的情況下有用,從而防止整個集群從啟動。它不能使用在其它情況下,因為這會導致不一致.
遠程刪除一個集群節點.要刪除的節點必須是脫機的, 而在刪除節點期間節點必須是在線的,除非使用了--offline 標志.
當使用--offline 標志時,rabbitmqctl不會嘗試正常連接節點;相反,它會臨時改變節點以作修改.如果節點不能正常啟動的話,這是非常有用的.在這種情況下,節點將變成集群元數據的規范源(例如,隊列的存在),即使它不是以前的。因此,如果有可能,你應該在最新的節點上使用這個命令來關閉。
例如:
rabbitmqctl -n hare@mcnulty forget_cluster_node rabbit@stringer
此命令會從節點hare@mcnulty中刪除rabbit@stringer節點.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
rename_cluster_node {oldnode1} {newnode1} [oldnode2] [newnode2 …]
支持在本地數據庫中重命名集群節點.
此子命令會促使rabbitmqctl臨時改變節點以作出修改. 因此本地集群必須是停止的,其它節點可以是在線或離線的.
這個子命令接偶數個參數,成對表示節點的舊名稱和新名稱.你必須指定節點的舊名稱和新名稱,因為其它停止的節點也可能在同一時間重命名.
同時停止所有節點來重命名也是可以的(在這種情況下,每個節點都必須給出舊名稱和新名稱)或一次停止一個節點來重命名(在這種情況下,每個節點只需要被告知其名句是如何變化的).
例如:
rabbitmqctl rename_cluster_node rabbit@misshelpful rabbit@cordelia
此命令來將節點名稱rabbit@misshelpful 重命名為rabbit@cordelia.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
update_cluster_nodes {clusternode}
clusternode
用於咨詢具有最新消息的節點.
指示已集群的節點醒來時聯系clusternode.這不同於join_cluster ,因為它不會加入任何集群 - 它會檢查節點已經以clusternode的形式存在於集群中了.
需要這個命令的動機是當節點離線時,集群可以變化.考慮這樣的情況,節點A和節點B都在集群里邊,這里節點A掉線了,C又和B集群了,然后B又離開了集群.當A醒來的時候,它會嘗試聯系B,但這會失敗,因為B已經不在集群中了.update_cluster_nodes -n A C 可解決這種場景.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
force_boot
確保節點將在下一次啟動,即使它不是最后一個關閉的。通常情況下,當你關閉整個RabbitMQ 集群時,你重啟的第一個節點應該是最后一個下線的節點,因為它可以看到其它節點所看不到的事情. 但有時這是不可能的:例如,如果整個集群是失去了電力而所有節點都在想它不是最后一個關閉的.
在這種節點掉線情況下,你可以調用rabbitmqctl force_boot .這就告訴節點下一次無條件的啟動節點.在此節點關閉后,集群的任何變化,它都會丟失.
如果最后一個掉線的節點永久丟失了,那么你需要優先使用rabbitmqctl forget_cluster_node --offline, 因為它可以確保在丟失的節點上掌握的鏡像隊列得到提升。
例如:
rabbitmqctl force_boot
這可以強制節點下次啟動時不用等待其它節點.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
sync_queue [-p vhost] {queue}
queue
同步隊列的名稱
指示未同步slaves上的鏡像隊列自行同步.同步發生時,隊列會阻塞(所有出入隊列的發布者和消費者都會阻塞).此命令成功執行后,隊列必須是鏡像的.
注意,未同步隊列中的消息被耗盡后,最終也會變成同步. 此命令主要用於未耗盡的隊列。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
cancel_sync_queue [-p vhost] {queue}
queue
取消同步的隊列名稱.
指示同步鏡像隊列停止同步.
- 1
- 2
- 3
- 4
- 5
- 6
purge_queue [-p vhost] {queue}
queue
要清除隊列的名稱.
清除隊列(刪除其中的所有消息).
- 1
- 2
- 3
- 4
- 5
- 6
set_cluster_name {name}
設置集群名稱. 集群名稱在client連接時,會通報給client,也可用於federation和shovel插件記錄消息的來源地. 群集名稱默認是來自在群集中的第一個節點的主機名,但可以改變。
例如:
rabbitmqctl set_cluster_name london
設置集群名稱為"london".
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
用戶管理
注意rabbitmqctl 管理RabbitMQ 內部用戶數據庫. 任何來自其它認證后端的用戶對於rabbitmqctl來說是不可見的.
add_user {username} {password}
username
要創建的用戶名稱.
password
設置創建用戶登錄broker的密碼.
rabbitmqctl add_user tonyg changeit
此命令用於指示RabbitMQ broker 創建一個擁有非管理權限的用戶,其名稱為tonyg, 初始密碼為changeit.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
delete_user {username}
username
要刪除的用戶名稱.
例如:
rabbitmqctl delete_user tonyg
此命令用於指示RabbitMQ broker刪除名為tonyg的用戶
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
change_password {username} {newpassword}
username
要修改密碼的用戶名稱.
newpassword
用戶的新密碼.
例如:
rabbitmqctl change_password tonyg newpass
此命令用於指定RabbitMQ broker將tonyg 用戶的密碼修改為newpass.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
clear_password {username}
username
要清除密碼的用戶名稱.
例如:
rabbitmqctl clear_password tonyg
此命令會指示RabbitMQ broker清除名為tonyg的用戶密碼.現在,此用戶不能使用密碼登錄(但可以通過SASL EXTERNAL登錄,如果配置了的話).
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
authenticate_user {username} {password}
username
用戶的名稱.
password
用戶的密碼.
例如:
rabbitmqctl authenticate_user tonyg verifyit
此命令會指示RabbitMQ broker以名稱為tonyg, 密碼為verifyit來進行驗證.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
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.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
list_users
列出用戶. 每個結果行都包含用戶名,其后緊跟用戶的tags.
例如:
rabbitmqctl list_users
此命令指示RabbitMQ broker列出所有用戶.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
訪問控制
注意rabbitmqctl 會管理RabbitMQ的內部用戶數據庫. 無權限的用戶將不能使用rabbitmqctl.
add_vhost {vhost}
vhost
要創建虛擬主機名稱.
創建一個虛擬主機.
例如:
rabbitmqctl add_vhost test
此命令指示RabbitMQ broker來創建一個新的名為test的虛擬主機.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
delete_vhost {vhost}
vhost
要刪除的虛擬主機的名稱.
刪除一個虛擬主機.
刪除一個虛擬主機,同時也會刪除所有交換機,隊列,綁定,用戶權限,參數和策略.
例如:
rabbitmqctl delete_vhost test
此命令指示RabbitMQ broker刪除名為test的虛擬主機.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
list_vhosts [vhostinfoitem …]
列出所有虛擬主機.
vhostinfoitem 參數用於標識哪些虛擬主機應該包含在結果集中.結果集中的列順序會匹配參數的順序.vhostinfoitem 可接受下面的值:
name
虛擬主機的名稱.
tracing
是否對虛擬主機啟用追蹤.
如果沒有指定vhostinfoitem 參數,那么會顯示虛擬主機名稱.
例如:
rabbitmqctl list_vhosts name tracing
此命令用於指示RabbitMQ broker顯示所有虛擬主機.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
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-"開頭的所有資源上都具有配置權限,並在所有資源上都擁有讀寫權限。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
clear_permissions [-p vhost] {username}
vhost
用於設置禁止用戶訪問的虛擬主機名稱,默認為/.
username
禁止訪問特定虛擬主機的用戶名稱.
設置用戶權限.
例如:
rabbitmqctl clear_permissions -p /myvhost tonyg
此命令用於指示RabbitMQ broker禁止tonyg 用戶訪問/myvhost虛擬主機.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
list_permissions [-p vhost]
vhost
用於指定虛擬主機名稱,將會列出所有可訪問此虛擬主機的所有用戶名稱和權限.默認為/.
顯示虛擬機上權限.
例如:
rabbitmqctl list_permissions -p /myvhost
此命令指示RabbitMQ broker列出所有已授權訪問/myvhost 虛擬主機的用戶,同時也會列出這些用戶能在虛擬主機資源可操作的權限.注意,空字符串表示沒有任何授予的權限。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
list_user_permissions {username}
username
要顯示權限的用戶名稱.
列出用戶權限.
例如:
rabbitmqctl list_user_permissions tonyg
此命令指示RabbitMQ broker列出tonyg可授權訪問的所有虛擬主機名稱,以及在這些虛擬主機上的操作.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
參數管理
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".
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
clear_parameter [-p vhost] {component_name} {key}
清除參數.
component_name
要清除參數的組件名稱.
name
要清除的參數名稱.
例如:
rabbitmqctl clear_parameter federation local_username
此命令用於清除默認虛擬主機上的federation 組件的local_username 參數值.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
list_parameters [-p vhost]
列出虛擬主機上的所有參數.
示例:
rabbitmqctl list_parameters
此命令用於列出默認虛擬主機上的所有參數.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
策略管理
策略用於在集群范圍的基礎上用於控制和修改隊列和交換機的行為. 策略應用於虛擬主機,由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,這樣內建的交換器將進行聯合.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
clear_policy [-p vhost] {name}
清除策略.
name
要清除的策略名稱.
例如:
rabbitmqctl clear_policy federate-me
此命令來清除默認虛擬主機上的federate-me 策略.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
list_policies [-p vhost]
顯示虛擬主機上的所有策略.
例如:
rabbitmqctl list_policies
此命令會顯示默認虛擬主機上的所有策略.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
服務器狀態
服務器狀態查詢查詢服務器返回一個結果以制表符分隔的列表. 某些查詢(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虛擬主機中每個隊列的深度和消費者數目.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
list_exchanges [-p vhost] [exchangeinfoitem …]
返回交換器細節.如果沒有指定"-p"選項,將返回 / 虛擬主機的細節. "-p" 選項可用來覆蓋默認虛擬主機.
exchangeinfoitem 參數用來表示哪些交換器信息要包含在結果中. 結果集中列的順序將與參數順序保持一致. exchangeinfoitem 可接受下面的列表中任何值:
name
交換器名稱.
type
交換器類型(如[direct, topic, headers, fanout]).
durable
當服務器重啟時,交換器是否能復活.
auto_delete
當不再使用時,交換器是否需要自動刪除.
internal
交換器是否是內部的,即不能由client直接發布.
arguments
交換器參數
policy
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
應用到交換器上的策略名稱.
如果沒有指定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虛擬主機上綁定的交換器名稱和隊列名稱.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
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
此命令會顯示發送隊列的大小以及第個連接的服務器端口.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
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中連接進程和未應答消息的數目.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
list_consumers [-p vhost]
列舉消費者, 即訂閱隊列的消息流. 每行將打印出由制表符分隔的已訂閱隊列的名稱,創建並管理訂閱的channel進程的標識,channel中訂閱的consumer tag唯一標識符, boolean值表示投遞到此消費者的消息是否需要應答,整數值表示表示預提取限制(為0表示無限制), 以及關於此消費者的任何其它參數.
- 1
- 2
status
顯示 broker 狀態信息,如當前Erlang節點上運行的應用程序, RabbitMQ 和 Erlang 的版本信息, OS 名稱, 內存和文件描述符統計信息. (查看cluster_status 命令來找出那些節點是集群化的以及正在運行的.)
例如:
rabbitmqctl status
此命令顯示了RabbitMQ broker的相關信息.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
environment
顯示每個運行程序環境中每個變量的名稱和值.
- 1
- 2
report
為所有服務器狀態生成一個服務器狀態報告,輸出應該重定向到一個文件.
例如:
rabbitmqctl report > server_report.txt
此命令創建了一個服務器報告,可將它附着在支持請求的電子郵件中.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
eval {expr}
執行任意Erlang表達式.
例如:
rabbitmqctl eval 'node().'
此命令用於返回rabbitmqctl連接的節點名稱
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
雜項
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字符串.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
trace_on [-p vhost]
vhost
要開啟追蹤的虛擬主機的名稱.
開啟追蹤.注意,追蹤狀態不是持久化的; 如果服務器重啟,追蹤狀態將會丟失.
- 1
- 2
- 3
- 4
- 5
- 6
trace_off [-p vhost]
vhost
要停止追蹤的虛擬主機名稱.
停止追蹤.
- 1
- 2
- 3
- 4
- 5
- 6
set_vm_memory_high_watermark {fraction}
fraction
當一個浮點數大於或等於0時,會觸發流量控制新內存閾值部分。
- 1
- 2
- 3
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)
- 1
- 2
- 3
- 4
set_disk_free_limit {disk_limit}
disk_limit
以整數或字符串單位的可用磁盤下限限制(查看vm_memory_high_watermark), 如 512M or 1G. 一旦可用磁盤空間達到這個限制,就會設置磁盤報警.
- 1
- 2
- 3
- 4
set_disk_free_limit mem_relative {fraction}
fraction
相對於整個可用內存的限制,其值為非負浮點數. 當值小於1.0時是很危險的,應該謹慎使用