轉載 https://www.cnblogs.com/williamjie/p/9481774.html
一、rabbitmq簡介
1.1 MQ介紹
- 什么是MQ
消息隊列(Message Queue,簡稱MQ),從字面意思上看,本質是個隊列,FIFO先入先出,只不過隊列中存放的內容是message而已。
其主要用途:不同進程Process/線程Thread之間通信。
為什么會產生消息隊列?有幾個原因:
- 1.不同進程(process)之間傳遞消息時,兩個進程之間耦合程度過高,改動一個進程,引發必須修改另一個進程,為了隔離這兩個進程,在兩進程間抽離出一層(一個模塊),所有兩進程之間傳遞的消息,都必須通過消息隊列來傳遞,單獨修改某一個進程,不會影響另一個;
- 2.不同進程(process)之間傳遞消息時,為了實現標准化,將消息的格式規范化了,並且,某一個進程接受的消息太多,一下子無法處理完,並且也有先后順序,必須對收到的消息進行排隊,因此誕生了事實上的消息隊列;
MQ框架非常之多,比較流行的有RabbitMq、ActiveMq、ZeroMq、kafka,以及阿里開源的RocketMQ。本文主要介紹RabbitMq
1.2 RabbitMQ簡介
AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標准,為面向消息的中間件設計。消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、隊列、路由(包括點對點和發布/訂閱)、可靠性、安全。
RabbitMQ是一個開源的AMQP實現,服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用於在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。
下面將重點介紹RabbitMQ中的一些基礎概念,了解了這些概念,是使用好RabbitMQ的基礎。
1.3 rabbitmq實現原理
1.4 rabbitmq原理和集群介紹
rabbitmq是依據erlang的分布式特性(RabbitMQ底層是通過Erlang架構來實現的,所以rabbitmqctl會啟動Erlang節點,並基於Erlang節點來使用Erlang系統連接RabbitMQ節點,在連接過程中需要正確的Erlang Cookie和節點名稱,Erlang節點通過交換Erlang Cookie以獲得認證)來實現的,所以部署rabbitmq分布式集群時要先安裝erlang,並把其中一個服務的cookie復制到另外的節點。
rabbitmq集群中,各個rabbitmq為對等節點,即每個節點均提供給客戶端連接,進行消息的接收和發送。節點分為內存節點和磁盤節點,一般的,均應建立為磁盤節點,為了防止機器重啟后的消息消失;
- RabbitMQ的Cluster集群模式一般分為兩種,普通模式和鏡像模式。消息隊列通過rabbitmq HA鏡像隊列進行消息隊列實體復制。
普通模式下,以兩個節點(rabbit01、rabbit02)為例來進行說明。對於Queue來說,消息實體只存在於其中一個節點rabbit01(或者rabbit02),rabbit01和rabbit02兩個節點僅有相同的元數據,即隊列的結構。當消息進入rabbit01節點的Queue后,consumer從rabbit02節點消費時,RabbitMQ會臨時在rabbit01、rabbit02間進行消息傳輸,把A中的消息實體取出並經過B發送給consumer。所以consumer應盡量連接每一個節點,從中取消息。即對於同一個邏輯隊列,要在多個節點建立物理Queue。否則無論consumer連rabbit01或rabbit02,出口總在rabbit01,會產生瓶頸。
鏡像模式下,將需要消費的隊列變為鏡像隊列,存在於多個節點,這樣就可以實現RabbitMQ的HA高可用性。作用就是消息實體會主動在鏡像節點之間實現同步,而不是像普通模式那樣,在consumer消費數據時臨時讀取。缺點就是,集群內部的同步通訊會占用大量的網絡帶寬。
二、命令參數和配置文件
2.1 配置文件
RabbitMQ 常用的三種自定義服務器的通用方法:
•配置文件 rabbitmq.conf
•環境變量文件 rabbitmq-env.conf
•補充配置文件 advanced.config
rabbitmq.conf和rabbitmq-env.conf的位置
•在二進制安裝中路徑是在 :安裝目錄下的/etc/rabbitmq/
•rpm 安裝: /etc/rabbitmq/
如果rabbitmq.conf和rabbitmq-env.conf 的兩個文件不存在,那么我們可以創建該文件,然后我們可以通過環境變量
指定該文件的位置。
2.1.1 配置文件詳解
https://www.linuxidc.com/Linux/2019-03/157354.htm
2.2 常用命令
用戶角色
rabbitmq用戶角色(role)分為五類: 超級管理員(administrator)、監控者(monitor)、決策制定者(policymaker)、普通管理者(management)和其他。
administrator 可登錄管理控制台(啟用management plugin的情況下),查看所有的信息,並且可以對用戶、策略(policy)進行操作;
monitoring 可登錄管理控制台(啟用management plugin的情況下),同時可以查看rabbitmq節點的相關信息(進程數、內存使用情況,磁盤使用情況等);
policymaker 可以登錄管理控制台(啟用management plugin的情況下),同時可以對策略(policy)進行操作;
management 僅可登錄管理控制台(啟用management plugin的情況下),無法看到節點信息,也無法對策略進行管理;
其他 無法登錄管理控制台,通常就是普通的生產者和消費者。
- 語法:
rabbitmqctl [-n {nodename}] [-t timeout] [-q] {command} [command options...]
2.2.1 application和cluster management
rabbitmqctl stop [{pid_file}]
# 表示stop 在RabbitMQ服務器上運行的一個Erlang 節點,可以指定某一個 *pid_file*,表示會等待這個指定的程序結束
rabbitmqctl shutdown
# 表示終止RabbitMQ 服務器上的Erlang進程,如果終止失敗,會返回非零數字
rabbitmqctl stop_app
# 表示終止RabbitMQ的應用,但是Erlang節點還在運行。該命令典型的運行在一些需要RabbitMQ應用被停止的管理行為之前,例如 reset
rabbitmqctl start_app
# 表示啟動RabbitMQ的應用。該命令典型的運行在一些需要RabbitMQ應用被停止的管理行為之后,例如 reset
rabbitmqctl wait {pid_file}
# 表示等待RabbitMQ應用啟動。該命令會等待指定的pid file被創建,也就是啟動的進程對應的pid保存在這個文件中,然后RabbitMQ應用在這個進程中啟動。如果該進程終止,沒有啟動RabbitMQ應用,就會返回錯誤。
# 合適的pid file是有rabbitmq-server 腳本創建的,默認保存在 Mnesia 目錄下,可以通過修改 RABBITMQ_PID_FILE 環境變量來修改
# 例如 rabbitmqctl wait /var/run/rabbitmq/pid
rabbitmqctl reset
# 表示設置RabbitMQ節點為原始狀態。會從該節點所屬的cluster中都刪除,從管理數據庫中刪除所有數據,例如配置的用戶和vhost,還會刪除所有的持久消息。
# 要想reset和force_reset操作執行成功,RabbitMQ應用需要處於停止狀態,即執行過 stop_app
rabbitmqctl force_reset
# 表示強制性地設置RabbitMQ節點為原始狀態。它和reset的區別在於,可以忽略目前管理數據庫的狀態和cluster的配置,無條件的reset。
# 該方法的使用,應當用在當數據庫或者cluster配置損壞的情況下作為最后的方法。
rabbitmqctl rotate_logs {suffix}
# 表示將日志文件的內容追加到新的日志文件中去,這個新的日志文件的文件名是原有的日志文件名加上命令中的 suffix,並且恢復日志到原來位置的新文件中。
# 注意:如果新文件原先不存在,那么會新建一個;如果suffix為空,那么不會發生日志轉移,只是重新打開了一次日志文件而已。
rabbitmqctl hipe_compile {directory}
# 表示在指定的目錄下執行HiPE編譯和緩存結果文件 .beam-files
# 如果需要父目錄會被創建。並且在編譯之前,該目錄下的所有 .beam-files會被自動刪除。
# 使用預編譯的文件,你應該設置 RABBITMQ_SERVER_CODE_PATH 環境變量為 hipe_compile 調用指定的目錄。
2.2.2 cluster management
rabbitmqctl join_cluster {clusternode} [--ram]
# 表示結合到指定的集群,如果有參數 --ram 表示作為RAM節點結合到該集群中。
# 該命令指令本節結合到指定的集群中,在結合之前,該節點需要reset,所以在使用時,需要格外注意。為了成功運行本命令,必須要停止RabbitMQ應用,例如 stop_app
# 集群節點有兩種類型: disc 和 RAM。disc類型,復制數據在RAM和disc上,在節點失效的情況下,提供了冗余保證,也能從一些全局事件中恢復,例如所有節點失效。RAM類型,只復制數據在RAM上,主要表現在伸縮性上,特別是在管理資源(例如:增加刪除隊列,交換器,或者綁定)上表現突出。
# 一個集群必須至少含有一個disc節點,當通常都多余一個。通過該命令時,默認是設置為disc節點,如果需創建RAM節點,需要指定參數 --ram
# 執行此命令之后,在該節點上啟動的RabbitMQ應用,在該節點掛掉之后,會嘗試連接節點所在集群中的其他節點。
# 為了離開集群,可以 reset 該節點,也可以使用命令 forget_cluster_node 遠程刪除節點
rabbitmqctl cluster_status
# 表示顯示通過節點類型聚合在一起的集群中的所有節點,還有目前正在運行的節點
rabbitmqctl change_cluster_node_type {disc|ram}
# 表示改變集群節點的類型。該操作的正確執行,必定會停止該節點。並且在調整一個node為ram類型時,該節點不能為該集群的唯一node
rabbitmqctl forget_cluster_node [--offline]
# 表示遠程移除一個集群節點。要刪除的節點必須脫機,如果沒有脫機,需要使用 --offline 參數。當使用 --offline 參數時,rabbitmqctl不會去連接節點,而是暫時變成節點,以便進行變更。這在節點不能正常啟動時非常有用。在這種情況下,節點會成為集群元數據的規范來源(例如哪些隊列存在)。因此如果可以的話,應該使用此命令在最新的節點上關閉。
# --offline 參數使節點從脫機節點上移除。使用場景主要是在所有節點脫機,且最后一個節點無法聯機時,從而防止整個集群啟動。在其他情況不應該使用,否則會導致不一致。
# 例如 rabbitmqctl -n hare@mcnulty forget_cluster_node rabbit@stringer
# 上述命令將從節點 hare@mcnulty 中移除節點 rabbit@stringer
rabbitmqctl rename_cluster_node {oldnode1} {newnode1} [oldnode2] [newnode2...]
# 表示在本地數據庫上修改集群節點名稱。該命令讓rabbitmqctl暫時成為一個節點來做出做變更。因此,本地的待修改的集群節點一定要完全停止,其他節點可以是online或者offline
rabbitmqctl update_cluster_nodes {clusternode}
# 表示指示已經集群的節點在喚醒時聯系 {clusternode} 進行集群。這與 join_cluster 命令不同,因為它不加入任何集群,它是檢查節點是否已經在具有 {clusternode} 的集群中。
# 該命令的需求,是在當一個節點offline時,修改了集群節點的情形下。例如:節點A和B聚群,節點A offline了,節點C和B集群,並且B節點離開了該集群,那么當節點A起來的時候,A會嘗試連接B,但是由於B節點已經不在該集群中,所以會失敗。
# 通過 update_cluster_nodes -n A C 將會解決上述問題。
rabbitmqctl force_boot
# 表示強制確保節點啟動,即使該節點並不是最后down的。
# 一般情況下,當你同時shut down了RabbitMQ集群時,第一個重啟的節點應該是最后一個down掉的,因為它可能已經看到了其他節點發生的事情。但是有時候這並不可能:例如當整個集群lose power,那么該集群的所有節點會認為他們不是最后一個關閉的。
# 如果最后down的節點永久的lost,那么應該優先使用 rabbitmqctl forget_cluster_node --offline ,因為這將確保在丟失節點上的鏡像隊列得到優先處理。
rabbitmqctl sync_queue [-p vhost] {queue}
# {queue} 表示待同步的隊列名稱
# 指引含有異步slaves的鏡像隊列去同步自身。當隊列執行同步化時,其將會被鎖定(指所有publishers發送出去的和consumers獲取到的隊列都會被鎖定)。為了成功執行此命令,隊列必須要被鏡像。
# 注意,排除消息的異步隊列將最終被同步化,此命令主要運用於未被排除完全消息的隊列。
rabbitmqctl cancel_sync_queue [-p vhost] {queue}
# 指引一個正在同步的鏡像隊列停止此操作。
rabbitmqctl purge_queue [-p vhost] {queue}
# {queue} 表示待清空消息的隊列名稱
# 該命令表示清空隊列(即刪除隊列中的所有消息)
rabbitmqctl set_cluster_name {name}
# 設置集群的名稱。在連接中,集群的名稱被聲明在客戶端上,被同盟和插件用來記錄一個消息所在的位置。集群的名稱默認來自於集群中第一個節點的主機名,但是可以被修改。
2.2.3 User management
注意,rabbitmqctl 管理 RabbitMQ 的內部用戶數據庫,所有其他后台需要認證的用戶對於rabbitmqctl將不可見。
rabbitmqctl add_user {username} {password}
# {username} 表示用戶名; {password}表示用戶密碼
# 該命令將創建一個 non-administrative 用戶
rabbitmqctl delete_user {username}
# 表示刪除一個用戶,該命令將指示RabbitMQ broker去刪除指定的用戶
rabbitmqctl change_password {username} {newpassword}
# 表示修改指定的用戶的密碼
rabbitmqctl clear_password {username}
# 表示清除指定用戶的密碼
# 執行此操作后的用戶,將不能用密碼登錄,但是可能通過已經配置的SASL EXTERNAL的方式登錄。
rabbitmqctl authenticate_user {username} {password}
# 表示指引RabbitMQ broker認證該用戶和密碼
rabbitmqctl set_user_tags {username} {tag ...}
# 表示設置用戶的角色,{tag}可以是零個,一個,或者是多個。並且已經存在的tag也將會被移除。
# rabbitmqctl set_user_tags tonyg administrator 該命令表示指示RabbitMQ broker確保用戶tonyg為一個管理員角色。
# 上述命令在用戶通過AMQP方式登錄時,不會有任何影響;但是如果通過其他方式,例如管理插件方式登錄時,就可以去管理用戶、vhost 和權限。
rabbitmqctl list_users
# 表示列出所有用戶名信息
2.2.3 Access control
注意,rabbitmqctl 管理 RabbitMQ 的內部用戶數據庫,所有其他后台需要認證的用戶的權限對於rabbitmqctl將不可見。
rabbitmqctl add_vhost {vhost}
# {vhost} 表示待創建的虛擬主機項的名稱
rabbitmqctl delete_vhost {vhost}
# 表示刪除一個vhost。刪除一個vhost將會刪除該vhost的所有exchange、queue、binding、用戶權限、參數和策略。
rabbitmqctl list_vhosts {vhostinfoitem ...}
# 表示列出所有的vhost。其中 {vhostinfoitem} 表示要展示的vhost的字段信息,展示的結果將按照 {vhostinfoitem} 指定的字段順序展示。這些字段包括: name(名稱) 和 tracing (是否為此vhost啟動跟蹤)。
# 如果沒有指定具體的字段項,那么將展示vhost的名稱。
rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}
# 表示設置用戶權限。 {vhost} 表示待授權用戶訪問的vhost名稱,默認為 "/"; {user} 表示待授權反問特定vhost的用戶名稱; {conf}表示待授權用戶的配置權限,是一個匹配資源名稱的正則表達式; {write} 表示待授權用戶的寫權限,是一個匹配資源名稱的正則表達式; {read}表示待授權用戶的讀權限,是一個資源名稱的正則表達式。
# rabbitmqctl set_permissions -p myvhost tonyg "^tonyg-.*" ".*" ".*"
# 例如上面例子,表示授權給用戶 "tonyg" 在vhost為 `myvhost` 下有資源名稱以 "tonyg-" 開頭的 配置權限;所有資源的寫權限和讀權限。
rabbitmqctl clear_permissions [-p vhost] {username}
# 表示設置用戶拒絕訪問指定指定的vhost,vhost默認值為 "/"
rabbitmqctl list_permissions [-p vhost]
# 表示列出具有權限訪問指定vhost的所有用戶、對vhost中的資源具有的操作權限。默認vhost為 "/"。
# 注意,空字符串表示沒有任何權限。
rabbitmqctl list_user_permissions {username}
# 表示列出指定用戶的權限vhost,和在該vhost上的資源可操作權限。
2.2.4 Parameter Management
RabbitMQ的一些特性(例如聯合插件)是被動態的、集群范圍內的參數控制。有兩類參數:屬於vhost的參數和全局參數。
一個屬於vhost的參數由三部分組成: 組件名稱,參數名稱和值。其中組件名稱和名稱是字符串,值是一個Erlang項。
一個全局參數由兩部分組成: 參數名稱和值。其中名稱是字符串,值是一個Erlang項。
參數可以被設置,刪除,列出。參數的具體設置方法如下:
rabbitmqctl set_parameter [-p vhost] {component_name} {name} {value}
# 設置參數,{component_name}表示待設置參數的組件名稱,{name} 表示待設置的參數名稱,{value}表示待設置的參數值,是一個JSON項,在多數shell中,你很有可能要應用該值
# rabbitmqctl set_parameter federation local_username '"guest"'
# 上述例子,表示設置默認vhost即 "/" 的 federation 組件的參數 local_username 的值設置為JSON項 "guest"
rabbitmqctl clear_parameter [-p vhost] {component_name} {key}
# 表示清理一個參數,{component_name}表示待清理的組件名稱,{key}表示待清理的參數名稱
# rabbitmqctl clear_parameter federation local_username
# 上述例子表示清理默認vhost上的組件 federation 的參數 local_username
rabbitmqctl list_parameters [-p vhost]
# 表示列舉出指定的vhost上的所有參數
rabbitmqctl set_global_parameter {name} {value}
# 設置一個全局運行時的變量,有些類似於 set_parameter ,但是此 key-value 對並不綁定於vhost。
# rabbitmqctl set_global_parameter mqtt_default_vhosts '{"O=client,CN=guest":"/"}'
# 上述例子,設置一個全局運行時的參數 mqtt_default_vhosts 的值為一個JSON項, {"O=client,CN=guest":"/"}
rabbitmqctl clear_global_parameter {name}
# 清除一個全局運行時參數,類似於 clear_parameter,但是此 key-value 對並不綁定於vhost。
# rabbitmqctl clear_global_parameter mqtt_default_vhosts
# 上述例子,清除一個全局運行時參數 mqtt_default_vhosts
rabbitmqctl list_global_parameters
# 列出所有的全局運行時參數,類似於 list_parameters,但是該命令不綁定於任何vhost
2.2.5Policy Management
策略用於在集群范圍內,控制和修改隊列和交換器的行為。適用於給定固定虛擬機,並由名稱,模式,定義和可選優先級組成。可以設置,清除和列出策略。
rabbitmqctl set_policy [-p vhost] [--priority priority] [--apply-to apply-to] {name} {pattern} {definition}
# {name} 表示策略名稱;
# {pattern} 表示當匹配到給定資源的正則表達式,使的該策略得以應用;
# {definition} 表示策略的定義,作為一個JSON項,在多數shell中,你很可能需要去應用它
# {priority} 表示策略的優先級的整數,數據越大表示優先級越高,默認值為0
# {apply_to} 表示策略應該應用的類型: queues/exchange/all,默認值是 all
rabbitmqctl clear_policy [-p vhost] {name}
# 表示清理一個策略。 {name} 表示待清理的策略名稱
rabbitmqctl list_policies [-p vhost]
# 表示列舉出給定的vhost的所有策略信息
2.2.6 Server Status
服務狀態查詢語句,詢問服務之后,將返回tab分隔的一組列項結果。一些查詢語句(例如 list_queues, list_exchanges, list_bindings, list_consumers)接受一個可選的vhost參數。該參數(如果存在),必須在查詢之后立即指定。
rabbitmqctl list_queues [-p vhost] [[--offline] | [--online] | [--local]] [queueinfoitem ...]
# 返回隊列的詳細信息。如果 "-p" 標志不存在,那么將返回默認虛擬主機的隊列詳細信息。"-p" 可以用來覆蓋默認vhost。可以使用一下互斥選項之一,通過其狀態或者位置過濾顯示的隊列。
# [--offline] 表示僅僅列出當前不可用的持久隊列(更具體地說,他們的主節點不是)
# [--online] 表示列出當前可用的隊列(他們的主節點是)
# [--local] 表示僅僅列出那些主程序在當前節點上的隊列
# queueinfoitem參數用於指示要包括在結果中的哪些隊列信息項。結果中的列順序將與參數的順序相匹配。queueinfoitem可以從以下列表中獲取任何值:
# name 表示隊列的名稱
# durable 表示服務器重啟之后,隊列是否存活
# auto_delete 表示不再使用的隊列是否自動被刪除
# arguments 表示隊列的參數
# policy 表示應用在隊列中的策略名稱
# pid 表示和隊列相關聯的Erlang進程的ID
# owner_pid 表示作為隊列的排他所有者的連接的Erlang進程的ID,如果隊列是非排他,則為空
# exclusive 表示隊列是否是排他的,有 owner_pid 返回 True,否則返回 False
# exclusive_consumer_pid 表示排他消費者訂閱該隊列的頻道的Erlang進程的ID,如果沒有獨家消費者,則為空
# exclusive_consumer_tag 表示訂閱該隊列的排他消費者的消費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 表示在隊列中所有消息body的大小,這並不包括消息屬性(包括header)或者任何開銷
# message_bytes_ready 表示類似於 messge_bytes 但僅僅計算那些將發送到客戶端的消息
# message_bytes_unacknowledged 表示類似於 message_bytes 但僅僅計算那些已經發送到客戶還沒有確認的消息
# message_bytes_ram 表示類似於 message_bytes 但僅僅計算那些駐留在ram中的消息
# message_bytes_persistent 表示類似於 message_bytes 但僅僅計算那些持久消息
# head_message_timestamp 表示隊列中第一個消息的時間戳屬性(如果存在)。只有處在 paged-in 狀態的消息才存在時間戳。
# disk_reads 表示該隊列自start起,從磁盤讀取消息的次數總和
# disk_writes 表示該隊列自start起,被寫入磁盤消息的次數總和
# consumers 表示consumer的數量
# consumer_utilisation 表示隊列能夠立即將消息傳遞給消費者的時間分數(0.0 ~ 1.0之間),如果消費者受到網絡擁塞或者預取計數的限制,該值可能小於1.0
# memory 表示和該隊列相關聯的Erlang進程消耗的內存字節數,包括stack/heap/內部數據結構
# slave_pids 表示該隊列目前的slave的ID號(如果該隊列被鏡像的話)
# synchronised_slave_pids 表示如果隊列被鏡像,給出與主隊列同步的當前slave的ID號,即可以從主隊列接管而不丟失消息的slave的ID
# state 表示隊列的狀態,一般是 "running"; 如果隊列正在同步,也可能是 "{syncing, MsgCount}"; 如果隊列所處的節點當前down了,隊列顯示的狀態為 "down"
# 如果沒有指定queueinfoitem,那么將顯示隊列的名稱(name)和深度(messages)
rabbitmqctl list_exchanges [-p vhost] [exchangeinfoitem ...]
# 返回交換器的詳細信息。如果 "-p" 標志不存在,那么將返回默認虛擬主機的交換器詳細信息。"-p" 可以用來覆蓋默認vhost。
# exchangeinfoitem參數用於指示要包括在結果中的哪些交換器信息項。結果中的列順序將與參數的順序相匹配。exchangeinfoitem可以從以下列表中獲取任何值:
# name 表示交換器的名稱
# type 表示交換器類型(例如: direct/topic/fanout/headers)
# durable 表示服務器重啟之后,交換器是否存活
# auto_delete 表示交換器不再使用時,是否被自動刪除
# internal 表示交換器是否是內部的,例如不能被客戶端直接發布
# arguments 表示交換器的參數
# policy 表示引用在該交換器上的策略名稱
# 如果沒有指定任何 exchangeinfoitem,那么該命令將顯示交換器的名稱(name)和類型(type)
rabbitmqctl list_bindings [-p vhost] [bindinginfoitem ...]
# 返回綁定的詳細信息。如果 "-p" 標志不存在,那么將返回默認虛擬主機的綁定詳細信息。"-p" 可以用來覆蓋默認vhost。
# bindinginfoitem參數用於指示要包括在結果中的哪些綁定信息項。結果中的列順序將與參數的順序相匹配。bindinginfoitem可以從以下列表中獲取任何值:
# source_name 表示綁定附加到的消息源的名稱
# source_kind 表示綁定附加到的消息源的類型,目前通常交換器
# destination_name 表示附加綁定到的消息目的地的名稱
# destination_kind 表示附加綁定到的消息目的地的類型
# routing_key 表示綁定的routing key
# arguments 表示綁定的參數
# 如果沒有指定任何的 bindinginfoitem ,那么將展示上述所有的參數
# rabbitmqctl list_bindings -p /myvhost exchange_name queue_name
# 上述命令,表示展示在 /myvhost 虛擬主機中的綁定的exchange名稱和queue名稱
rabbitmqctl list_connections [connectioninfoitem ...]
# 返回TCP/IP連接統計信息
# connectioninfoitem 參數用於指示要包括在結果中的哪些連接信息項,結果中的列順序將與參數的順序相匹配。connectioninfoitem可以從以下列表中獲取任何值:
# pid 表示與該connection相關聯的Erlang進程的id號
# name 表示該連接的可讀性名稱
# port 表示服務端口
# host 表示通過反向DNS獲取的服務器主機名,如果反向DNS失敗或未啟用,則為其IP地址
# peer_port 表示對等端口
# peer_host 表示通過反向DNS獲取的對等主機名,如果反向DNS失敗或未啟用,則為其IP地址
# ssl 表示該連接是否使用SSL保護的bool值
# ssl_protocal 表示SSL協議(例如: tlsv1)
# ssl_key_exchange 表示SSL關鍵交換器算法(例如: rsa)
# ssl_cipher 表示SSL密碼算法(例如: aes_256_cbc)
# ssl_hash 表示SSL哈希函數(例如: sha)
# peer_cert_issuer 表示對等體的SSL證書的頒發者,以RFC4514形式出現
# peer_cert_validity 表示對等體的SSL證書的有效期限
# state 表示連接狀態(例如: starting/tuning/opening/running/flow/blocking/blocked/closing/closed)
# channels 表示正在使用連接的通道數量
# protocol 表示正在使用的AMQP的版本號。注意,如果一個客戶端需要一個AMQP 0-9 連接,我們將其作為 AMQP 0-9-1
# auth_mechanism 表示使用SASL認證機制,如PLAN
# user 表示和該連接相關聯的用戶名
# vhost 表示vhost名稱
# timeout 表示連接超時/協商心跳間隔,單位為秒
# frame_max 表示最大的frame大小(byte)
# channel_max 表示該連接上通道的最大數量
# client_properties 表示在連接建立期間,有客戶端傳送的消息屬性
# recv_oct 表示接受到的八位字節
# recv_cnt 表示接受到的包
# send_oct 表示發送的八位字節
# send_cnt 表示發送的包
# send_pend 表示發送的隊列大小
# connected_at 表示該連接被建立的日期和時間的時間戳格式
# 如果沒有指定任何connectioninfoitem,那么將展示:user/peer_host/peer_port/流量控制和內存塊狀態之后的時間
rabbitmqctl list_channels [channelinfoitem ...]
# 返回所有當前的通道的信息,通道即一個執行大多數AMQP命令的邏輯容器。這包括由普通AMQP連接的一部分通道、由各種插件和其他擴展程序創建的通道。
# channelinfoitem 參數用於指示要包括在結果中的哪些連接信息項,結果中的列順序將與參數的順序相匹配。channelinfoitem 可以從以下列表中獲取任何值:
# pid 表示與該連接相關聯的Erlang程序的ID號
# connection 表示與通道所屬連接相關聯的Erlang進程的ID號
# name 表示通道的可讀性名稱
# number 表示通道的號碼,在連接中唯一表示它
# user 表示和該通道相關聯的用戶名
# vhost 表示通道操作所在的vhost
# transactional 表示通道是否處於事務模式,返回 true,否則返回 false
# confirm 表示通道是否處於確認模式,返回 true, 否則返回 false
# consumer_count 表示通過通道檢索消息的邏輯AMQP消費者數量
# messages_unacknowledged 表示通過通道發送過但還沒收到反饋的消息的數量
# messages_uncommitted 表示尚未提交的事務中接受的消息數
# acks_uncommitted 表示尚未提交的事務中接受的確認數
# messages_unconfirmed 表示尚未確認已發布的消息數量。在不處於確認模式中的通道上,該值為0
# prefetch_count 表示新消費者的QoS預取限制,如果沒有限制則為0
# global_prefetch_count 表示整個通道的QoS預取限制,如果沒有限制則為0
# 如果沒有指定任何 channelinfoitem 項,那么將展示 pid/user/consumer_count/messages_unacknowledged
rabbitmqctl list_consumers [-p vhost]
# 列出消費者,例如對一個隊列的消息流的訂閱者。每一行用tab字符分隔:
# 訂閱的隊列名稱、創建和管理訂閱的通道id、在通道中唯一標識訂閱的消費者tag、消息傳輸到訂閱者之后是否需要確認的bool值、代表預取限制的整數(0表示none)、訂閱者的其他參數
rabbitmqctl status
# 展示broker的狀態信息,例如在當前Erlang節點上正在運行的應用、RabbitMQ和Erlang版本號、OS名稱、內存和文件描述統計信息
rabbitmqctl node_health_check
# RabbitMQ節點的健康檢查,驗證 Rabbit 應用正在運行,list_queues和list_channels返回,警告沒有被設置
# rabbitmqctl node_health_check -n rabbit@stringer
# 上述例子,表示對RabbitMQ節點進行健康檢查
rabbitmqctl environment
# 在每個正在運行的應用程序的應用程序環境中,顯示每個變量的名稱和值
rabbitmqctl report
# 生成服務器狀態報告,其中包括用於支持目的的所有服務器狀態信息的並置。當伴隨支持請求時,輸出應該被重定向到一個文件
# rabbitmqctl report > server_report.txt
rabbitmqctl eval {expr}
# 評估一個任務Erlang表達式
# rabbitmqctl eval 'node().'
# 上述例子,將返回 rabbitmqctl 已經連接的節點名稱
2.2.7 Miscellaneous
rabbitmqctl 其他的一些命令
rabbitmqctl close_connection {connectionpid} {explanation}
# {connectionpid} 表示待關閉連接的Erlang進程的ID號
# {explanation} 表示解釋字符串
# 指引broker去關閉與ID為 {connectionid} Erlang進程相關聯的連接,作為AMQP連接關閉協議的一部分,它也會向連接的客戶端傳遞 {explanation} 字符串
# rabbitmqctl close_connection "<rabbit@tanto.4262.0>" "go away"
# 上述例子,表示關閉與ID號為 "<rabbit@tanto.4262.0>" 的Erlang進程相關聯的連接,並向連接的客戶端傳輸解釋性語句 "go away"。
rabbitmqctl trace_on [-p vhost]
# vhost 表示要啟動跟蹤的虛擬機名稱
# 開始跟蹤。注意,跟蹤狀態不是持久的,如果服務重啟,它將恢復為關閉
rabbitmqctl trace_off [-p vhost]
# 停止跟蹤
rabbitmqctl set_vm_memory_high_watermark {fraction}
# {fraction} 觸發流量控制的新內存閾值分數,大於或等於0的浮點數
rabbitmqctl set_vm_memory_high_watermark absolute {memory_limit}
# {memory_limit} 觸發流量控制的新內存限制,以字節表示,大於或等於0的整數或作為具有存儲單元(例如: 512M或者1G),可用的單位有:
k/kiB: kibibytes(2^10字節); M/MiB: mebibytes(2^20字節); G/GiB: gibibytes(2^30字節)
kB: kilobytes(10^3); MB: megabytes(10^6); GB: gigabytes(10^9)
rabbitmqctl set_disk_free_limit {disk_limit}
# {disk_limit} 下限為字節整數或具有存儲單元的字符串(參見 vm_memory_high_watermark 命令),例如: 512M或1G,一旦可用磁盤空間達到限制,將會設置磁盤告警
rabbitmqctl set_disk_free_limit mem_relative {fraction}
# {fraction} 相對於可用RAM的限制,為非負的浮點數。低於1.0的值可能是危險的,應小心使用。
rabbitmqctl encode [--decode] [value] [passphrase] [--list-ciphers] [--list-hashes] [--cipher cipher] [--hash hash] [--iterations iteraions]
# [--decode] 表示解密輸入值的標志位。
例如: rabbitmqctl encode --decode '{encrypted,'<<"...">>}' mypassphrase
# [value] [passphrase] 表示加密和解密的值、密碼。
例如: rabbitmqctl encode '<<"guest">>' mypassphrase
例如: rabbitmqctl encode --decode '{encrypted,'<<"...">>}' mypassphrase
# [--list-ciphers] 表示列出支持的密碼標志位
例如: rabbitmqctl encode --list-ciphers
# [--list-hashes] 表示列出支持的哈希算法標志位
例如: rabbitmqctl encode --list-hashes
# [--cipher cipher] [--hash hash] [--iterations iterations] 表示用於指定加密設置的選項,它們可以獨立使用
例如: rabbitmqctl encode --cipher blowfish_cfb64 --hash sha256 --iterations 1000 '<<"guest">>' mypassphrase
2.2.8 用戶和用戶角色
# 查看用戶信息
rabbitmqctl list_users
# 結果如下
Listing users ...
guest [administrator]
...done.
# 創建新用戶 rabbitmqctl add_user {username} {password}
rabbitmqctl add_user jshan 123456
# 結果如下,表示創建成功
Creating user "jshan" ...
...done.
# 再次查詢結果如下
Listing users ...
guest [administrator]
jshan []
...done.
# 上述結果中,第一列表示用戶名,第二列表示用戶角色
# 為用戶設置用戶角色 rabbitmqctl set_user_tags {username} {role}
rabbitmqctl set_user_tags jshan monitoring
# 結果如下,表示設置成功
Setting tags for user "jshan" to [monitoring] ...
...done.
# 說明一下,執行該命令之后,會先刪除該用戶已有的角色,然后添加新的角色,可以填寫多個角色,如果想刪除某個用戶的所有角色,可以設置如下:
rabbitmqctl set_user_tags {username}
# 修改用戶密碼 rabbitmqctl change_password {username} {newpassword}
rabbitmqctl change_password jshan 123
# 結果如下,表示修改成功
Changing password for user "jshan" ...
...done.
# 清除用戶密碼 rabbitmqctl clear_password {username}
rabbitmqctl clear_password jshan
# 結果如下,表示清除成功
Clearing password for user "jshan" ...
...done.
# 說明一下,執行該命令之后,用戶無法對該用戶使用密碼登錄
# 刪除用戶 rabbitmqctl delete_user {username}
rabbitmq delete_user jshan
# 結果如下,表示刪除成功
Deleting user "jshan" ...
...done.
2.3 常用管理命令
Rabbitmq服務器的主要通過rabbitmqctl和rabbimq-plugins兩個工具來管理,以下是一些常用功能。
1). 服務器啟動與關閉
啟動: rabbitmq-server –detached 或 service start rabbitmq
關閉:rabbitmqctl stop 或 service stop rabbitmq
若單機有多個實例,則在rabbitmqctlh后加–n 指定名稱
2). 插件管理
開啟某個插件:rabbitmq-pluginsenable xxx
關閉某個插件:rabbitmq-pluginsdisablexxx
注意:重啟服務器后生效。
3).virtual_host管理
新建virtual_host: rabbitmqctladd_vhost xxx
撤銷virtual_host:rabbitmqctl delete_vhost xxx
4). 用戶管理
新建用戶:rabbitmqctl add_user xxx pwd
刪除用戶: rabbitmqctl delete_user xxx
改密碼: rabbimqctl change_password {username} {newpassword}
設置用戶角色:rabbitmqctl set_user_tags {username} {tag ...}
Tag可以為 administrator,monitoring, management
5). 權限管理
權限設置:set_permissions [-pvhostpath] {user} {conf} {write} {read}
Vhostpath
Vhost路徑
user
用戶名
Conf
一個正則表達式match哪些配置資源能夠被該用戶訪問。
Write
一個正則表達式match哪些配置資源能夠被該用戶讀。
Read
一個正則表達式match哪些配置資源能夠被該用戶訪問。
6). 獲取服務器狀態信息
服務器狀態:rabbitmqctl status
隊列信息:rabbitmqctl list_queues[-p vhostpath] [queueinfoitem ...]
Queueinfoitem可以為:name,durable,auto_delete,arguments,messages_ready,
messages_unacknowledged,messages,consumers,memory
Exchange信息:rabbitmqctllist_exchanges[-p vhostpath] [exchangeinfoitem ...]
Exchangeinfoitem有:name,type,durable,auto_delete,internal,arguments.
Binding信息:rabbitmqctllist_bindings[-p vhostpath] [bindinginfoitem ...]
Bindinginfoitem有:source_name,source_kind,destination_name,destination_kind,routing_key,arguments
Connection信息:rabbitmqctllist_connections [connectioninfoitem ...]
Connectioninfoitem有:recv_oct,recv_cnt,send_oct,send_cnt,send_pend等。
Channel信息:rabbitmqctl list_channels[channelinfoitem ...]
Channelinfoitem有consumer_count,messages_unacknowledged,messages_uncommitted,acks_uncommitted,messages_unconfirmed,prefetch_count,client_flow_blocked
三、簡單安裝和使用
注意:erlang和mq的版本,mq版本為3.6,erlang版本不能超過19
3.1 單機版YUM安裝
環境:centos7.7,rabbitmq-server-3.6.6-1.el7.noarch.rpm
#yum安裝
#安裝依賴
yum install ncurses ncurses-base ncurses-devel ncurses-libs ncurses-static ncurses-term ocaml-curses ocaml-curses-devel openssl-devel zlib-devel make ncurses-devel gcc gcc-c++ unixODBC unixODBC-devel openssl openssl-devel -y
rz rabbitmq-server-3.6.6-1.el7.noarch.rpm
yum install -y erlang
yum localinstall rabbitmq-server-3.6.6-1.el7.noarch.rpm
yum install socat(可能自動安裝)
#查看版本
erl -v
#啟動服務
systemctl start rabbitmq.server.service
#查看狀態
rabbitmqctl status
#啟動web管理插件
rabbitmq-plugins enable rabbitmq_management
#如果提示找不到,使用查看插件名稱
rabbitmq-plugins list
#增加訪問用戶,默認用戶guest只能本地訪問。
rabbitmqctl add_user admin passwd(123456)
#設置超級管理員:
rabbitmqctl set_user_tags admin administrator
設置默認vhost("/")訪問權限
rabbitmqctl set_permissions -p "/" admin "." "." ".*"
#瀏覽器訪問:http://IP:15672
用戶名admin,密碼123456進行登錄
#最好登錄console的時候,刪除默認賬戶guest
#開放安全組或防火牆15672端口
#訪問ip:15672,默認賬戶密碼15672(上面)
Config file /etc/rabbitmq/rabbitmq.config
Database directory /var/lib/rabbitmq/mnesia/rabbit@docker-004
Log file /var/log/rabbitmq/rabbit@docker-004.log
SASL log file /var/log/rabbitmq/rabbit@docker-004-sasl.log
3.2 rabbitmq集群安裝
環境:centos7.7,rabbitmq-server-3.6.6-1.el7.noarch.rpm
IP:192.168.1.1 192.168.1.2 192.168.1.3
1.安裝單機版
上面3.1-rabbitmq單機安裝
2.配置hosts,/etc/hosts
192.168.1.1 node1
192.168.1.2 node2
192.168.1.3 node3
2.復制.erlang的cookie文件【集群通訊的重點】
#erlang.cookie一般會存在這兩個地址:第一個是$home/.erlang.cookie;第二個地方就是/var/lib/rabbitmq/.erlang.cookie,注意這個文件的權限是 400(默認即是400)
scp /var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie node3:/var/lib/rabbitmq/.erlang.cookie
3.重啟動各節點rabbitmq服務
rabbitmqctl stop
rabbitmq-server -detached
或
systemctl restart rabbitmq
4.查看節點狀態
rabbitmqctl cluster_status
5.新增一個用戶並賦予權限
rabbitmqctl add_user admin 123456
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
rabbitmqctl set_user_tags admin administrator
6.組成集群
node2上:
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@node1 #加入node1為主的集群,因為cookie文件
rabbitmqctl start_app
PS:如果要使用內存節點,則可以使用
node2上:
rabbitmqctl join_cluster --ram rabbit@node1加入集群
7.查看節點狀態
rabbitmqctl cluster_status
看結果集群的名稱默認為rabbit@node1
8.設置鏡像隊列
rabbitmqctl set_policy -p coresystem ha-all "^" '{"ha-mode":"all"}'
PS:"coresystem" vhost名稱, "^"匹配所有的隊列, ha-all 策略名稱為ha-all, '{"ha-mode":"all"}' 策略模式為 all 即復制到所有節點,包含新增節點。
9.安裝並配置HA高可用
PS:可以使用阿里雲的內網slb來實現負載均衡,nginx也可以
- haproxy示例:
yum install haproxt
cat /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5s
clitimeout 120s
srvtimeout 120s
listen rabbitmq_cluster 192.168.101.11:5670
mode tcp
balance roundrobin
server rabbit1 192.168.101.11:5672 check inter 5000 rise 2 fall 2
server rabbit2 192.168.101.12:5672 check inter 5000 rise 2 fall 2
server rabbit3 192.168.101.13:5672 check inter 5000 rise 2 fall 2
listen private_monitoring :8100 mode http option httplog stats enable stats uri /rabbitmqstats stats refresh 5s
#啟動服務
systemctl start haproxy
3.3 常見錯誤
三、常見問題
常見錯誤:
1、使用 rabbitmq-server -detached命令啟動rabbitmq時,出現以下提示Warning: PID file not written; -detached was passed,此時使用rabbitmqctl status提示服務已啟動,可知此問題不用解決。
2、由於更改hostname文件,在每次rabbitmqctl stop或者rabbitmqctl cluster_status等,只要是rabbitmq的命令就報錯,提示大概如下
Cluster status of node rabbit@web2 ...
Error: unable to connect to node rabbit@web2: nodedown
DIAGNOSTICS
===========
attempted to contact: [rabbit@web2]
rabbit@web2:
* connected to epmd (port 4369) on web2
* epmd reports node 'rabbit' running on port 25672
* TCP connection succeeded but Erlang distribution failed
* Hostname mismatch: node "rabbit@mq2" believes its host is different. Please ensure that hostnames resolve the same way locally and on "rabbit@mq2"
current node details:
- node name: 'rabbitmq-cli-11@web2'
- home dir: /root
- cookie hash: SGwxMdJ3PjEXG1asIEFpBg==
此時先ps aux | grep mq,然后kill -9 該進程,然后再rabbitmq-server -detached即可解決。(即先強殺,再重新啟動)
3、使用rabbitmqctl stop,rabbitmq-server -detached重新啟動后,原先添加的用戶admin、虛擬主機coresystem等均丟失,還需要重新添加。
采用腳本啟動,在腳本中寫好啟動好需要加載的各配置項(創建admin用戶並授權,創建虛擬主機並授權,配置鏡像隊列)。
3、命令
rabbitmqctl stop_app 僅關閉應用,不關閉節點
rabbitmqctl start_app 開啟應用
rabbitmq--server -detached 啟動節點和應用
rabbitmqctl 關閉節點和應用
4、常用命令:
Rabbitmq服務器的主要通過rabbitmqctl和rabbimq-plugins兩個工具來管理,以下是一些常用功能。
1). 服務器啟動與關閉
啟動: rabbitmq-server –detached
關閉:rabbitmqctl stop
若單機有多個實例,則在rabbitmqctlh后加–n 指定名稱
2). 插件管理
開啟某個插件:rabbitmq-plugins enable xxx
關閉某個插件:rabbitmq-plugins disable xxx
注意:重啟服務器后生效。
3).virtual_host管理
新建virtual_host: rabbitmqctl add_vhost xxx
撤銷virtual_host:rabbitmqctl delete_vhost xxx
4). 用戶管理
新建用戶:rabbitmqctl add_user xxxpwd
刪除用戶: rabbitmqctl delete_user xxx
查看用戶:rabbitmqctl list_users
改密碼: rabbimqctlchange_password {username} {newpassword}
設置用戶角色:rabbitmqctlset_user_tags {username} {tag ...}
Tag可以為 administrator,monitoring, management
5). 權限管理
權限設置:set_permissions [-pvhostpath] {user} {conf} {write} {read}
Vhostpath
Vhost路徑
user
用戶名
Conf
一個正則表達式match哪些配置資源能夠被該用戶訪問。
Write
一個正則表達式match哪些配置資源能夠被該用戶讀。
Read
一個正則表達式match哪些配置資源能夠被該用戶訪問。
6). 獲取服務器狀態信息
服務器狀態:rabbitmqctl status ##其中可查看rabbitmq的版本信息
7).獲取集群狀態信息
rabbitmqctl cluster_status
3.4 部署注意事項
1.集群各節點的hosts解析
2. .erlang的cookie要一致
3.指定加入的集群名要准確
4.erlang和rabbitmq的版本對應
5.創建的用戶和權限要一致
6.時間同步