做網(wǎng)站單頁視頻關(guān)鍵詞網(wǎng)站排名軟件
1、Rabbitmq管理
1.1、多租戶與權(quán)限
????????每一個(gè)RabbitMQ 服務(wù)器都能創(chuàng)建虛擬的消息服務(wù)器,我們稱之為虛擬主機(jī)(virtual host) ,簡稱為vhost 。每一個(gè)vhost 本質(zhì)上是一個(gè)獨(dú)立的小型RabbitMQ 服務(wù)器,擁有自己獨(dú)立的隊(duì)列、交換器及綁定關(guān)系等,井且它擁有自己獨(dú)立的權(quán)限。vhost 就像是虛擬機(jī)與物理服務(wù)器一樣,它們?cè)诟鱾€(gè)實(shí)例間提供邏輯上的分離,為不同程序安全保密地運(yùn)行數(shù)據(jù),它既能將同一個(gè)RabbitMQ 中的眾多客戶區(qū)分開,又可以避免隊(duì)列和交換器等命名沖突。vhost 之間是絕對(duì)隔離的,無法將vhost1中的交換器與vhost2 中的隊(duì)列進(jìn)行綁定,這樣既保證了安全性,又可以確??梢浦残?。如果在使用RabbitMQ 達(dá)到一定規(guī)模的時(shí)候,建議用戶對(duì)業(yè)務(wù)功能、場(chǎng)景進(jìn)行歸類區(qū)分,并為之分配獨(dú)立的vhost。
????????vhost 是AMQP 概念的基礎(chǔ),客戶端在連接的時(shí)候必須制定一個(gè)vhost。?RabbitMQ 默認(rèn)創(chuàng)建的vhost 為" /" , 如果不需要多個(gè)vhost 或者對(duì)vhost 的概念不是很理解,那么用這個(gè)默認(rèn)的vhost 也是非常合理的,使用默認(rèn)的用戶名guest 和密碼guest 就可以訪問它。但是為了安全和方便,建議重新建立一個(gè)新的用戶來訪問它。
????????可以使用rabbitmqctl add_vhost {vhost} 命令創(chuàng)建一個(gè)新的vhost,大括號(hào)里的參數(shù)表示vhost 的名稱。
[root@myblnp ~]# rabbitmqctl add_vhost vhost1
Adding vhost "vhost1" ...
[root@myblnp ~]#
????????可以使用 rabbitmqctl list_vhosts [vhostinfoitem...] 來羅列當(dāng)前vhost 的相關(guān)信息。目前vhostinfoitem 的取值有2 個(gè)。
- name: 表示vhost 的名稱。
- tracing: 表示是否使用了RabbitMQ 的trace 功能。
[root@myblnp ~]# rabbitmqctl list_vhosts
Listing vhosts ...
name
vhost1
/
[root@myblnp ~]# rabbitmqctl list_vhosts tracing
Listing vhosts ...
tracing
false
false
[root@myblnp ~]# rabbitmqctl list_vhosts name tracing
Listing vhosts ...
name tracing
vhost1 false
/ false
[root@myblnp ~]#
????????對(duì)應(yīng)的刪除vhost 的命令是: rabbitmqctl delete_vhost {vhost) ,其中大括號(hào)里面的參數(shù)表示vhost 的名稱。刪除一個(gè)vhost 同時(shí)也會(huì)刪除其下所有的隊(duì)列、交換器、綁定關(guān)系、用戶權(quán)限、參數(shù)和策略等信息。
[root@myblnp ~]# rabbitmqctl delete_vhost vhost1
Deleting vhost "vhost1" ...
[root@myblnp ~]#
????????AMQP 協(xié)議中并沒有指定權(quán)限在vhost 級(jí)別還是在服務(wù)器級(jí)別實(shí)現(xiàn),由具體的應(yīng)用自定義。在RabbitMQ 中,權(quán)限控制則是以vhost 為單位的。當(dāng)創(chuàng)建一個(gè)用戶時(shí),用戶通常會(huì)被指派給至少一個(gè)vhost,并且只能訪問被指派的vhost 內(nèi)的隊(duì)列、交換器和綁定關(guān)系等。因此, RabbitMQ中的授予權(quán)限是指在vhost 級(jí)別對(duì)用戶而言的權(quán)限授予。
????????相關(guān)的授予權(quán)限命令為: rabbitmqctl set_permissions [-p vhost] {user}?{conf} {write}?{read}?。其中各個(gè)參數(shù)的含義如下所述。
- vhost : 授予用戶訪問權(quán)限的 vhost 名稱,可以設(shè)置為默認(rèn)值,即 vhost ?為 "/"
- user: 可以訪問指定vhost 的用戶名。
- conf: 一個(gè)用于匹配用戶在哪些資源上擁有可配置權(quán)限的正則表達(dá)式。
- write: 一個(gè)用于匹配用戶在哪些資源上擁有可寫權(quán)限的正則表達(dá)式。
- read : 一個(gè)用于匹配用戶在哪些資源上擁有可讀權(quán)限的正則表達(dá)式。
注意:可配直指的是隊(duì)列和交換器的創(chuàng)建及刪除之類的操作;可寫指的是發(fā)布消息;可讀指與消息有關(guān)的操作,包括讀取消息及清空整個(gè)隊(duì)列等。
?關(guān)于 AMQP 命令與權(quán)限的映射關(guān)系:
AMQP命令 | 可配置 | 可寫 | 可讀 |
---|---|---|---|
Exchange.Declare | exchange | ||
Exchange.Declare (with AE) | exchange | exchange(AE) | exchange |
Exchange.Delete | exchange | ||
Queue.Declare | queue | ||
Queue.Declare (with DLX) | queue | exchange(DLX) | queue |
Queue.Delete | queue | ||
Exchange.Bind | exchange (destination) | exchange (source) | |
Exchange.Unbind | exchange (destination) | exchange (source) | |
Queue.Bind | queue | exchange | |
Queue.Unbind | queue | exchange | |
Basic.Publish | exchange | ||
Basic.Get | queue | ||
Basic.Consume | queue | ||
Queue.Purage | queue |
????????授予 root 用戶可訪問虛擬主機(jī)vhostl,并在所有資源上都具備可配置、可寫及可讀的權(quán)限,示例如下:
[root@myblnp ~]# rabbitmqctl add_vhost vhost1
Adding vhost "vhost1" ...
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl add_user root
Adding user "root" ...
Password:
root
Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl set_permissions -p vhost1 root ".*" ".*" ".*"
Setting permissions for user "root" in vhost "vhost1" ...
[root@myblnp ~]#
????????授予root 用戶可訪問虛擬主機(jī)vhost2 , 在以"queue" 開頭的資源上具備可配置權(quán)限, 并在所有資源上擁有可寫、可讀的權(quán)限, 示例如下:
[root@myblnp ~]# rabbitmqctl add_vhost vhost2
Adding vhost "vhost2" ...
[root@myblnp ~]#
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl set_permissions -p vhost2 root "^queue.*" ".*" ".*"
Setting permissions for user "root" in vhost "vhost2" ...
[root@myblnp ~]#
????????清除權(quán)限也是在vhost 級(jí)別對(duì)用戶而言的。清除權(quán)限的命令為rabbitmqctl clear_permissions [-p vhost] { username} 。其中vhost 用于設(shè)置禁止用戶訪問的虛擬主機(jī)的名稱, 默認(rèn)為"/ " ; username 表示禁止訪問特定虛擬主機(jī)的用戶名稱。
[root@myblnp ~]# rabbitmqctl clear_permissions -p vhost1 root
Clearing permissions for user "root" in vhost "vhost1" ...
[root@myblnp ~]#
????????在RabbitMQ 中有兩個(gè)Shell 命令可以列舉權(quán)限信息。第一個(gè)命令是rabbitmqctl list_permissions [-p vhost} ,用來顯示虛擬主機(jī)上的權(quán)限;第二個(gè)命令是rabbitmqctl list_user permissions {username}?,用來顯示用戶的權(quán)限。
[root@myblnp ~]# rabbitmqctl list_permissions -p /
Listing permissions for vhost "/" ...
user configure write read
admin .* .* .*
guest .* .* .*
[root@myblnp ~]# rabbitmqctl list_permissions -p vhost1
Listing permissions for vhost "vhost1" ...[root@myblnp ~]# rabbitmqctl list_user_permissions root
Listing permissions for user "root" ...[root@myblnp ~]# rabbitmqctl list_user_permissions admin
Listing permissions for user "admin" ...
vhost configure write read
/ .* .* .*
[root@myblnp ~]#
rabbitmqctl 工具的標(biāo)準(zhǔn)語法如下( [ ])表示可選參數(shù), {}表示必選參數(shù):
rabbitmqctl [-n node] [-t timeout] [-q] (command) {command options...} [-n node]
? 【-n node】
????????默認(rèn)節(jié)點(diǎn)是" rabbit@hostname" 此處的hostname 是主機(jī)名稱。在一個(gè)名為node.hidden.com"
的主機(jī)上, RabbitMQ 節(jié)點(diǎn)的名稱通常是rabbit@node (除非RABBITMQ_NODENAME 參數(shù)在啟動(dòng)時(shí)被設(shè)置成了非默認(rèn)值).hostname -s 命令的輸出通常是"@"標(biāo)志后的東西。
【-q】
????????.使用-q 標(biāo)志來啟用quiet 模式,這樣可以屏蔽一些消息的輸出。默認(rèn)不開啟quiet 模式。
【-t timeout】
????????操作超時(shí)時(shí)間(秒為單位),只適用于"list_xxx" 類型的命令,默認(rèn)是無窮大。
[root@myblnp ~]# rabbitmqctl list_vhosts
Listing vhosts ...
name
vhost1
/
[root@myblnp ~]# rabbitmqctl list_vhosts -q
name
vhost1
/
[root@myblnp ~]#
1.2、用戶管理
????????創(chuàng)建用戶的命令為rabbitmqctl add_user {username} {password} 。其中username 表示要?jiǎng)?chuàng)建的用戶名稱; password 表示創(chuàng)建用戶登錄的密碼。具體創(chuàng)建一個(gè)用戶名為root 、密碼為root123 的用戶:
[root@myblnp ~]# rabbitmqctl add_user root root123
Adding user "root" ...
Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
[root@myblnp ~]#
????????可以通過rabbitmqctl change_password {username} {newpassword} 命令來更改指定用戶的密碼, 其中username 表示要變更密碼的用戶名稱, newpassword 表示要變更的新的密碼。舉例,將root 用戶的密碼變更為root321 :
[root@myblnp ~]# rabbitmqctl change_password root root321
Changing password for user "root" ...
[root@myblnp ~]#
????????同樣可以清除密碼,這樣用戶就不能使用密碼登錄了,對(duì)應(yīng)的操作命令為rabbitmqctl clear_password {username} ,其中username 表示要清除密碼的用戶名稱。
????????使用rabbitmqctl authenticate_user {userηame} {password} 可以通過密碼來驗(yàn)證用戶,其中username 表示需要被驗(yàn)證的用戶名稱, password 表示密碼。下面示例中分別采用root321 和root322 來驗(yàn)證root 用戶:
[root@myblnp ~]# rabbitmqctl authenticate_user root root321
Authenticating user "root" ...
Success
[root@myblnp ~]# rabbitmqctl authenticate_user root root322
Authenticating user "root" ...
Error:
Error: failed to authenticate user "root"
user 'root' - invalid credentials
[root@myblnp ~]#
????????刪除用戶的命令是rabbitmqctl delete_user {username) ,其中username 表示要?jiǎng)h除的用戶名稱。刪除root 用戶的示例如下:
[root@myblnp ~]# rabbitmqctl delete_user root
Deleting user "root" ...
[root@myblnp ~]#
????????rabbitmqctl list_users 命令可以用來羅列當(dāng)前的所有用戶。每個(gè)結(jié)果行都包含用戶名稱,其后緊跟用戶的角色(tags) 。示例如下:
[root@myblnp ~]# rabbitmqctl list_users
Listing users ...
user tags
admin [administrator]
guest [administrator]
root []
[root@myblnp ~]#
用戶的角色分為5 種類型:
- none: 無任何角色。新創(chuàng)建的用戶的角色默認(rèn)為none 。
- management: 可以訪問Web 管理頁面
- policymaker: 包含management 的所有權(quán)限,并且可以管理策略(Policy) 和參數(shù)(Parameter)
- monitoring: 包含management 的所有權(quán)限,并且可以看到所有連接、信道及節(jié)點(diǎn)相關(guān)的信息。
- administartor: 包含monitoring 的所有權(quán)限,井且可以管理用戶、虛擬主機(jī)、權(quán)限、策略、參數(shù)等。administator 代表了最高的權(quán)限。
????????用戶的角色可以通過rabbitmqctl set_user_tags {username} {tag ...} 命令設(shè)置。其中username 參數(shù)表示需要設(shè)置角色的用戶名稱; tag 參數(shù)用于設(shè)置0 個(gè)、1個(gè)或者多個(gè)的角色,設(shè)置之后任何之前現(xiàn)有的身份都會(huì)被刪除。示例如下:
[root@myblnp ~]# rabbitmqctl set_user_tags root monitoring
Setting tags for user "root" to [monitoring] ...
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_users -q
user tags
admin [administrator]
guest [administrator]
root [monitoring]
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl set_user_tags root policymaker -q
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_users -q
user tags
admin [administrator]
guest [administrator]
root [policymaker]
[root@myblnp ~]# rabbitmqctl set_user_tags root
Setting tags for user "root" to [] ...
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_users -q
user tags
admin [administrator]
guest [administrator]
root []
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl set_user_tags root monitoring,policymaker
Setting tags for user "root" to [monitoring,policymaker] ...
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_users -q
user tags
admin [administrator]
guest [administrator]
root [monitoring,policymaker]
[root@myblnp ~]#
1.3、WEB端管理
????????RabbitMQ management 插件可以提供Web 管理界面用來管理如前面所述的虛擬主機(jī)、用戶等,也可以用來管理隊(duì)列、交換器、綁定關(guān)系、策略、參數(shù)等,還可以用來監(jiān)控RabbitMQ服務(wù)的狀態(tài)及一些數(shù)據(jù)統(tǒng)計(jì)類信息,可謂是功能強(qiáng)大,基本上能夠涵蓋所有RabbitMQ 管理的功能。
????????在使用Web 管理界面之前需要先啟用RabbitMQ management 插件。RabbitMQ 提供了很多的插件,默認(rèn)存放在$RABBITMQ_HOME/plugins 目錄下,如下所示。
[root@myblnp plugins]# ls -al
total 13812
drwxr-xr-x. 2 rabit rabit 4096 May 5 2021 .
drwxr-xr-x. 7 rabit rabit 4096 May 5 2021 ..
-rw-r--r--. 1 rabit rabit 13402 May 5 2021 accept-0.3.5.ez
-rw-r--r--. 1 rabit rabit 106775 May 5 2021 amqp10_client-3.8.16.ez
-rw-r--r--. 1 rabit rabit 45582 May 5 2021 amqp10_common-3.8.16.ez
-rw-r--r--. 1 rabit rabit 414782 May 5 2021 amqp_client-3.8.16.ez
-rw-r--r--. 1 rabit rabit 19784 May 5 2021 aten-0.5.5.ez
-rw-r--r--. 1 rabit rabit 3190 May 5 2021 base64url-0.0.1.ez
-rw-r--r--. 1 rabit rabit 291030 May 5 2021 cowboy-2.8.0.ez
-rw-r--r--. 1 rabit rabit 644414 May 5 2021 cowlib-2.9.1.ez
-rw-r--r--. 1 rabit rabit 18574 May 5 2021 credentials_obfuscation-2.4.0.ez
-rw-r--r--. 1 rabit rabit 165282 May 5 2021 cuttlefish-3.0.0.ez
-rw-r--r--. 1 rabit rabit 2486961 May 5 2021 eetcd-0.3.3.ez
-rw-r--r--. 1 rabit rabit 13832 May 5 2021 gen_batch_server-0.8.4.ez
-rw-r--r--. 1 rabit rabit 69329 May 5 2021 goldrush-0.1.9.ez
-rw-r--r--. 1 rabit rabit 97349 May 5 2021 gun-1.3.3.ez
-rw-r--r--. 1 rabit rabit 831324 May 5 2021 jose-1.11.1.ez
-rw-r--r--. 1 rabit rabit 99032 May 5 2021 jsx-2.11.0.ez
-rw-r--r--. 1 rabit rabit 234023 May 5 2021 lager-3.9.1.ez
-rw-r--r--. 1 rabit rabit 167679 May 5 2021 observer_cli-1.6.1.ez
-rw-r--r--. 1 rabit rabit 223866 May 5 2021 prometheus-4.6.0.ez
-rw-r--r--. 1 rabit rabit 388178 May 5 2021 ra-1.1.8.ez
-rw-r--r--. 1 rabit rabit 2651488 May 5 2021 rabbit-3.8.16.ez
-rw-r--r--. 1 rabit rabit 802365 May 5 2021 rabbit_common-3.8.16.ez
-rw-r--r--. 1 rabit rabit 257342 May 5 2021 rabbitmq_amqp1_0-3.8.16.ez
-rw-r--r--. 1 rabit rabit 33874 May 5 2021 rabbitmq_auth_backend_cache-3.8.16.ez
-rw-r--r--. 1 rabit rabit 17174 May 5 2021 rabbitmq_auth_backend_http-3.8.16.ez
-rw-r--r--. 1 rabit rabit 53216 May 5 2021 rabbitmq_auth_backend_ldap-3.8.16.ez
-rw-r--r--. 1 rabit rabit 52388 May 5 2021 rabbitmq_auth_backend_oauth2-3.8.16.ez
-rw-r--r--. 1 rabit rabit 24428 May 5 2021 rabbitmq_auth_mechanism_ssl-3.8.16.ez
-rw-r--r--. 1 rabit rabit 76414 May 5 2021 rabbitmq_aws-3.8.16.ez
-rw-r--r--. 1 rabit rabit 35523 May 5 2021 rabbitmq_consistent_hash_exchange-3.8.16.ez
-rw-r--r--. 1 rabit rabit 27474 May 5 2021 rabbitmq_event_exchange-3.8.16.ez
-rw-r--r--. 1 rabit rabit 266831 May 5 2021 rabbitmq_federation-3.8.16.ez
-rw-r--r--. 1 rabit rabit 14743 May 5 2021 rabbitmq_federation_management-3.8.16.ez
-rw-r--r--. 1 rabit rabit 26640 May 5 2021 rabbitmq_jms_topic_exchange-3.8.16.ez
-rw-r--r--. 1 rabit rabit 1288744 May 5 2021 rabbitmq_management-3.8.16.ez
-rw-r--r--. 1 rabit rabit 191385 May 5 2021 rabbitmq_management_agent-3.8.16.ez
-rw-r--r--. 1 rabit rabit 203899 May 5 2021 rabbitmq_mqtt-3.8.16.ez
-rw-r--r--. 1 rabit rabit 27153 May 5 2021 rabbitmq_peer_discovery_aws-3.8.16.ez
-rw-r--r--. 1 rabit rabit 59166 May 5 2021 rabbitmq_peer_discovery_common-3.8.16.ez
-rw-r--r--. 1 rabit rabit 56186 May 5 2021 rabbitmq_peer_discovery_consul-3.8.16.ez
-rw-r--r--. 1 rabit rabit 55590 May 5 2021 rabbitmq_peer_discovery_etcd-3.8.16.ez
-rw-r--r--. 1 rabit rabit 31125 May 5 2021 rabbitmq_peer_discovery_k8s-3.8.16.ez
-rw-r--r--. 1 rabit rabit 99348 May 5 2021 rabbitmq_prelaunch-3.8.16.ez
-rw-r--r--. 1 rabit rabit 51326 May 5 2021 rabbitmq_prometheus-3.8.16.ez
-rw-r--r--. 1 rabit rabit 7652 May 5 2021 rabbitmq_random_exchange-3.8.16.ez
-rw-r--r--. 1 rabit rabit 18907 May 5 2021 rabbitmq_recent_history_exchange-3.8.16.ez
-rw-r--r--. 1 rabit rabit 49666 May 5 2021 rabbitmq_sharding-3.8.16.ez
-rw-r--r--. 1 rabit rabit 205865 May 5 2021 rabbitmq_shovel-3.8.16.ez
-rw-r--r--. 1 rabit rabit 27459 May 5 2021 rabbitmq_shovel_management-3.8.16.ez
-rw-r--r--. 1 rabit rabit 153370 May 5 2021 rabbitmq_stomp-3.8.16.ez
-rw-r--r--. 1 rabit rabit 72903 May 5 2021 rabbitmq_top-3.8.16.ez
-rw-r--r--. 1 rabit rabit 68241 May 5 2021 rabbitmq_tracing-3.8.16.ez
-rw-r--r--. 1 rabit rabit 86477 May 5 2021 rabbitmq_trust_store-3.8.16.ez
-rw-r--r--. 1 rabit rabit 49514 May 5 2021 rabbitmq_web_dispatch-3.8.16.ez
-rw-r--r--. 1 rabit rabit 52345 May 5 2021 rabbitmq_web_mqtt-3.8.16.ez
-rw-r--r--. 1 rabit rabit 66605 May 5 2021 rabbitmq_web_mqtt_examples-3.8.16.ez
-rw-r--r--. 1 rabit rabit 56616 May 5 2021 rabbitmq_web_stomp-3.8.16.ez
-rw-r--r--. 1 rabit rabit 52278 May 5 2021 rabbitmq_web_stomp_examples-3.8.16.ez
-rw-r--r--. 1 rabit rabit 108136 May 5 2021 ranch-2.0.0.ez
-rw-r--r--. 1 rabit rabit 59 May 5 2021 README
-rw-r--r--. 1 rabit rabit 77411 May 5 2021 recon-2.5.1.ez
-rw-r--r--. 1 rabit rabit 47501 May 5 2021 stdout_formatter-0.2.4.ez
-rw-r--r--. 1 rabit rabit 56947 May 5 2021 syslog-3.4.5.ez
-rw-r--r--. 1 rabit rabit 17593 May 5 2021 sysmon_handler-1.3.0.ez
[root@myblnp plugins]#
????????其中以 .ez 擴(kuò)展名稱結(jié)尾的文件就是RabbitMQ 的插件, 上面文件中的rabbitmq_management-3.8.16.ez 就是指RabbitMQ Management 插件。啟動(dòng)插件的命令不是使用rabbitmqctl 工具, 而是使用rabbitmq-plugins ,其語法格式為:
rabbitmq-plugins [-n node] {command} [command options ... ]
????????啟動(dòng)插件是使用rabbitmq-plugins enable [plugin - name] ,關(guān)閉插件的命令是rabbitmq-plugins disable [plugin-name] 。執(zhí)行rabbitmq-plugins enable rabbitmq management 命令來開啟RabbitMQ managmenet 插件:
rabbitmq-plugins enable rabbitmq_management
可以通過rabbitmq-plugins list 命令來查看當(dāng)前插件的使用情況, 如下所示。其中標(biāo)記為 [E*] 的為顯式啟動(dòng),而[e*] 為隱式啟動(dòng), 如顯式啟動(dòng)rabbitmq_management 插件會(huì)同時(shí)隱式啟動(dòng)amqp_client 、cowboy 、cowlib 、rabbitmq_management_agent 、rabbitmq_web_dispatch 等另外5 個(gè)插件。
[root@myblnp plugins]# rabbitmq-plugins list
Listing plugins with pattern ".*" ...Configured: E = explicitly enabled; e = implicitly enabled| Status: * = running on rabbit@myblnp|/
[ ] rabbitmq_amqp1_0 3.8.13
[ ] rabbitmq_auth_backend_cache 3.8.13
[ ] rabbitmq_auth_backend_http 3.8.13
[ ] rabbitmq_auth_backend_ldap 3.8.13
[ ] rabbitmq_auth_backend_oauth2 3.8.13
[ ] rabbitmq_auth_mechanism_ssl 3.8.13
[ ] rabbitmq_consistent_hash_exchange 3.8.13
[ ] rabbitmq_event_exchange 3.8.13
[ ] rabbitmq_federation 3.8.13
[ ] rabbitmq_federation_management 3.8.13
[ ] rabbitmq_jms_topic_exchange 3.8.13
[E*] rabbitmq_management 3.8.13
[e*] rabbitmq_management_agent 3.8.13
[ ] rabbitmq_mqtt 3.8.13
[ ] rabbitmq_peer_discovery_aws 3.8.13
[ ] rabbitmq_peer_discovery_common 3.8.13
[ ] rabbitmq_peer_discovery_consul 3.8.13
[ ] rabbitmq_peer_discovery_etcd 3.8.13
[ ] rabbitmq_peer_discovery_k8s 3.8.13
[ ] rabbitmq_prometheus 3.8.13
[ ] rabbitmq_random_exchange 3.8.13
[ ] rabbitmq_recent_history_exchange 3.8.13
[ ] rabbitmq_sharding 3.8.13
[ ] rabbitmq_shovel 3.8.13
[ ] rabbitmq_shovel_management 3.8.13
[ ] rabbitmq_stomp 3.8.13
[ ] rabbitmq_top 3.8.13
[ ] rabbitmq_tracing 3.8.13
[ ] rabbitmq_trust_store 3.8.13
[e*] rabbitmq_web_dispatch 3.8.13
[ ] rabbitmq_web_mqtt 3.8.13
[ ] rabbitmq_web_mqtt_examples 3.8.13
[ ] rabbitmq_web_stomp 3.8.13
[ ] rabbitmq_web_stomp_examples 3.8.13
[root@myblnp plugins]#
????????開啟rabbitmq_management 插件之后還需要重啟RabbitMQ 服務(wù)才能使其正式生效。之后就可以通過瀏覽器訪問htψ://localhost:15672/. 這樣會(huì)出現(xiàn)一個(gè)認(rèn)證登錄的界面,可以通過默認(rèn)的guest/guest 的用戶名和密碼來登錄。如果訪問的地址不是本地地址,比如在192.168.0.2的主機(jī)上訪問http://192.168.0.3:15672 的Web 管理頁面,使用默認(rèn)的guest 賬戶是訪問不了的。在之前比較古老的版本中可以訪問,但是出于安全性方面的考慮,在最近的一些版本中需要使用一個(gè)具有非none 的用戶角色的非guest 賬戶來訪問Web 管理頁面。

1.4、應(yīng)用與集群管理
1.4.1、應(yīng)用管理
指令:rabbitmqctl stop [pid_file]
????????用于停止運(yùn)行RabbitMQ 的Erlang 虛擬機(jī)和RabbitMQ 服務(wù)應(yīng)用。如果指定了pid_file,還需要等待指定進(jìn)程的結(jié)束。其中pid file 是通過調(diào)用rabbitmq-server 命令啟動(dòng)RabbitMQ 服務(wù)時(shí)創(chuàng)建的,默認(rèn)情況下存放于Mnesia 目錄中,可以通過RABBITMQ_PID_FILE這個(gè)環(huán)境變量來改變存放路徑。注意,如果使用rabbitmq-server -detach 這個(gè)帶有-detach 后綴的命令來啟動(dòng)RabbitMQ 服務(wù)則不會(huì)生成pid file 文件。
[root@myblnp plugins]# rabbitmqctl stop
Stopping and halting node rabbit@myblnp ...
[root@myblnp plugins]# rabbitmqctl stop
Stopping and halting node rabbit@myblnp ...
Error: unable to perform an operation on node 'rabbit@myblnp'. Please see diagnostics information and suggestions below.Most common reasons for this are:* Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)* CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)* Target node is not runningIn addition to the diagnostics info below:* See the CLI, clustering and networking guides on https://rabbitmq.com/documentation.html to learn more* Consult server logs on node rabbit@myblnp* If target node is configured to use long node names, don't forget to use --longnames with CLI toolsDIAGNOSTICS
===========attempted to contact: [rabbit@myblnp]rabbit@myblnp:* connected to epmd (port 4369) on myblnp* epmd reports: node 'rabbit' not running at allno other nodes on myblnp* suggestion: start the nodeCurrent node details:* node name: 'rabbitmqcli-185-rabbit@myblnp'* effective user's home directory: /var/lib/rabbitmq* Erlang cookie hash: YGXJmh5ZMPKrew0h033R/Q==[root@myblnp plugins]#
指令:rabbitmqctl shutdown?
????????用于停止運(yùn)行RabbitMQ 的Erlang 虛擬機(jī)和RabbitMQ 服務(wù)應(yīng)用。執(zhí)行這個(gè)命令會(huì)阻塞直到Erlang 虛擬機(jī)進(jìn)程退出。如果RabbitMQ 沒有成功關(guān)閉,則會(huì)返回一個(gè)非零值。這個(gè)命令和rabbitmqctl stop 不同的是,它不需要指定pid_file 而可以阻塞等待指定進(jìn)程的關(guān)閉。示例如下所示:
[root@myblnp ~]# rabbitmqctl shutdown
Shutting down RabbitMQ node rabbit@myblnp running at PID 15973
Waiting for PID 15973 to terminate
RabbitMQ node rabbit@myblnp running at PID 15973 successfully shut down
[root@myblnp ~]# systemctl status rabbitmq-server
● rabbitmq-server.service - RabbitMQ brokerLoaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: disabled)Active: inactive (dead) since Tue 2023-09-12 10:30:16 CST; 14s agoProcess: 16437 ExecStop=/usr/sbin/rabbitmqctl shutdown (code=exited, status=69)Process: 15973 ExecStart=/usr/sbin/rabbitmq-server (code=exited, status=0/SUCCESS)Main PID: 15973 (code=exited, status=0/SUCCESS)Status: "Initialized"Sep 12 10:30:16 myblnp rabbitmqctl[16437]: attempted to contact: [rabbit@myblnp]
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: rabbit@myblnp:
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: * connected to epmd (port 4369) on myblnp
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: * epmd reports: node 'rabbit' not running at all
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: other nodes on myblnp: ['rabbitmqcli-553-rabbit']
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: * suggestion: start the node
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: Current node details:
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: * node name: 'rabbitmqcli-239-rabbit@myblnp'
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: * effective user's home directory: /var/lib/rabbitmq
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: * Erlang cookie hash: YGXJmh5ZMPKrew0h033R/Q==
[root@myblnp ~]#
指令:rabbitmqctl stop_app?
????????停止RabbitMQ 服務(wù)應(yīng)用,但是Erlang 虛擬機(jī)還是處于運(yùn)行狀態(tài)。此命令的執(zhí)行優(yōu)先于其他管理操作(這些管理操作需要先停止RabbitMQ 應(yīng)用),比如rabbitmqctl reset 。示例如下所示:
[root@myblnp ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@myblnp ...
[root@myblnp ~]#
指令:rabbitmqctl start_app
????????啟動(dòng)RabbitMQ 應(yīng)用。此命令典型的用途是在執(zhí)行了其他管理操作之后,重新啟動(dòng)之前停止的RabbitMQ 應(yīng)用,比如rabbitmqctl reset 。示例如下:
[root@myblnp ~]# rabbitmqctl start_app
Starting node rabbit@myblnp ...
[root@myblnp ~]#
?指令:rabbitmqctl wait [pid_file]
????????等待RabbitMQ 應(yīng)用的啟動(dòng)。它會(huì)等到pid_file 的創(chuàng)建,然后等待pid_file 中所代表的進(jìn)程啟動(dòng)。當(dāng)指定的進(jìn)程沒有啟動(dòng)RabbitMQ 應(yīng)用而關(guān)閉時(shí)將會(huì)返回失敗。
[root@myblnp ~]# rabbitmqctl wait
Error (argument validation): "No pid or pidfile specified"
Arguments given:waitUsagerabbitmqctl [--node <node>] [--longnames] [--quiet] wait [<pidfile>] [--pid|-P <pid>] [--timeout <timeout>]
[root@myblnp ~]# ps -ef | grep rabbit
rabbitmq 15498 1 0 09:59 ? 00:00:00 /usr/lib64/erlang/erts-10.7.2.5/bin/epmd -daemon
rabbitmq 16483 1 1 10:30 ? 00:00:10 /usr/lib64/erlang/erts-10.7.2.5/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -sbwt none -sbwtdcpu none -sbwtdio none -- -root /usr/lib64/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa -noshell -noinput -s rabbit boot -boot start_sasl -lager crash_log false -lager handlers [] --
rabbitmq 16498 16483 0 10:30 ? 00:00:00 erl_child_setup 32768
rabbitmq 16546 16498 0 10:30 ? 00:00:00 inet_gethost 4
rabbitmq 16547 16546 0 10:30 ? 00:00:00 inet_gethost 4
root 17591 1846 0 10:41 pts/0 00:00:00 grep --color=auto rabbit
[root@myblnp ~]# rabbitmqctl wait 16483
Waiting for pid file '16483' to appear
Error: operation wait on node rabbit@myblnp timed out. Timeout value used: 10000
[root@myblnp ~]#
?指令:rabbitmqctl reset
????????將RabbitMQ 節(jié)點(diǎn)重置還原到最初狀態(tài)。包括從原來所在的集群中刪除此節(jié)點(diǎn),從管理數(shù)據(jù)庫中刪除所有的配置數(shù)據(jù),如己配置的用戶、vhost 等,以及刪除所有的持久化消息。執(zhí)行rabbitmqctl reset 命令前必須停止RabbitMQ 應(yīng)用(比如先執(zhí)行rabbitmqctl stop_app) 。示例如下:
[root@myblnp ~]# rabbitmqctl stop app
Stopping rabbit application on node rabbit@myblnp
[root@myblnp ~]# rabbitmqct1 reset
Resetting node rabbit@node
指令:rabbitmqctl force_reset
????????強(qiáng)制將RabbitMQ 節(jié)點(diǎn)重置還原到最初狀態(tài)。不同于rabbitmqctl reset 命令,rabbitmqctl force_reset 命令不論當(dāng)前管理數(shù)據(jù)庫的狀態(tài)和集群配置是什么,都會(huì)無條件地重直節(jié)點(diǎn)。它只能在數(shù)據(jù)庫或集群配置己損壞的情況下使用。與rabbitmqctl reset命令一樣,執(zhí)行rabbitmqctl force_reset 命令前必須先停止RabbitMQ 應(yīng)用。
[root@myblnp ~]# rabbitmqct1 stop_app
Stopping rabbit application on node rabbit@myblnp
[root@myblnp ~]# rabbitmqct1 force reset
Forcefully resetting node rabbit@myblnp
溫馨提示:如果安裝的rabbitmq有注冊(cè)服務(wù),并且忘記服務(wù)名的話??梢酝ㄟ^下面的指令查找下服務(wù)器已注冊(cè)的自啟服務(wù),看下rabbitmq的完整名稱。進(jìn)而通過服務(wù)命令查詢當(dāng)前rabbitmq的服務(wù)狀態(tài)。(Centos7)
systemctl list-unit-files --type=service | grep enabled
?1.4.2、集群管理
指令:rabbitmqctl joio_cluster {cluster_node} [--ram]
????????將節(jié)點(diǎn)加入指定集群中。在這個(gè)命令執(zhí)行前需要停止RabbitMQ 應(yīng)用井重置節(jié)點(diǎn)。
指令:rabbitmqctl cluster_status
? ? ? ? 顯示集群的狀態(tài)
指令:rabbitmqctl change_cluster_node_type {disc/ram}
????????修改集群節(jié)點(diǎn)的類型。在這個(gè)命令執(zhí)行前需要停止RabbitMQ 應(yīng)用。
指令:rabbitmqctl forget_cluster_ node [--offiine]
????????將節(jié)點(diǎn)從集群中刪除,允許離線執(zhí)行。
指令:rabbitmqctl update_ cluster_nodes {clusternode}
????????在集群中的節(jié)點(diǎn)應(yīng)用啟動(dòng)前咨詢clusternode 節(jié)點(diǎn)的最新信息, 井更新相應(yīng)的集群信息。這個(gè)和join_cluster 不同,它不加入集群??紤]這樣一種情況, 節(jié)點(diǎn)A 和節(jié)點(diǎn)B 都在集群中,當(dāng)節(jié)點(diǎn)A 離線了,節(jié)點(diǎn)C 又和節(jié)點(diǎn)B 組成了一個(gè)集群,然后節(jié)點(diǎn)B 又離開了集群, 當(dāng)A醒來的時(shí)候,它會(huì)嘗試聯(lián)系節(jié)點(diǎn)B ,但是這樣會(huì)失敗, 因?yàn)楣?jié)點(diǎn)B 己經(jīng)不在集群中了。Rabbitmqctl update_cluster_nodes -n, A、C 可以解決這種場(chǎng)景下出現(xiàn)的問題。示例如下:
##假設(shè)己有 myblnp 和node 組成的集群
##1.初始狀態(tài)
[root@myblnp ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@myblnp ...
BasicsCluster name: rabbit@myblnpDisk Nodesrabbit@myblnpRunning Nodesrabbit@myblnpVersionsrabbit@myblnp: RabbitMQ 3.8.13 on Erlang 22.3.4.12Maintenance statusNode: rabbit@myblnp, status: not under maintenanceAlarms(none)Network Partitions(none)ListenersNode: rabbit@myblnp, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@myblnp, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@myblnp, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0Feature flagsFlag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled
[root@myblnp ~]#
##2. 關(guān)閉nodel 節(jié)點(diǎn)的應(yīng)用
[root@myblnp ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@myblnp
##3. 之后將node3 加入到集群中(rabbitmqctl join cluster rabbit@node2)
##4 . 再將node2 節(jié)點(diǎn)的應(yīng)用關(guān)閉
##5 . 最后啟動(dòng)nodel 節(jié)點(diǎn)的應(yīng)用, 此時(shí)會(huì)報(bào)錯(cuò)
[root@myblnp ~]# rabbitmqctl start_app
Starting node rabbit@myblnp
BOOT FAILED
Timeout contacting cluster nodes : [rabbit@node2) .
.. .. ..(省略)
##6. 如果在啟動(dòng)myblnp 節(jié)點(diǎn)的應(yīng)用之前咨詢node3 并更新相關(guān)集群信息則可以解決這個(gè)問題
[root@myblnp ~]# rabbitmqctl update_cluster_nodes rabbit@node3
Updating cluster nodes for rabbit@myblnp from rabbit@node3
[root@myblnp ~]# rabbitmqctl start_app
Starting node rabbit@myblnp
##7 . 最終集群狀態(tài)
[root@myblnp ~]# rabbitmqctl cluster status
Cluster status of node rabbit@myblnp
[{nodes , [{disc, [rabbit@myblnp , rabbit@node3]}]} ,
{running_nodes , [rabbit@node3 , rabbit@myblnp]} ,
{cluster name , <<"rabbit@myblnp " >>} ,
{partitions , [] } ,
{alarms , [{rabbit@node3 , []} , {rabbit@myblnp , []}]}]
指令:rabbitmqctl force_boot
????????確保節(jié)點(diǎn)可以啟動(dòng),即使它不是最后一個(gè)關(guān)閉的節(jié)點(diǎn)。通常情況下,當(dāng)關(guān)閉整個(gè)RabbitMQ集群時(shí),重啟的第一個(gè)節(jié)點(diǎn)應(yīng)該是最后關(guān)閉的節(jié)點(diǎn),因?yàn)樗梢钥吹狡渌?jié)點(diǎn)所看不到的事情。但是有時(shí)會(huì)有一些異常情況出現(xiàn),比如整個(gè)集群都掉電而所有節(jié)點(diǎn)都認(rèn)為它不是最后一個(gè)關(guān)閉的。在這種情況下,可以調(diào)用rabbitmqctl force_boot 命令,這就告訴節(jié)點(diǎn)可以無條件地啟動(dòng)節(jié)點(diǎn)。在此節(jié)點(diǎn)關(guān)閉后,集群的任何變化,它都會(huì)丟失。如果最后一個(gè)關(guān)閉的節(jié)點(diǎn)永久丟失了,那么需要優(yōu)先使用rabbitmqctl forget_cluster_node -offline 命令,因?yàn)樗梢源_保鏡像隊(duì)列的正常運(yùn)轉(zhuǎn)。
[root@myblnp ~]# rabbitmqctl force_boot
Forcing boot for Mnesia dir /opt/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@node2
[root@myblnp ~]# rabbitmq-server -detached
指令:rabbitmqctl sync_queue [-p vhost] {queue}
????????指示未同步隊(duì)列queue 的slave 鏡像可以同步master 鏡像行的內(nèi)容。同步期間此隊(duì)列會(huì)被阻塞(所有此隊(duì)列的生產(chǎn)消費(fèi)者都會(huì)被阻塞),直到同步完成。此條命令執(zhí)行成功的前提是隊(duì)列queue 配置了鏡像。注意, 未同步隊(duì)列中的消息被耗盡后, 最終也會(huì)變成同步,此命令主要用于未耗盡的隊(duì)列。
[root@myblnp ~]# rabbitmqctl sync_queue queue
Synchronising queue 'queue ' in vhost '/'
指令:rabbitmqctl cancel_sync_queue [-p vhost] {queue}
????????取消隊(duì)列queue 同步鏡像的操作。示例如下:
[root@myblnp ~]# rabbitmqctl cancel_sync_queue queue
Stopping synchronising queue 'queue' in vhost ' /'
指令:rabbitmqctl set_cluster_name {name}
????????設(shè)置集群名稱。集群名稱在客戶端連接時(shí)會(huì)通報(bào)給客戶端。Federation 和Shovel 插件也會(huì)有用到集群名稱的地方。集群名稱默認(rèn)是集群中第一個(gè)節(jié)點(diǎn)的名稱,通過這個(gè)命令可以重新設(shè)置。在Web 管理界面的右上角有個(gè)"(change)"的地方,點(diǎn)擊也可以修改集群名稱。示例如下:
[root@myblnp ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@myblnp ...
BasicsCluster name: rabbit@myblnpDisk Nodesrabbit@myblnpRunning Nodesrabbit@myblnpVersionsrabbit@myblnp: RabbitMQ 3.8.13 on Erlang 22.3.4.12Maintenance statusNode: rabbit@myblnp, status: not under maintenanceAlarms(none)Network Partitions(none)ListenersNode: rabbit@myblnp, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@myblnp, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@myblnp, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0Feature flagsFlag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled
[root@myblnp ~]# rabbitmqctl set_cluster_name myblnps
Setting cluster name to myblnps ...
[root@myblnp ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@myblnp ...
BasicsCluster name: myblnpsDisk Nodesrabbit@myblnpRunning Nodesrabbit@myblnpVersionsrabbit@myblnp: RabbitMQ 3.8.13 on Erlang 22.3.4.12Maintenance statusNode: rabbit@myblnp, status: not under maintenanceAlarms(none)Network Partitions(none)ListenersNode: rabbit@myblnp, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@myblnp, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@myblnp, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0Feature flagsFlag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled
[root@myblnp ~]#
1.5、服務(wù)端狀態(tài)
1.5.1、rabbitmqctl list_queues
完整命令:rabbitmqctl list_queues [-p vhost] [queueinfoitem ……]
????????此命令返回隊(duì)列的詳細(xì)信息,如果無[-p vhost] 參數(shù),將顯示默認(rèn)的vhost 為" /" 中的隊(duì)列詳情。queueinfoitem 參數(shù)用于指示哪些隊(duì)列的信息項(xiàng)會(huì)包含在結(jié)果集中,結(jié)果集的列順序?qū)⑵ヅ鋮?shù)的順序。queueinfoitem 可以是下面列表中的任何值。
- name: 隊(duì)列名稱。
- durable: 隊(duì)列是否持久化。
- auto_delete: 隊(duì)列是否自動(dòng)刪除。
- arguments : 隊(duì)列的參數(shù)。
- policy : 應(yīng)用到隊(duì)列上的策略名稱。
- pid: 隊(duì)列關(guān)聯(lián)的Erlang 進(jìn)程的ID 。
- owner_pid: 處理排他隊(duì)列連接的Erlang 進(jìn)程D。如果此隊(duì)列是非排他的,此值將為空。
- exclusive: 隊(duì)列是否是排他的。
- exclusive_consumer_pid: 訂閱到此排他隊(duì)列的消費(fèi)者相關(guān)的信道關(guān)聯(lián)的Erlang進(jìn)程ID 。如果此隊(duì)列是非排他的,此值將為空。
- exclusive_consumer_tag : 訂閱到此排他隊(duì)列的消費(fèi)者的consumerTag 。如果此隊(duì)列是非排他的,此值將為空。
- messages_ready: 準(zhǔn)備發(fā)送給客戶端的消息個(gè)數(shù)。
- messages_unacknowledged: 發(fā)送給客戶端但尚未應(yīng)答的消息個(gè)數(shù)。
- messages: 準(zhǔn)備發(fā)送給客戶端和未應(yīng)答消息的總和。
- messages_ready_ram: 駐留在內(nèi)存中messages_ready 的消息個(gè)數(shù)。
- messages_unacknowledged_ram: 駐留在內(nèi)存中messages_unac_knowledged的消息個(gè)數(shù)。
- messages_ram : 駐留在內(nèi)存中的消息總數(shù)。
- messages_persistent : 隊(duì)列中持久化消息的個(gè)數(shù)。對(duì)于非持久化隊(duì)列來說總是0 。
- messages_bytes: 隊(duì)列中所有消息的大小總和。這里不包括消息屬性或者任何其他開銷
- messages_bytes_ready: 準(zhǔn)備發(fā)送給客戶端的消息的大小總和。
- messages_bytes_unacknowledged: 發(fā)送給客戶端但尚未應(yīng)答的消息的大小總和。
- messages_bytes_ram: 駐留在內(nèi)存中的messages_bytes 。
- messages_bytes_persistent: 隊(duì)列中持久化的messages_bytes 。
- disk_reads: 從隊(duì)列啟動(dòng)開始,己從磁盤中讀取該隊(duì)列的消息總次數(shù)。
- disk_writes: 從隊(duì)列啟動(dòng)開始,己向磁盤隊(duì)列寫消息的總次數(shù)。
- consumer: 消費(fèi)者數(shù)目。
- consumer_utilisation: 隊(duì)列中的消息能夠立刻投遞給消費(fèi)者的比率,介于0 和1之間。這個(gè)受網(wǎng)絡(luò)擁塞或者Basic.Qos 的影響而小于1 。
- memory: 與隊(duì)列相關(guān)的Erlang 進(jìn)程所消耗的內(nèi)存字節(jié)數(shù),包括棧、堆及內(nèi)部結(jié)構(gòu)。
- slave_pids: 如果隊(duì)列是鏡像的,列出所有slave 鏡像的pid 。
- synchronised_slave_pids: 如果隊(duì)列是鏡像的,列出所有己經(jīng)同步的slave 鏡像的pid 。
- state : 隊(duì)列狀態(tài)。正常情況下是running : 如果隊(duì)列正常同步數(shù)據(jù)可能會(huì)有"{syncing, MsgCount}" 的狀態(tài);如果隊(duì)列所在的節(jié)點(diǎn)掉線了,則隊(duì)列顯示狀態(tài)為down (此時(shí)大多數(shù)的queueinfoitems 也將不可用〉。
????????如果沒有指定queueinfoitems ,那么此命令將顯示隊(duì)列的名稱和消息的個(gè)數(shù)。相關(guān)示例如下:
[root@myblnp ~]# rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name messages
queue.normal 0
myAe_test 0
queue_demo 0
queue.dlx 1
queue.priority 1
[root@myblnp ~]# rabbitmqctl list_queues name
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name
queue.normal
myAe_test
queue_demo
queue.dlx
queue.priority
[root@myblnp ~]# rabbitmqctl list_queues name,durable
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name durable
queue.normal true
myAe_test true
queue_demo true
queue.dlx true
queue.priority true
[root@myblnp ~]# rabbitmqctl list_queues name,durable,arguments
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name durable arguments
queue.normal true [{"x-dead-letter-exchange","exchange.dlx"},{"x-message-ttl",10000},{"x-dead-letter-routing-key","routingkey"}]
myAe_test true [{"x-queue-type","classic"}]
queue_demo true []
queue.dlx true []
queue.priority true [{"x-max-priority",10}]
[root@myblnp ~]# rabbitmqctl list_queues name,durable,policy
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name durable policy
queue.normal true
myAe_test true
queue_demo true
queue.dlx true
queue.priority true
[root@myblnp ~]# rabbitmqctl list_queues name,durable,policy,pid
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name durable policy pid
queue.normal true <rabbit@myblnp.2.1347.0>
myAe_test true <rabbit@myblnp.2.1350.0>
queue_demo true <rabbit@myblnp.2.1353.0>
queue.dlx true <rabbit@myblnp.2.1356.0>
queue.priority true <rabbit@myblnp.2.1359.0>
[root@myblnp ~]# rabbitmqctl list_queues name,durable,policy,pid,owner_pid
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name durable policy pid owner_pid
queue.normal true <rabbit@myblnp.2.1347.0>
myAe_test true <rabbit@myblnp.2.1350.0>
queue_demo true <rabbit@myblnp.2.1353.0>
queue.dlx true <rabbit@myblnp.2.1356.0>
queue.priority true <rabbit@myblnp.2.1359.0>
[root@myblnp ~]#
1.5.2、rabbitmqctl list_exchanges
完整命令:rabbitmqctl list_exchanges [-p vhost] [exchangeinfoitem ...]
????????返回交換器的詳細(xì)細(xì)節(jié),如果無[ - p vhost]?參數(shù),將顯示默認(rèn)的vhost 為 "/ " 中的交換器詳情。exchangeinfoitem 參數(shù)用于指示哪些信息項(xiàng)會(huì)包含在結(jié)果集中,結(jié)果集的列順序?qū)⑵ヅ鋮?shù)的順序。exchangeinfoitem 可以是下面列表中的任何值。
- name: 交換器的名稱。
- type: 交換器的類型。
- durable : 設(shè)置是否持久化。durable 設(shè)置為true 表示持久化,反之是非持久化。持久化可以將交換器信息存盤, 而在服務(wù)器重啟的時(shí)候不會(huì)丟失相關(guān)信息。
- auto_delete : 設(shè)直是否自動(dòng)刪除。
- internal : 是否是內(nèi)置的。
- arguments : 其他一些結(jié)構(gòu)化參數(shù),比如alternate-exchange 。
- policy : 應(yīng)用到交換器上的策略名稱。
????????exchangeinfoitem 的內(nèi)容和客戶端中的channel.exchangeDeclare 方法的參數(shù)基本一致。如果沒有指定exchangeinfoitem. 那么此命令將顯示交換器的名稱和類型。相關(guān)示例如下:
[root@myblnp ~]# rabbitmqctl list_exchanges
Listing exchanges for vhost / ...
name type
myAE fanout
amq.match headers
exchange_demo directdirect
exchange.priority fanout
amq.rabbitmq.trace topic
exchange.dlx direct
amq.topic topic
amq.fanout fanout
exchange.normal fanout
amq.direct direct
amq.headers headers
[root@myblnp ~]# rabbitmqctl list_exchanges name type durable auto_delete internal arguments policy -q
name type durable auto_delete internal arguments policy
myAE fanout true false false []
amq.match headers true false false []
exchange_demo direct true false false [] AE2direct true false false []
exchange.priority fanout true false false []
amq.rabbitmq.trace topic true false true []
exchange.dlx direct true false false []
amq.topic topic true false false []
amq.fanout fanout true false false []
exchange.normal fanout true false false []
amq.direct direct true false false []
amq.headers headers true false false []
[root@myblnp ~]#
1.5.3、rabbitmqctl list_bindings
完整命令:rabbitmqctl list_bindings [-p vhost] [bindinginfoitem ...]
????????返回綁定關(guān)系的細(xì)節(jié), 如果無[-p vhost] 參數(shù), 將顯示默認(rèn)的vhost 為"/"中的綁定關(guān)系詳情。bindinginfoitem 參數(shù)用于指示哪些信息項(xiàng)會(huì)包含在結(jié)果集中,結(jié)果集的列順序?qū)⑵ヅ鋮?shù)的順序。bindinginfoitem 可以是下面列表中的任何值。
- source_name: 綁定中消息來源的名稱。
- source_kind: 綁定中消息來源的類別。
- destination_name: 綁定中消息目的地的名稱。
- destination_kind: 綁定中消息目的地的種類。
- routing_key: 綁定的路由鍵。
- arguments: 綁定的參數(shù)。
????????如果沒有指定bindinginfoitem,那么將顯示所有的條目。相關(guān)示例如下:
[root@myblnp ~]# rabbitmqctl list_bindings -q
source_name source_kind destination_name destination_kind routing_key argumentsexchange queue.normal queue queue.normal []exchange myAe_test queue myAe_test []exchange queue_demo queue queue_demo []exchange queue.dlx queue queue.dlx []exchange queue.priority queue queue.priority []
exchange.dlx exchange queue.dlx queue routingkey []
exchange.normal exchange queue.normal queue []
exchange.priority exchange queue.priority queue routingkey []
exchange_demo exchange queue_demo queue routingKey_demo []
myAE exchange myAe_test queue []
[root@myblnp ~]#
1.5.4、rabbìtmqctl lìst_connectìons
完整命令:rabbìtmqctl lìst_connectìons [connectìonìnfoìtem ...]
????????返回TCP/IP連接的統(tǒng)計(jì)信息。connectioninfoitem 參數(shù)用于指示哪些信息項(xiàng)會(huì)包含在結(jié)果集中,結(jié)果集的列順序?qū)⑵ヅ鋮?shù)的順序。connectioninfoitem 可以是下面列表中的任何值。
- pid: 與連接相關(guān)的Erlang 進(jìn)程ID 。
- name: 連接的名稱。
- port: 服務(wù)器端口。
- host: 返回反向DNS 獲取的服務(wù)器主機(jī)名稱,或者IP 地址,或者未啟用。
- peer_port: 服務(wù)器對(duì)端端口。當(dāng)一個(gè)客戶端與服務(wù)器連接時(shí),這個(gè)客戶端的端口就是peer_port 。
- peer_host: 返回反向DNS 獲取的對(duì)端主機(jī)名稱,或者IP?地址,或者未啟用。
- ssl: 是否啟用SSL 。
- ssl_protoco1: SSL 協(xié)議,如tlsvl 。
- ssl_key_exchange: SSL 密鑰交換算法,如rsa 。
- ssl_cipher: SSL 加密算法,如aes_256_cbc 。
- ssl_hash: SSL 哈希算法,如sha
- peer_cert_subject: 對(duì)端的SSL 安全證書的主題,基于RFC4514 的形式。
- peer_cert_issuer: 對(duì)端SSL 安全證書的發(fā)行者, 基于RFC4514 的形式。
- peer_cert_validity: 對(duì)端SSL 安全證書的有效期。
- state: 連接狀態(tài),包括starting 、tuning 、opening、running 、flow 、blocking 、blocked 、closing 和closed 這幾種。
- channels: 該連接中的信道個(gè)數(shù)。
- protocol: 使用的AMQP 協(xié)議的版本,當(dāng)前是{0,9 , 1} 或者{0, 8 ,0} 。注意,如果客戶端請(qǐng)求的是AMQP 0-9 的連接, RabbitMQ 也會(huì)將其視為0-9-1。
- auth_mechanism: 使用的SASL 認(rèn)證機(jī)制,如PLAIN 、AMQPLAIN 、EXTERNAL 、RABBIT-CR-DEMO 等。
- user: 與連接相關(guān)的用戶名。
- vhost: 與連接相關(guān)的vhost 的名稱。
- timeout: 連接超時(shí)/協(xié)商的心跳間隔,單位為秒。
- frame_max: 最大傳輸幀的大小,單位為B 。
- channel_max: 此連接上信道的最大數(shù)量。如果值0 ,則表示無上限,但客戶端一般會(huì)將0 轉(zhuǎn)變?yōu)?5535 。
- client_properties: 在建立連接期間由客戶端發(fā)送的信息屬性。
- recv_oct: 收到的字節(jié)數(shù)。
- recv_cnt: 收到的數(shù)據(jù)包個(gè)數(shù)。
- send_oct: 發(fā)送的字節(jié)數(shù)。
- send_cnt : 發(fā)送的數(shù)據(jù)包個(gè)數(shù)。
- send_pend: 發(fā)送隊(duì)列大小。
- connected_at : 連接建立的時(shí)間戳。
????????如果沒有指定connectioninfoitem , 那么會(huì)顯示user 、peer_host 、peer_port和state 這幾項(xiàng)信息。相關(guān)示例如下:
[root@myblnp ~]# rabbitmqctl list_connections
Listing connections ...
user peer_host peer_port state
admin 192.168.56.1 50077 running
[root@myblnp ~]# rabbitmqctl list_connections pid,name,host,recv_cnt,channel_max
Listing connections ...
pid name host recv_cnt channel_max
<rabbit@myblnp.2.7093.0> 192.168.56.1:50077 -> 192.168.56.106:5672 192.168.56.106 9 2047
[root@myblnp ~]#
1.5.5、rabbitmqctl list_ channels
完整命令:rabbitmqctl list_ channels [channelinfoitem ...]
????????返回當(dāng)前所有信道的信息。channelinfoitem 參數(shù)用于指示哪些信息項(xiàng)會(huì)包含在結(jié)果集中,結(jié)果集的列順序?qū)⑵ヅ鋮?shù)的順序。channelinfoitem 可以是下面列表中的任何值。
- pid: 與連接相關(guān)的Erlang 進(jìn)程ID 。
- connection : 信道所屬連接的Erlang 進(jìn)程ID 。
- name : 信道的名稱。
- number: 信道的序號(hào)。
- user: 與信道相關(guān)的用戶名稱。
- vhost : 與信道相關(guān)的vhost
- transactional: 信道是否處于事務(wù)模式。
- confirm : 信道是否處于publisher confirm 模式。
- consumer_count : 信道中的消費(fèi)者的個(gè)數(shù)。
- messages_unacknowledged: 己投遞但是還未被ack 的消息個(gè)數(shù)。
- messages_uncommitted : 己接收但是還未提交事務(wù)的消息個(gè)數(shù)。
- acks_uncommitted : 己ack 收到但是還未提交事務(wù)的消息個(gè)數(shù)。
- messages_unconfirmed : 己發(fā)送但是還未確認(rèn)的消息個(gè)數(shù)。如果信道不處于publisher confmn 模式下,則此值為0 。
- perfetch_count : 新消費(fèi)者的Qos 個(gè)數(shù)限制。0 表示無上限。
- global_prefetch_count: 整個(gè)信道的Qos 個(gè)數(shù)限制。0 表示無上限。
????????如果沒有指定channelinfoitem ,那么會(huì)顯示pid 、user 、consumer count 和messages unacknowledged 這幾項(xiàng)信息。相關(guān)示例如下:
[root@myblnp ~]# rabbitmqctl list_channels
Listing channels ...
pid user consumer_count messages_unacknowledged
<rabbit@myblnp.2.7102.0> admin 1 0
[root@myblnp ~]# rabbitmqctl list_channels user,transactional,confirm,consumer_count
Listing channels ...
user transactional confirm consumer_count
admin false false 1
[root@myblnp ~]#
1.5.6、rabbitmqctl list_consumers
完整命令:rabbitmqctl list_consumers [-p vhost]
????????列舉消費(fèi)者信息。每行將顯示由制表符分隔的己訂閱隊(duì)列的名稱、相關(guān)信道的進(jìn)程標(biāo)識(shí)、consumerTag 、是否需要消費(fèi)端確認(rèn)、prefetch_ count 及參數(shù)列表這些信息。相關(guān)示例如下:
[root@myblnp ~]# rabbitmqctl list_consumers
Listing consumers in vhost / ...
queue_name channel_pid consumer_tag ack_required prefetch_count active arguments
amq.gen-YkY491597YmmGfe0WEIxdw <rabbit@myblnp.2.7102.0> amq.ctag-1Zw0NLMwNGA-VeEmsDAE6g false 0 true []
[root@myblnp ~]#
1.5.7、rabbitmqctl status
????????顯示Broker 的狀態(tài), 比如當(dāng)前Erlang 節(jié)點(diǎn)上運(yùn)行的應(yīng)用程序、RabbitMQ/Erlang 的版本信息、os 的名稱、內(nèi)存及文件描述符等統(tǒng)計(jì)信息。
[root@myblnp ~]# rabbitmqctl status
Status of node rabbit@myblnp ...
RuntimeOS PID: 16483
OS: Linux
Uptime (seconds): 17986
Is under maintenance?: false
RabbitMQ version: 3.8.13
Node name: rabbit@myblnp
Erlang configuration: Erlang/OTP 22 [erts-10.7.2.5] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [hipe]
Erlang processes: 474 used, 1048576 limit
Scheduler run queue: 1
Cluster heartbeat timeout (net_ticktime): 60PluginsEnabled plugin file: /etc/rabbitmq/enabled_plugins
Enabled plugins:* rabbitmq_management* amqp_client* rabbitmq_web_dispatch* cowboy* cowlib* rabbitmq_management_agentData directoryNode data directory: /var/lib/rabbitmq/mnesia/rabbit@myblnp
Raft data directory: /var/lib/rabbitmq/mnesia/rabbit@myblnp/quorum/rabbit@myblnpConfig filesLog file(s)* /var/log/rabbitmq/rabbit@myblnp.log* /var/log/rabbitmq/rabbit@myblnp_upgrade.logAlarms(none)MemoryTotal memory used: 0.0878 gb
Calculation strategy: rss
Memory high watermark setting: 0.4 of available memory, computed to: 1.5893 gbcode: 0.0273 gb (30.59 %)
other_proc: 0.0238 gb (26.64 %)
allocated_unused: 0.016 gb (17.9 %)
other_system: 0.0133 gb (14.93 %)
other_ets: 0.0033 gb (3.74 %)
plugins: 0.0019 gb (2.1 %)
atom: 0.0016 gb (1.76 %)
binary: 0.0009 gb (0.98 %)
mgmt_db: 0.0003 gb (0.39 %)
queue_procs: 0.0003 gb (0.28 %)
metrics: 0.0003 gb (0.28 %)
mnesia: 0.0001 gb (0.13 %)
connection_other: 0.0001 gb (0.12 %)
msg_index: 0.0001 gb (0.07 %)
quorum_ets: 0.0 gb (0.05 %)
connection_readers: 0.0 gb (0.03 %)
connection_channels: 0.0 gb (0.01 %)
connection_writers: 0.0 gb (0.0 %)
queue_slave_procs: 0.0 gb (0.0 %)
quorum_queue_procs: 0.0 gb (0.0 %)
reserved_unallocated: 0.0 gb (0.0 %)File DescriptorsTotal: 8, limit: 32671
Sockets: 1, limit: 29401Free Disk SpaceLow free disk space watermark: 0.05 gb
Free disk space: 0.1821 gbTotalsConnection count: 1
Queue count: 6
Virtual host count: 2ListenersInterface: [::], port: 15672, protocol: http, purpose: HTTP API
Interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
[root@myblnp ~]#
1.5.8、rabbitmqctl node_health_check
????????對(duì)RabbitMQ 節(jié)點(diǎn)進(jìn)行健康檢查, 確認(rèn)應(yīng)用是否正常運(yùn)行、list_queues 和list_channels是否能夠正常返回等。相關(guān)示例如下:
[root@myblnp ~]# rabbitmqctl node_health_check
This command is DEPRECATED and will be removed in a future version.
It performs intrusive, opinionated health checks and requires a fully booted node.
Use one of the options covered in https://www.rabbitmq.com/monitoring.html#health-checks instead.
Timeout: 70 seconds ...
Checking health of node rabbit@myblnp ...
Health check passed
[root@myblnp ~]#
1.5.9、rabbitmqctl environment
????????顯示每個(gè)運(yùn)行程序環(huán)境中每個(gè)變量的名稱和值。
[root@myblnp ~]# rabbitmqctl environment
Application environment of node rabbit@myblnp ...
[{amqp_client,[{prefer_ipv6,false},{ssl_options,[]},{writer_gc_threshold,1000000000}]},{asn1,[]},{aten,[{detection_threshold,0.99},{heartbeat_interval,100},{poll_interval,5000},{scaling_factor,1.5}]},{compiler,[]},{cowboy,[]},{cowlib,[]},{credentials_obfuscation,[{enabled,true}]},{crypto,[{fips_mode,false},{rand_cache_size,896}]},{cuttlefish,[]},{gen_batch_server,[]},{goldrush,[]},{inets,[]},{jsx,[]},{kernel,[{inet_default_connect_options,[{nodelay,true}]},{inet_dist_listen_max,25672},{inet_dist_listen_min,25672},{logger,[{handler,default,logger_std_h,#{config => #{type => standard_io},formatter =>{logger_formatter,#{legacy_header => true,single_line => false}}}}]},{logger_level,notice},{logger_sasl_compatible,false},{shutdown_func,{rabbit_prelaunch,shutdown_func}}]},{lager,[{async_threshold,20},{async_threshold_window,5},{colored,false},{colors,[{debug,"\e[0;38m"},{info,"\e[1;37m"},{notice,"\e[1;36m"},{warning,"\e[1;33m"},{error,"\e[1;31m"},{critical,"\e[1;35m"},{alert,"\e[1;44m"},{emergency,"\e[1;41m"}]},{crash_log,"log/crash.log"},{crash_log_count,5},{crash_log_date,"$D0"},{crash_log_msg_size,65536},{crash_log_rotator,lager_rotator_default},{crash_log_size,10485760},{error_logger_format_raw,true},{error_logger_hwm,500000},{error_logger_hwm_original,5000},{error_logger_redirect,true},{extra_sinks,[{rabbit_log_upgrade_lager_event,[{handlers,[{lager_file_backend,[{date,[]},{file,"/var/log/rabbitmq/rabbit@myblnp_upgrade.log"},{formatter_config,[date," ",time," ",color,"[",severity,"] ",{pid,[]}," ",message,"\n"]},{level,info},{size,0}]}]},{rabbit_handlers,[{lager_file_backend,[{date,[]},{file,"/var/log/rabbitmq/rabbit@myblnp_upgrade.log"},{formatter_config,[date," ",time," ",color,"[",severity,"] ",{pid,[]}," ",message,"\n"]},{level,info},{size,0}]}]}]},{rabbit_log_shovel_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},{rabbit_handlers,[{lager_forwarder_backend,[lager_event,info]}]}]},{rabbit_log_ra_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},{rabbit_handlers,[{lager_forwarder_backend,[lager_event,info]}]}]},{rabbit_log_queue_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},{rabbit_handlers,[{lager_forwarder_backend,[lager_event,info]}]}]},{rabbit_log_prelaunch_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},{rabbit_handlers,[{lager_forwarder_backend,[lager_event,info]}]}]},{rabbit_log_mirroring_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},{rabbit_handlers,[{lager_forwarder_backend,[lager_event,info]}]}]},{rabbit_log_ldap_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},{rabbit_handlers,[{lager_forwarder_backend,[lager_event,info]}]}]},{rabbit_log_federation_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},{rabbit_handlers,[{lager_forwarder_backend,[lager_event,info]}]}]},{rabbit_log_feature_flags_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},{rabbit_handlers,[{lager_forwarder_backend,[lager_event,info]}]}]},{rabbit_log_connection_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},{rabbit_handlers,[{lager_forwarder_backend,[lager_event,info]}]}]},{rabbit_log_channel_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},{rabbit_handlers,[{lager_forwarder_backend,[lager_event,info]}]}]},{rabbit_log_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},{rabbit_handlers,[{lager_forwarder_backend,[lager_event,info]}]}]},{error_logger_lager_event,[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},{rabbit_handlers,[{lager_forwarder_backend,[lager_event,info]}]}]}]},{handlers,[{lager_file_backend,[{date,[]},{file,"/var/log/rabbitmq/rabbit@myblnp.log"},{formatter_config,[date," ",time," ",color,"[",severity,"] ",{pid,[]}," ",message,"\n"]},{level,debug},{size,0}]}]},{log_root,"/var/log/rabbitmq"},{rabbit_handlers,[{lager_file_backend,[{date,[]},{file,"/var/log/rabbitmq/rabbit@myblnp.log"},{formatter_config,[date," ",time," ",color,"[",severity,"] ",{pid,[]}," ",message,"\n"]},{level,debug},{size,0}]}]}]},{mnesia,[{dir,"/var/lib/rabbitmq/mnesia/rabbit@myblnp"}]},{observer_cli,[{plugins,[]},{scheduler_usage,disable}]},{os_mon,[{start_cpu_sup,false},{start_disksup,false},{start_memsup,false},{start_os_sup,false}]},{public_key,[]},{ra,[{data_dir,"/var/lib/rabbitmq/mnesia/rabbit@myblnp/quorum"},{logger_module,rabbit_log_ra_shim},{wal_max_batch_size,4096},{wal_max_size_bytes,536870912}]},{rabbit,[{auth_backends,[rabbit_auth_backend_internal]},{auth_mechanisms,['PLAIN','AMQPLAIN']},{autocluster,[{peer_discovery_backend,rabbit_peer_discovery_classic_config}]},{autoheal_state_transition_timeout,60000},{background_gc_enabled,false},{background_gc_target_interval,60000},{backing_queue_module,rabbit_priority_queue},{channel_max,2047},{channel_operation_timeout,15000},{channel_tick_interval,60000},{cluster_keepalive_interval,10000},{cluster_nodes,{[],disc}},{cluster_partition_handling,ignore},{collect_statistics,fine},{collect_statistics_interval,5000},{config_entry_decoder,[{passphrase,undefined}]},{connection_max,infinity},{credit_flow_default_credit,{400,200}},{default_consumer_prefetch,{false,0}},{default_permissions,[<<".*">>,<<".*">>,<<".*">>]},{default_user,<<"guest">>},{default_user_tags,[administrator]},{default_vhost,<<"/">>},{delegate_count,16},{disk_free_limit,50000000},{disk_monitor_failure_retries,10},{disk_monitor_failure_retry_interval,120000},{enabled_plugins_file,"/etc/rabbitmq/enabled_plugins"},{feature_flags_file,"/var/lib/rabbitmq/mnesia/rabbit@myblnp-feature_flags"},{fhc_read_buffering,false},{fhc_write_buffering,true},{frame_max,131072},{halt_on_upgrade_failure,true},{handshake_timeout,10000},{heartbeat,60},{lager_default_file,"/var/log/rabbitmq/rabbit@myblnp.log"},{lager_log_root,"/var/log/rabbitmq"},{lager_upgrade_file,"/var/log/rabbitmq/rabbit@myblnp_upgrade.log"},{lazy_queue_explicit_gc_run_operation_threshold,1000},{log,[{file,[{file,"/var/log/rabbitmq/rabbit@myblnp.log"}]},{categories,[{upgrade,[{file,"/var/log/rabbitmq/rabbit@myblnp_upgrade.log"}]}]}]},{loopback_users,[<<"guest">>]},{max_message_size,134217728},{memory_monitor_interval,2500},{mirroring_flow_control,true},{mirroring_sync_batch_size,4096},{mnesia_table_loading_retry_limit,10},{mnesia_table_loading_retry_timeout,30000},{msg_store_credit_disc_bound,{4000,800}},{msg_store_file_size_limit,16777216},{msg_store_index_module,rabbit_msg_store_ets_index},{msg_store_io_batch_size,4096},{msg_store_shutdown_timeout,600000},{num_ssl_acceptors,10},{num_tcp_acceptors,10},{password_hashing_module,rabbit_password_hashing_sha256},{plugins_dir,"/usr/lib/rabbitmq/plugins:/usr/lib/rabbitmq/lib/rabbitmq_server-3.8.13/plugins"},{plugins_expand_dir,"/var/lib/rabbitmq/mnesia/rabbit@myblnp-plugins-expand"},{proxy_protocol,false},{queue_explicit_gc_run_operation_threshold,1000},{queue_index_embed_msgs_below,4096},{queue_index_max_journal_entries,32768},{quorum_cluster_size,3},{quorum_commands_soft_limit,32},{reverse_dns_lookups,false},{server_properties,[]},{ssl_allow_poodle_attack,false},{ssl_apps,[asn1,crypto,public_key,ssl]},{ssl_cert_login_from,distinguished_name},{ssl_handshake_timeout,5000},{ssl_listeners,[]},{ssl_options,[]},{tcp_listen_options,[{backlog,128},{nodelay,true},{linger,{true,0}},{exit_on_close,false}]},{tcp_listeners,[{"auto",5672}]},{trace_vhosts,[]},{track_auth_attempt_source,false},{tracking_execution_timeout,15000},{vhost_restart_strategy,continue},{vm_memory_calculation_strategy,rss},{vm_memory_high_watermark,0.4},{vm_memory_high_watermark_paging_ratio,0.5},{writer_gc_threshold,1000000000}]},{rabbit_common,[]},{rabbitmq_management,[{content_security_policy,"script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'"},{cors_allow_origins,[]},{cors_max_age,1800},{http_log_dir,none},{load_definitions,none},{management_db_cache_multiplier,5},{process_stats_gc_timeout,300000},{stats_event_max_backlog,250}]},{rabbitmq_management_agent,[{rates_mode,basic},{sample_retention_policies,[{global,[{605,5},{3660,60},{29400,600},{86400,1800}]},{basic,[{605,5},{3600,60}]},{detailed,[{605,5}]}]}]},{rabbitmq_prelaunch,[]},{rabbitmq_web_dispatch,[]},{ranch,[]},{recon,[]},{sasl,[{errlog_type,error},{sasl_error_logger,false}]},{ssl,[]},{stdlib,[]},{stdout_formatter,[]},{syntax_tools,[]},{sysmon_handler,[{busy_dist_port,true},{busy_port,false},{gc_ms_limit,0},{heap_word_limit,0},{port_limit,100},{process_limit,100},{schedule_ms_limit,0}]},{tools,[{file_util_search_methods,[{[],[]},{"ebin","esrc"},{"ebin","src"}]}]},{xmerl,[]}]
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl environment --formatter=json
1.5.10、rabbitmqctl report
????????為所有服務(wù)器狀態(tài)生成一個(gè)服務(wù)器狀態(tài)報(bào)告,井將輸出重定向到一個(gè)文件。相關(guān)示例如下:
[root@myblnp ~]# rabbitmqctl report > report.txt
[root@myblnp ~]# ls
anaconda-ks.cfg arthas logs mayfly report.txt rubbish soft
[root@myblnp ~]# cat report.txt
Reporting server status of node rabbit@myblnp ...Status of node rabbit@myblnp ...
RuntimeOS PID: 16483
OS: Linux
Uptime (seconds): 19850
Is under maintenance?: false
RabbitMQ version: 3.8.13……exchange.normal exchange queue.normal queue []
exchange.priority exchange queue.priority queue routingkey []
exchange_demo exchange queue_demo queue routingKey_demo []
myAE exchange myAe_test queue []Listing permissions for vhost "/" ...
user configure write read
admin .* .* .*
guest .* .* .*Listing policies for vhost "/" ...
vhost name pattern apply-to definition priority
/ AE2 ^exchange_demo$ all {"alternate-exchange":"myAE"} 0Listing global runtime parameters ...
name value
cluster_name "myblnps"
internal_cluster_id "rabbitmq-cluster-id-jpA-C8h6S2NRi300jibXlQ"Listing runtime parameters for vhost "/" ...[root@myblnp ~]#
1.5.11、rabbitmqctl eval {expr}
????????執(zhí)行任意Erlang 表達(dá)式。相關(guān)示例如下(示例命令用于返回rabbitmqctl 連接的節(jié)點(diǎn)名稱) :
[root@myblnp ~]# rabbitmqctl eval 'node().'
rabbit@myblnp
[root@myblnp ~]#
1.6、eval 的擴(kuò)展
????????用戶、Parameter 、vhost、權(quán)限等都可以通過rabbitmqctl 工具來完成創(chuàng)建(或刪除)的操作,反觀交換器、隊(duì)列及綁定關(guān)系的創(chuàng)建(或刪除)操作并無相應(yīng)的rabbitmqctl 工具類的命令,到目前為止介紹的只有通過客戶端或者Web 管理界面來完成,這對(duì)于 CLI?的使用愛好者來說無疑是一種遺憾。
? ? ? ? 實(shí)際上可以通過?rabbitmqctl eval {expr} 以"曲線救國"的形式實(shí)現(xiàn)通過 rabbitmqctl 工具來創(chuàng)建交換器、隊(duì)列及綁定關(guān)系。執(zhí)行下面三條命令就可以創(chuàng)建一個(gè)交換器exchange2 、一個(gè)隊(duì)列queue2 并通過綁定鍵rk2進(jìn)行綁定。
#反饋錯(cuò)誤(創(chuàng)建交換機(jī))
[root@myblnp ~]# rabbitmqctl eval 'rabbit_exchange:declare({resource , << "/" >> , exchange , << "exchange2">>} , direct , true , false , false , []).'
Error:
{:undef, [{:rabbit_exchange, :declare, [{:resource, "/", :exchange, "exchange2"}, :direct, true, false, false, []], []}, {:erl_eval, :do_apply, 6, [file: 'erl_eval.erl', line: 680]}, {:rpc, :"-handle_call_call/6-fun-0-", 5, [file: 'rpc.erl', line: 197]}]}#正確示例(創(chuàng)建交換機(jī))
[root@myblnp ~]# rabbitmqctl eval 'rabbit_exchange:declare({resource , << "/" >> , exchange , << "exchange2">>} , direct , true , false , false , [],<<"admin">>).'
{exchange,{resource,<<"/">>,exchange,<<"exchange2">>},direct,true,false,false,[],undefined,undefined,undefined,{[],[]},#{user => <<"admin">>}}
[root@myblnp ~]#
上面的示例里,第一次執(zhí)行失敗了返回對(duì)應(yīng)的錯(cuò)誤信息。這是因?yàn)槲沂褂玫膔abbitmq版本是“3.8.13”版本,在低于3.7.0版本的使用這條命令是可以正常執(zhí)行的。高于這個(gè)版本需要添加參數(shù)【<<"admin">>】代理用戶,否則會(huì)出現(xiàn)上述錯(cuò)誤。
#創(chuàng)建隊(duì)列
[root@myblnp ~]# rabbitmqctl eval 'rabbit_amqqueue:declare({resource,<<"/">>,queue,<<"queue2">>},true,false,[],none,<<"admin">>).'
{new,{amqqueue,{resource,<<"/">>,queue,<<"queue2">>},true,false,none,[],<11270.9012.0>,[],[],[],undefined,undefined,[],[],live,0,[],<<"/">>,#{user => <<"admin">>},rabbit_classic_queue,#{}}}
[root@myblnp ~]# #綁定隊(duì)列到指定交換機(jī)并指定路由key
[root@myblnp ~]# rabbitmqctl eval 'rabbit_binding:add({binding,{resource,<<"/">>,exchange,<<"exchange2">>},<<"rk2">>,{resource,<<"/">>,queue,<<"queue2">>},[]},<<"admin">>).'
ok
[root@myblnp ~]#
????????其實(shí)這里是調(diào)用了Erlang 中對(duì)應(yīng)模塊的相應(yīng)函數(shù),語法類似"Module:Function(Arg) ."。對(duì)于交換器的創(chuàng)建,則調(diào)用了rabbit_exchange 模塊的declare 函數(shù), 該函數(shù)具體聲明為:
#尤為注意這個(gè)“.”,缺少了是不完整的并且無法執(zhí)行
declare(XName , Type , Durable , AutoDelete , Internal , Args) .
????????不同的RabbitMQ 版本參數(shù)會(huì)略有差異,比如高版本會(huì)多個(gè)Username 參數(shù),采用上面的定義可以在多個(gè)當(dāng)前主流版本中創(chuàng)建交換器。對(duì)應(yīng)的參數(shù)如下所述。
- XName : 交換器的命名細(xì)節(jié),具體格式為{resource , VHost , exchange , Name} 。VHost 為虛擬主機(jī)的名稱, Name 為交換器的名稱。注意VHost 和Name 需要以"<<>> "包裹,標(biāo)注為binary 類型。
- Type : 交換器的類型,可選值為direct 、headers 、topic 和fanout
- Durable : 是否需要持久化。
- AutoDelete : 是否自動(dòng)刪除。
- Internal: 是否是內(nèi)置的交換器。
- Args: 交換器的其他選項(xiàng)參數(shù), 一般設(shè)置為[]。
????????與創(chuàng)建交換器對(duì)應(yīng)的刪除操作為調(diào)用rabbit_exchange 模塊的delete 函數(shù),示例如下:
[root@myblnp ~]# rabbitmqctl eval 'rabbit_exchange:delete({resource,<<"/">>,exchange,<<"exchange2">>},false,<<"admin">>).'
ok
[root@myblnp ~]#
????????對(duì)于隊(duì)列的創(chuàng)建,則調(diào)用了rabbit_amqqueue 模塊的declare 函數(shù), 該函數(shù)具體聲明為:
declare(QueueName , Durable , AutoDelete , Args , Owner).
????????不同的RabbitMQ 版本參數(shù)會(huì)略有差異,比如高版本會(huì)多一個(gè)ActingUser 參數(shù),采用上面的定義可以在多個(gè)當(dāng)前主流版本中創(chuàng)建交換器。對(duì)應(yīng)的參數(shù)如下所述。
- QueueName : 隊(duì)列的命名細(xì)節(jié), 具體格式為{resource , VHost , queue , Name} 。VHost 為虛擬主機(jī)的名稱, Name 為交換器的名稱。注意VHost 和Name 需要以"<<>> "包裹,標(biāo)注為binary 類型。
- Durable: 是否需要持久化。
- AutoDelete : 是否自動(dòng)刪除。
- Args: 隊(duì)列的其他選項(xiàng)參數(shù), 一般設(shè)置為[] 。
- Owner : 用于隊(duì)列的獨(dú)占模式, 一般設(shè)置為none 。
????????與創(chuàng)建隊(duì)列對(duì)應(yīng)的刪除操作為調(diào)用rabbit_amqqueue 模塊的internal_delete 函數(shù),示例如下:
[root@myblnp ~]# rabbitmqctl eval 'rabbit_amqqueue:internal_delete({resource, <<"/">>,queue, <<"queue2">>},<<"admin">>).'
ok
[root@myblnp ~]#
????????與創(chuàng)建綁定關(guān)系對(duì)應(yīng)的解綁操作為調(diào)用rabbit_binding 模塊的remove 函數(shù), 示例如下:
rabbitmqctl eval 'rabbit_binding:remove({binding, {resource, <<"/">>,exchange, <<"exchange2">>},<<"rk2">>,{resource,<<"/">>,queue,<<"queue2">>},[],<<"admin">>}).'
ok
技巧:若要?jiǎng)h除所有的交換器、隊(duì)要IJ 及綁定關(guān)系,刪除對(duì)應(yīng)的vhost 就可以"一鍵搞定",而不需要一個(gè)個(gè)邊歷刪除。
1.7、HTTP API接口管理
????????RabbitMQ Management 插件不僅提供了Web 管理界面, 還提供了HTTPAPI 接口來方便調(diào)用。比如創(chuàng)建一個(gè)隊(duì)列,就可以通過PUT 方法調(diào)用/api/queues/vhost/{name} 接口來實(shí)現(xiàn)。下面的示例通過curl?命令調(diào)用接口來完成隊(duì)列queue 的創(chuàng)建:
[root@myblnp ~]# curl -i -u admin:admin@123 -H "content-type:application/json" -XPUT -d '{"auto_delete":false,"durable":true,"node":"rabbit@myblnp"}' http://192.168.56.106:15672/api/queues/%2F/queue
HTTP/1.1 201 Created
content-length: 0
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
date: Tue, 12 Sep 2023 09:29:22 GMT
server: Cowboy
vary: accept, accept-encoding, origin[root@myblnp ~]#
????????注意上面命令中的"%2F" 是指默認(rèn)的vhost,即" / ", 這類特殊字符在HTTPURL 中是需要轉(zhuǎn)義的。這里的curl?命令又為創(chuàng)建( 或刪除)交換器、隊(duì)列及綁定關(guān)系提供了另一種CLI的實(shí)現(xiàn)方式。所有的HTTPAPI 接口都需要HTTP 基礎(chǔ)認(rèn)證(使用標(biāo)準(zhǔn)的RabbitMQ 用戶數(shù)據(jù)庫),默認(rèn)的是guest/guest 。?非localhost 的不能使用這組認(rèn)證,除非特殊設(shè)置)。
????????這里的HTTPAPI 是完全基于RESTFUL 風(fēng)格的, 不同的HTTPAPI 接口所對(duì)應(yīng)的HTTP 方法各不相同, 這里一共涉及4 種HTTP 方法: GET, PUT 、DELETE 和POST。?GET 方法一般用來獲取如集群、節(jié)點(diǎn)、隊(duì)列、交換器等信息。PUT 方法用來創(chuàng)建資源, 如交換器、隊(duì)列之類的。DELETE 方法用來刪除資源。POST 方法也是用來創(chuàng)建資源的,與PUT 不同的是, POST 創(chuàng)建的是無法用具體名稱的資源。比如綁定關(guān)系C bindings) 和發(fā)布消息C publish ) 無法指定一個(gè)具體的名稱。下面示例展示了通過GET 方法來獲取之前創(chuàng)建的隊(duì)列queue 的信息:
[root@myblnp ~]# curl -i -u admin:admin@123 -XGET http://192.168.56.106:15672/api/queues/%2F/queue
HTTP/1.1 200 OK
cache-control: no-cache
content-length: 1406
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
content-type: application/json
date: Wed, 13 Sep 2023 08:34:30 GMT
server: Cowboy
vary: accept, accept-encoding, origin{"consumer_details":[],"arguments":{},"auto_delete":false,"backing_queue_status":{"avg_ack_egress_rate":0.0,"avg_ack_ingress_rate":0.0,"avg_egress_rate":0.0,"avg_ingress_rate":0.0,"delta":["delta","undefined",0,0,"undefined"],"len":0,"mode":"default","next_seq_id":0,"q1":0,"q2":0,"q3":0,"q4":0,"target_ram_count":"infinity"},"consumer_capacity":0,"consumer_utilisation":0,"consumers":0,"deliveries":[],"durable":true,"effective_policy_definition":{},"exclusive":false,"exclusive_consumer_tag":null,"garbage_collection":{"fullsweep_after":65535,"max_heap_size":0,"min_bin_vheap_size":46422,"min_heap_size":233,"minor_gcs":696},"head_message_timestamp":null,"idle_since":"2023-09-13 8:33:03","incoming":[],"memory":13204,"message_bytes":0,"message_bytes_paged_out":0,"message_bytes_persistent":0,"message_bytes_ram":0,"message_bytes_ready":0,"message_bytes_unacknowledged":0,"messages":0,"messages_details":{"rate":0.0},"messages_paged_out":0,"messages_persistent":0,"messages_ram":0,"messages_ready":0,"messages_ready_details":{"rate":0.0},"messages_ready_ram":0,"messages_unacknowledged":0,"messages_unacknowledged_details":{"rate":0.0},"messages_unacknowledged_ram":0,"name":"queue","node":"rabbit@myblnp","operator_policy":null,"policy":null,"recoverable_slaves":null,"reductions":856668,"reductions_details":{"rate":0.0},"single_active_consumer_tag":null,"state":"running","type":"classic","vhost":"/"}[root@myblnp ~]#
[root@myblnp ~]#
以下是關(guān)于RabbitMQ的所有http接口,以及接口的具體用途含義
GET | PUT | DELETE | POST | PATH & Description |
---|---|---|---|---|
? | /api/overview 描述整個(gè)系統(tǒng)的各種信息 | |||
? | ? | /api/cluster-name 集群的名稱 | ||
? | /api/nodes 集群中節(jié)點(diǎn)的信息 | |||
? | /api/nodes/name 集群中單個(gè)節(jié)點(diǎn)的信息 | |||
? | /api/extensions 管理插件的擴(kuò)展列表 | |||
? | ? | /api/definitions GET方法列出集群中所有的元數(shù)據(jù)信息,包括交換器、隊(duì)列、綁定關(guān)系、用戶、vhost、權(quán)限及參數(shù)。POST方法用來加載新的元數(shù)據(jù)信息,但是有以下注意事項(xiàng): (1)、新的元數(shù)據(jù)信息會(huì)與原本的合并,如果舊的元數(shù)據(jù)信息中某些項(xiàng)在新加載的元數(shù)據(jù)中沒有定義,則不受影響。 (2)、對(duì)于交換器、隊(duì)列及綁定關(guān)系等不可變的內(nèi)容,如果新舊元數(shù)據(jù)有沖突,則反饋錯(cuò)誤 (3)、對(duì)于其他可變的內(nèi)容,如果新舊元數(shù)據(jù)有沖突,則新的會(huì)替換舊的 (4)、如果在加載過程中發(fā)生錯(cuò)誤,加載過程會(huì)停止,最終只能加載到那部分新的元數(shù)據(jù)信息 | ||
? | ? | /api/definitions/{vhost} 將【/api/definitions】接口的數(shù)據(jù)細(xì)化到 vhost 級(jí)別 | ||
? | /api/connections 所有的連接信息 | |||
? | ? | /api/connections/{name} GET:方法可以列出指定連接的信息 DELETE:方法可以 close 指定的連接 | ||
? | /api/connections/{name}/channels 指定連接的所有信道消息 | |||
? | /api/channels 所有信息的信息 | |||
? | /api/vhosts/{vhost}/channels 查看指定 vhost 中的所有信道信息 | |||
? | /api/channels/{channel} 查看指定信道的信息 | |||
? | /api/consumers 查看所有的消費(fèi)者信息 | |||
? | /api/consumers/{vhost} 查看指定 vhost 的所有消費(fèi)者 | |||
? | /api/exchanges 查看所有的交換器信息 | |||
? | /api/exchanges/{vhost} 查看指定 vhost 的所有交換器信息 | |||
? | ? | ? | /api/exchanges/{vhost}/{name} GET:方法列出一個(gè)指定交換器的信息 PUT:可以聲明一個(gè)新的交換器,對(duì)應(yīng)的內(nèi)容可以參考如下:{"type": "direct","auto_delete": false,"internal": false,"durable": true,"arguments": {}} 其中type是必須的,其他是可選的。 DELETE:方法可以刪除指定的交換器,其中可以加入 if-unused=true 參數(shù)用來防止有隊(duì)列與其綁定時(shí)能夠被刪除 | |
? | /api/exchanges/vhost/{name}/bindings/source 列出指定交換器的所有綁定關(guān)系,此交換器需為綁定關(guān)系的源端 | |||
? | /api/exchanges/vhost/{name}/bindings/destination 列出指定交換器的所有綁定關(guān)系,此交換器需為綁定關(guān)系的目的端 | |||
? | /api/exchanges/vhost/{name}/publish 向指定的交換器中發(fā)生一條消息,對(duì)應(yīng)的內(nèi)容可以參考:{"properties": {},"routing_key": "myKey","payload": "myBody","payload_encoding": "string"} 這里面的所有參數(shù)項(xiàng)都是必填的,如果發(fā)生成功則會(huì)返回:{"routed": true} 這個(gè)接口不適合做穩(wěn)定、高效的發(fā)送使用,可以采用其他的方式比如通過 AMQP 協(xié)議或者其他長連接的協(xié)議 | |||
? | /api/queues 列出所有的隊(duì)列信息 | |||
? | /api/queues/{vhost} 列出指定 vhost 下的所有隊(duì)列信息 | |||
? | ? | ? | /api/queues/{vhost}/{name} GET:方法列出執(zhí)行的隊(duì)列信息 PUT:可以聲明一個(gè)隊(duì)列,對(duì)應(yīng)的內(nèi)容可以參考:{"auto_delete": false,"durable": true,"arguments": {},"node": "rabbit@myblnp"} 這里的所有參數(shù)都是可選的 DELETE:可以用來刪除一個(gè)隊(duì)列,當(dāng)然還可以指定 if-empty=true 或者 if-unused=true 等參數(shù) | |
? | /api/queues/{vhost}/{name}/bindings 列出指定交換器下指定隊(duì)列的所有綁定關(guān)系 | |||
? | /api/queues/{vhost}/{name}/contents 清空(purge)指定的隊(duì)列 | |||
? | /api/queues/{vhost}/{name}/actions 對(duì)指定的隊(duì)列附加一些動(dòng)作,對(duì)應(yīng)的內(nèi)容可參考:{"action": "sync"} 目前僅支持 sync 和 cancel_sync | |||
? | /api/queues/{vhost}/{name}/get 從指定的隊(duì)列中獲取消息,對(duì)應(yīng)的內(nèi)容參數(shù)可參考:{"count": 5,"requeue": true,"encoding": "auto","truncate": 50000} count:表示最大能獲取的消息個(gè)數(shù),實(shí)際可能小于這個(gè)數(shù);requeue:表示獲取到這些消息時(shí)是否從隊(duì)列中刪除,如果 requeue 為 true,則消息不會(huì)刪除,但是消息的 redelivered 標(biāo)識(shí)會(huì)被設(shè)置;ecoding:表示編碼格式,有兩種取值,分別是 auto 和 base64,auto 指如果消息符合 UTF-8 格式則返回 string類型,否則為 base64類型;truncate:表示如果消息的payload超過指定大小則會(huì)被截?cái)?。使用該接口時(shí),除了 trucate 參數(shù),其他的都是必填的 | |||
? | /api/bindings 列出所有的綁定關(guān)系 | |||
? | /api/bindings/{vhost} 列出指定交換器下的所有綁定關(guān)系信息 | |||
? | ? | /api/bindings/{vhost}/e/{exchange}/q/{name} GET:列出一個(gè)指定交換器和指定隊(duì)列的所有綁定關(guān)系信息 POST:用來添加綁定關(guān)系,對(duì)應(yīng)的請(qǐng)求參數(shù)為:{"routing_key": "my_rout","arguments": {}} 這里的參數(shù)都是可選的 | ||
? | ? | /api/bindings/{vhost}/e/{exchange}/q/{name}/{props} GET:列出一個(gè)交換器和隊(duì)列的單獨(dú)的綁定關(guān)系信息 DELETE:用來解綁相應(yīng)的綁定關(guān)系信息,其中 props 表示的是 /api/bindings 返回的綁定關(guān)系列表里的 properties_key 值,具體是指綁定時(shí) routingkey 和 arguments 的哈希值的組合,一般 arguments 為空,此時(shí) properties_key 等于 routingkey | ||
? | ? | /api/bindings/{vhost}/e/{sourceExchange}/e/{destExchange} GET:用來列出兩個(gè)交換器的所有綁定關(guān)系信息 POST:用來添加綁定關(guān)系 | ||
? | ? | /api/bindings/{vhost}/e/{sourceExchange}/e/{destExchange}/{props} 與接口 /api/bindings/{vhost}/e/{exchange}/q/{name}/{props} 相似,只是查詢的是兩個(gè)交換器之間的綁定關(guān)系 | ||
? | /api/vhosts 列出所有的 vhost 信息 | |||
? | ? | ? | /api/vhosts/{name} GET:列出指定 vhost 的信息 PUT:用來添加一個(gè) vhost ,host 通常只有一個(gè)名字,所以不需要任何其他參數(shù) DELETE:則是用來刪除指定的 vhost | |
? | /api/vhosts/{name}/permissions 列出指定 vhost 的所有權(quán)限信息 | |||
? | /api/users 列出所有的用戶信息 | |||
? | ? | ? | /api/users/{name} GET:列出指定用戶的信息 POST:用來添加一個(gè)用戶,對(duì)應(yīng)的請(qǐng)求參數(shù)是:{"password": "pwd","tags": "administrator"} 或者 {password_hash": "2ewtgd5hdryry5ryftu=","tags": "administrators"} 其中 tags 是必須的參數(shù),用來標(biāo)識(shí)當(dāng)前用戶的角色。對(duì)于密碼字段,可以二選一的方式。如果密碼字段設(shè)置為:password_hash 為 "" 則表示用戶可以無密碼登錄 DELETE:用來刪除指定的用戶 | |
? | /api/users/{user}/permissions 用來獲取指定用戶的所有權(quán)限 | |||
? | /api/whoami 顯示當(dāng)前的登錄用戶 | |||
? | /api/permissions 列出所有用戶的所有權(quán)限 | |||
? | ? | ? | /api/permissions/{vhost}/{user} GET:列出指定用戶的權(quán)限 PUT:添加指定的權(quán)限,對(duì)應(yīng)請(qǐng)求參數(shù)是:{"configure": ".","write": ".","read": ".*"} 所有參數(shù)都是必填的 DELETE:刪除指定用戶的權(quán)限 | |
? | /api/parameters 列出所有 vhost 級(jí)別的 Parameter。 | |||
? | /api/parameters/component 列出指定的組件,比如 federation-upstream、shovel 等的所有 vhost 級(jí)別的 Parameter | |||
? | ? | ? | /api/parameters/component/{vhost}/{name} GET:列出一個(gè)指定的 vhost 級(jí)別的Parameter PUT:設(shè)置一個(gè) Parameter ,對(duì)應(yīng)的內(nèi)容參數(shù)為:{"vhost": "/","component": "federation","name": "local_username","value": "guest"} DELETE:用來刪除指定的 vhost 級(jí)別的 Parameter | |
? | /api/global-parameters 列出所有 global 級(jí)別的Parameter | |||
? | ? | ? | /api/global-parameters/{name} GET:列出一個(gè)指定的 global 級(jí)別的Parameter PUT:用來新增一個(gè) global 級(jí)別的 Parameter,對(duì)應(yīng)請(qǐng)求參數(shù)為:{"name": "user_vhost","valuse": {"guest": "/", "rabbit": "warren"}} DELETE:用來刪除一個(gè)指定的 global 級(jí)別的parameter | |
? | /api/policies 列出所有的policy | |||
? | /api/policies/{vhost} 列出指定vhost下的所有policy | |||
? | ? | ? | /api/policies/{vhost}/{name} GET:列出指定的policy PUT:用來設(shè)置一個(gè) policy,對(duì)應(yīng)的請(qǐng)求參數(shù)為:{"pattern": "^amq.","definition": {"federation-upstream-set": "all"},"priority":0,"apply-to": "all"} 其中,pattern 和 definition是必填參數(shù),其余可選 DELETE:用來刪除一個(gè)指定的policy | |
? | /api/aliveness-test/{vhost} 聲明一個(gè)隊(duì)列。并在基礎(chǔ)上生產(chǎn)和消費(fèi)一條消息,用來測(cè)試系統(tǒng)是否運(yùn)行完好。這個(gè)接口可以方便一些監(jiān)控工具接入(如:Zabbix)的調(diào)用。如果系統(tǒng)運(yùn)行完好,則調(diào)用會(huì)返回 {"status": "ok"} 狀態(tài)碼為 200 | |||
? | /api/healthchecks/node 對(duì)當(dāng)前節(jié)點(diǎn)進(jìn)行基本的健康檢查,包括 rabbitmq 應(yīng)用、信道、隊(duì)列是否正常運(yùn)行且無告警,如果一切正常則接口返回: {"status": "ok"} 反之則返回: {"status": "failed","reason": "string"} 不管正常與否,狀態(tài)碼都是 200 | |||
? | /api/healthchecks/node/{node} 對(duì)指定節(jié)點(diǎn)進(jìn)行基本的健康檢查 |
????????HTTPAPI 接口通常用來方便客戶端的調(diào)用,如果單純地使用curl 的方式來調(diào)用,rabbitmqadrnin 會(huì)顯得更加方便。rabbitmqadrnin 也是RabbitMQ Management 插件提供的功能,它會(huì)包裝HTTPAPI 接口,使其調(diào)用顯得更加簡潔方便。比如前面的創(chuàng)建、顯示和刪除隊(duì)列queue 就可以這么做:
特別說明:默認(rèn)情況下 “rabbitmqadmin” 指令是無法使用的,需要啟用 RabbitMQ Management 插件,并且做一定配置后才能使用。具體配置方式可參考下面的說明。
第一步:下載插件
[root@myblnp rabbitmq_server-3.8.16]# wget http://192.168.56.106:15672/cli/rabbitmqadmin
第二步:移動(dòng)至PATH目錄并授權(quán)
[root@myblnp rabbitmq_server-3.8.16]# mv rabbitmqadmin /usr/local/bin/
[root@myblnp rabbitmq_server-3.8.16]#
[root@myblnp rabbitmq_server-3.8.16]# chmod +x /usr/local/bin/rabbitmqadmin
第三步:使用命令
[root@myblnp rabbitmq_server-3.8.16]# rabbitmqadmin list queues
+----------------+----------+
| name | messages |
+----------------+----------+
| myAe_test | 0 |
| queue | 0 |
| queue.dlx | 1 |
| queue.normal | 0 |
| queue.priority | 1 |
| queue_demo | 0 |
+----------------+----------+
[root@myblnp rabbitmq_server-3.8.16]#
接上文的示例操作,如下代碼:
[root@myblnp ~]# rabbitmqadmin -u admin -p admin@123 declare queue name=rabbitadminQueue
queue declared
[root@myblnp ~]# rabbitmqadmin list queues
+------------------+----------+
| name | messages |
+------------------+----------+
| myAe_test | 0 |
| queue | 0 |
| queue.dlx | 1 |
| queue.normal | 0 |
| queue.priority | 1 |
| queue_demo | 0 |
| rabbitadminQueue | 0 |
+------------------+----------+
[root@myblnp ~]# rabbitmqadmin -u admin -p admin@123 delete queue name=rabbitadminQueue
queue deleted
[root@myblnp ~]# rabbitmqadmin list queues
+----------------+----------+
| name | messages |
+----------------+----------+
| myAe_test | 0 |
| queue | 0 |
| queue.dlx | 1 |
| queue.normal | 0 |
| queue.priority | 1 |
| queue_demo | 0 |
+----------------+----------+
[root@myblnp ~]#
以下表格是關(guān)于 rabbitmqadmin 的一些常用命令說明
命令 | 解釋 |
---|---|
rabbitmqadmin list users | 查看所有用戶 User |
rabbitmqadmin list users name | 查看所有用戶名 Username |
rabbitmqadmin list users tags | 查看所有用戶角色 |
rabbitmqadmin list vhosts | 查看所有虛擬主機(jī) |
rabbitmqadmin list connections | 查看所有連接 |
rabbitmqadmin list exchanges | 查看所有路由 Exchange |
rabbitmqadmin list bindings | 查看所有路由與隊(duì)列的關(guān)系綁定 Binding |
rabbitmqadmin list permissions | 查看所有角色的權(quán)限 Permission |
rabbitmqadmin list channels | 查看所有通道 Channel |
rabbitmqadmin list consumers | 查看所有消費(fèi)者 Consumer |
rabbitmqadmin list queues | 查看所有消息隊(duì)列 Queue |
rabbitmqadmin list nodes | 查看所有節(jié)點(diǎn) Node |
rabbitmqadmin show overview | 概覽 Overview |
rabbitmqadmin list bindings source destination_type destination properties_key | 查看所有路由與隊(duì)列的關(guān)系綁定的詳細(xì)信息 Binding |
rabbitmqadmin declare queue name=test durable=true | 定義一個(gè)隊(duì)列queue,durable=true代表持久化打開。 |
rabbitmqadmin declare exchange name=my.fanout type=fanout | 定義一個(gè)Fanout路由 |
rabbitmqadmin declare exchange name=my.direct type=direct | 定義一個(gè)Direct路由 |
rabbitmqadmin declare exchange name=my.topic type=topic | 定義一個(gè)Topic路由 |
rabbitmqadmin declare binding source=my.fanout destination=test routing_key=first | 定義 binding |
rabbitmqadmin publish routing_key=test payload="hello world" | 發(fā)布一條消息 |
rabbitmqadmin publish routing_key=my.test exchange=my.topic payload="hello world" | 使用路由轉(zhuǎn)發(fā)消息 |
rabbitmqadmin get queue=test requeue=true | 查看消息,不消費(fèi) |
rabbitmqadmin get queue=test requeue=false | 查看消息,并消費(fèi) |
rabbitmqadmin purge queue name=test | 刪除隊(duì)列中的所有消息 |
rabbitmqadmin delete queue name=hello | 刪除消息隊(duì)列 Queue |
rabbitmqadmin delete user name=test | 刪除用戶 User |
rabbitmqadmin delete exchange name=test | 刪除路由器 Exchange |
rabbitmqadmin delete binding source='kk' destination_type=queue destination=test properties_key=test | 刪除路由器與消息隊(duì)列的關(guān)系綁定 Binding |
rabbitmqadmin -f raw_json list users | raw_json 格式化輸出 |
rabbitmqadmin -f long list users | 格式化輸出 |
rabbitmqadmin -f pretty_json list users | pretty_json 格式化輸出 |
rabbitmqadmin -f kvp list users | 格式化輸出 |
rabbitmqadmin -f tsv list users | 格式化輸出 |
rabbitmqadmin -f table list users | table 格式化輸出 |
rabbitmqadmin -f bash list users | bash 格式化輸出 |
2、RabbitMQ 配置
????????一般情況下,可以使用默認(rèn)的內(nèi)建配直未有效地運(yùn)行RabbitMQ ,并且大多數(shù)情況下也并不需要修改任何RabbitMQ 的配直. 當(dāng)然,為了更加有效地操控RabbitMQ ,也可以利用調(diào)節(jié)系統(tǒng)范圍內(nèi)的參數(shù)來達(dá)到定制化的需求。RabbitMQ 提供了三種方式來定制化服務(wù):
- 環(huán)境變量( Enviroment Variables). RabbitMQ 服務(wù)端參數(shù)可以通過環(huán)境變量進(jìn)行配直,例如,節(jié)點(diǎn)名稱、RabbitMQ 配直文件的地址、節(jié)點(diǎn)內(nèi)部通信端口等。
- 配置文件(Configuration File) . 可以定義RabbitMQ 服務(wù)和插件設(shè)直,例如, TCP 監(jiān)聽端口,以及其他網(wǎng)絡(luò)相關(guān)的設(shè)直、內(nèi)存限制、磁盤限制等。
- 運(yùn)行時(shí)參數(shù)和策略( Runtime Parameters and Policies )??梢栽谶\(yùn)行時(shí)定義集群層面的服務(wù)設(shè)置
2.1、環(huán)境變量
????????RabbitMQ 的環(huán)境變量都是以"RABBITMQ_" 開頭的,可以在Shell 環(huán)境中設(shè)置,也可以在rabbitmq-env.conf 這個(gè)RabbitMQ 環(huán)境變量的定義文件中設(shè)置。如果是在非Shell 環(huán)境中配置,則需要將"RABBITMQ_"這個(gè)前綴去除。優(yōu)先級(jí)順序按照Shell 環(huán)境最優(yōu)先,其次rabbitmq-env.conf 配置文件,最后是默認(rèn)的配置。
????????當(dāng)采用rabbitmq-server -detached 啟動(dòng)RabbitMQ 服務(wù)的時(shí)候,此服務(wù)節(jié)點(diǎn)默認(rèn)以"rabbit@" 加上當(dāng)前的Shell 環(huán)境的hostname (主機(jī)名)來命名,即rabbit@$HOSTNAME 。參考下面,當(dāng)前Shell 環(huán)境的hostname 為" myblnp " 。
[root@myblnp ~]# hostname
myblnp
[root@myblnp ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@myblnp ...
BasicsCluster name: myblnpsDisk Nodesrabbit@myblnpRunning Nodesrabbit@myblnpVersionsrabbit@myblnp: RabbitMQ 3.8.13 on Erlang 22.3.4.12Maintenance statusNode: rabbit@myblnp, status: not under maintenanceAlarms(none)Network Partitions……
????????如果需要制定節(jié)點(diǎn)的名稱,而不是采用默認(rèn)的方式,可以在rabbitmq-s erver 命令前添加RABBITMQ_NODENAME 變量來設(shè)定指定的名稱。如下所示, 此時(shí)創(chuàng)建的節(jié)點(diǎn)名稱為" rabbit@node2 "而非"rabbit@myblnp"。
[root@myblnp ~]# RABBITMQ_NOOENAME=rabbit@node2 rabbitmq-server -detached
Warning: PIO file not written; -detached was passed.
[root@myblnp ~]#
注意要點(diǎn):如果先執(zhí)行RABBITMQ NODENAME=rabbit@nodel ,再執(zhí)行rabbitmq-server -detached 命令,相當(dāng)于只執(zhí)行rabb 工tmq-server -detached 命令, 即對(duì)RABBITMQ NODENAME 的定義無效。
????????以RABBITMQ_NODENAME 這個(gè)變量為例, RabbitMQ 在啟動(dòng)服務(wù)的時(shí)候首先判斷當(dāng)前Shell 環(huán)境中有無RABBITMQ_NODENAME 的定義,如果有則啟用此值:如果沒有,則查看rabbitrnq-env.conf 中是否定義了NODENAME 這個(gè)變量,如果有則啟用此值,如果沒有則采用默認(rèn)的取值規(guī)則,即rabbit@$HOSTNAME 。
????????下面演示如何配置rabbitrnq-env.conf 這個(gè)文件(默認(rèn)在$RABBITMQ HOME/etc/rabbitrnq/ 目錄下,可以通過在啟動(dòng)RabbitMQ 服務(wù)時(shí)指定RABITMQ_CONF_ENV_FILE 變量來設(shè)置此文件的路徑) :
# RabbitMQ 環(huán)境變量的定義文件
#定義節(jié)點(diǎn)名稱
NODENAME=rabbit@node1
#定義RabbitMQ 的對(duì)外通信端口號(hào)
NODE_PORT=5672
#定義RabbitMQ 配置文件的目錄,注意對(duì)于rabbitmq.config
#文件來說這里不用添加、'. config 后綴"
CONFIG_FILE=/opt/rabbitmq/etc/rabbitmq/rabbitmq
????????對(duì)于默認(rèn)的取值規(guī)則,這個(gè)在$RABBITMQ_HOME/sbin/rabbitrnq-defaults 文件中有相關(guān)設(shè)置,當(dāng)然也可以通過修改這個(gè)文件中的內(nèi)容來修改RabbitMQ 的環(huán)境變量,但是并不推薦這么做,還是建議在rabbitrnq-env.conf 中進(jìn)行相應(yīng)的設(shè)置:
#!/bin/sh -e
## The contents of this file are subject to the Mozilla Public License
## Version 1.1 (the "License"); you may not use this file except in
## compliance with the License. You may obtain a copy of the License
## at https://www.mozilla.org/MPL/
##
## Software distributed under the License is distributed on an "AS IS"
## basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
## the License for the specific language governing rights and
## limitations under the License.
##
## The Original Code is RabbitMQ.
##
## The Initial Developer of the Original Code is GoPivotal, Inc.
## Copyright (c) 2012-2021 VMware, Inc. or its affiliates. All rights reserved.
##### next line potentially updated in package install steps
SYS_PREFIX=${RABBITMQ_HOME}CLEAN_BOOT_FILE=start_clean
SASL_BOOT_FILE=start_sasl
BOOT_MODULE="rabbit"if test -z "$CONF_ENV_FILE" && test -z "$RABBITMQ_CONF_ENV_FILE"; thenCONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf
fi
下表是一些常見的RabbitMQ 變量
變量名稱 | 描述 |
---|---|
RABBITMQ_NODE_IP_ADDRESS | 綁定某個(gè)特定的網(wǎng)絡(luò)接口.默認(rèn)值是空字符串,即綁定到所有網(wǎng)絡(luò)接口上.如果要綁定兩個(gè)或者更多的網(wǎng)絡(luò)接口,可以參考rabbitmq.config 中的tcp_listeners 配置 |
RABBITMQ_NODE_PORT | 監(jiān)聽客戶端連接的端口號(hào),默認(rèn)為5672 |
RABBITMQ_DIST_PORT | RabbitMQ 節(jié)點(diǎn)內(nèi)部通信的端口號(hào),默認(rèn)值為RABBITMQ_NODE_PORT+20000.所以RABBITMQ_DIST_PORT 即25672 . 如果設(shè)置了kernel. inet_dist_listen_min 或者kemel. inect_dist_listen_max 時(shí),此環(huán)境變量將被忽略 |
RABBITMQ_NODENAME | RabbitMQ 的節(jié)點(diǎn)名稱,默認(rèn)為rabbit@$HOSTNAME . 在每個(gè)Erlang 節(jié)點(diǎn)和機(jī)器的組合中,節(jié)點(diǎn)名稱必須唯一 |
RABBITMQ_ CONF_ENV_FlLE | RabbitMQ 環(huán)境變量的配置文件(rabbitmq-env.conf) 的地址,默認(rèn)值為 $RABBITMQ_HOME/etc/rabbitmq/rabbitmq-env.conf。注意這里與RabbitMQ 配置文件rabbitmq.config 的區(qū)別 |
RABBITMQ_USE_LONGNAME | 如果當(dāng)前的hostname為nodel.longname. 那么默認(rèn)情況下創(chuàng)建的節(jié)點(diǎn)名稱為將此參數(shù)設(shè)置為true 時(shí),創(chuàng)建的節(jié)點(diǎn)名稱就為rabbi讓t@node1.longname,即使用了長名稱命名.默認(rèn)值為空 |
RABBITMQ_CONFIG_FILE | RabbitMQ 配置文件(rabbitmq.config) 的路徑,注意沒有".config"的后綴.默認(rèn)值為$RABBITMQ_HOME/etc/rabbitmq/rabbitmq |
RABBITMQ_MNESIA_BASE | RABBITMQ_MNESIA_DIR 的父目錄。除非明確設(shè)置了RABBITMQ_MNESIA_DIR目錄,否則每個(gè)節(jié)點(diǎn)都應(yīng)該配置這個(gè)環(huán)境變量.默認(rèn)值為$RABBITMQ_HOME/var/lib/rabbitmq/mnesia注意對(duì)于RabbitMQ 的操作用戶來說,需要有對(duì)當(dāng)前目錄可讀、可寫、可創(chuàng)建文件及子目錄的權(quán)限 |
RABBITMQ_MNESIA_DIR | 包含RabbitMQ 服務(wù)節(jié)點(diǎn)的數(shù)據(jù)庫、數(shù)據(jù)存儲(chǔ)及集群狀態(tài)等目錄,默認(rèn)值為 $RABBITMQ_MNESIA_BASEI$RABBITMQ_NODENAME |
RABBITMQ_LOG_BASE | RabbitMQ 服務(wù)日志所在基礎(chǔ)目錄.默認(rèn)值為$RABBITMQ_HOME/var/log/rabbitmq |
RABBITMQ_LOGS | RabbitMQ 服務(wù)與Erlang 相關(guān)的日志,默認(rèn)值為 $RABBITMQ_LOG_BASE/$RABBITMQ_NODENAME.log |
RABBITMQ_SASL_LOGS | RabbitMQ 服務(wù)于Erlang 的SASL(System Application Support Libraries)相關(guān)的日志,默認(rèn)值為$RABBITMQ_LOG BASE/$RABBITMQ_NODENAME-sasl.log |
RABBITMQ_PLUGINS_DIR | 插件所在路徑。默認(rèn)值為$RABBITMQ_HOME/plugins |
????????注意,如果沒有特殊的需求,不建議更改RabbitMQ 的環(huán)境變量。如果在實(shí)際生產(chǎn)環(huán)境中,對(duì)于配量和日志的目錄有著特殊的管理目錄,那么可以參考以下相應(yīng)的配置:
#配置文件的地址
CONFIG_FILE=/apps/conf/rabbitmq/rabbitmq
#環(huán)境變量的配置文件的地址
CONF_ENV_FILE=/apps/conf/rabbitmq/rabbitmq-env.conf
#服務(wù)日志的地址
LOG_BASE=/apps/logs/rabbitmq
#Mnesia 的路徑
MNE5IA_BA5E=/apps/dbdat/rabbitmq/mnesia
2.2、配置項(xiàng)
配置項(xiàng) | 描述 |
---|---|
tcp _l isteners | 用來監(jiān)聽AMQP 連接(無SS L) ??梢耘渲脼槎丝谔?hào)或者端口號(hào)與主機(jī)名組成的二元數(shù)組. |
num_ tcp _ acceptors | 用來處理TC P 連接的Erlang 進(jìn)程數(shù)目,默認(rèn)值為10 |
handshake_timeout | AMQP 0-8/0-9/0-9-1 握手(在socket 連接和SSL 握手之后〉的超時(shí)時(shí)間,單位為毫秒. 默認(rèn)值為10000 |
ssl_Iisteners | 同tcp_listeners. 用于SSL 連接。默認(rèn)值為[] |
num_ssl_acceptors | 用來處理SSL 連接的Erlang 進(jìn)程數(shù)目,默認(rèn)值為l |
ssl_options | SSL 配置。默認(rèn)值為[] |
ssl_handshake_timeout | SSL 的握手超時(shí)時(shí)間.默認(rèn)值為5000 |
vm_memory_high_watermark | 觸發(fā)流量控制的內(nèi)存闌值.默認(rèn)值為0.4 |
vm_memory_calculation_ strategy | 內(nèi)存使用的報(bào)告方式。一共有2 種 ( 1) rss: 采用操作系統(tǒng)的RSS 的內(nèi)存報(bào)告 ( 2) erlang: 采用Erlang 的內(nèi)存報(bào)告 默認(rèn)值為rss |
vm_memory_high_watermark_paging_ratio | 內(nèi)存高水位的百分比闌值,當(dāng)達(dá)到闌值時(shí),隊(duì)列開始將消息持久化到磁盤以釋放內(nèi)存.這個(gè)需要配合咱一mernory_ high_wa憂rmark 這個(gè)參數(shù)一起使用.默認(rèn)值為0.5 . |
disk_free_limit | RabbitMQ 存儲(chǔ)數(shù)據(jù)分區(qū)的可用磁盤空間限制.當(dāng)可用空間值低于闌值時(shí),流程控制將被觸發(fā).此值可根據(jù)RAM 的相對(duì)大小來設(shè)置(如{ mem_relative, 1.0} ).此值也可以設(shè)為整數(shù)(單位為B). 或者使用數(shù)字+單位(如"50MB" ).默認(rèn)情況下,可用磁盤空間必須超過50MB . 默認(rèn)值為50000000 |
log_levels | 控制日志的粒度.該值是日志事件類別(category) 和日志級(jí)別( Ievel)的二元組列 表 目前定義了4 種日志類別 ( 1) channel : 所有與AMQP 信道相關(guān)的日志 (2) connection: 所有與連接相關(guān)的日志 (3) federation: 所有與federation 相關(guān)的日志 (4) mirroring: 所有與鏡像相關(guān)的日志 其他未分類的日志也會(huì)被記錄下來,日志級(jí)別有5 種: none 表示不記錄日志事件; error 表示只記錄錯(cuò)誤; waming 表示 只記錄錯(cuò)誤和告警; info 表示記錄錯(cuò)誤、告警和信息; debug 表示記錄錯(cuò)誤、告警、 信息和調(diào)試信息 默認(rèn)值為[ {connection, info} ] |
frame_max | 與客戶端協(xié)商的允許最大幀大小, 單位為B . 設(shè)置為0 表示無限制,但在某些QPid客戶端會(huì)引發(fā)bug . 設(shè)置較大的值可以提高吞吐量:設(shè)置一個(gè)較小的值可能會(huì)提高延遲.默認(rèn)值為131072 |
channel_max | 與客戶端協(xié)商的允許最大信道個(gè)數(shù).設(shè)置為0 表示無限制.該數(shù)值越大,則Broker的內(nèi)存使用就越高。默認(rèn)值為0 |
channel_operation_timeout | 信道運(yùn)行的超時(shí)時(shí)間,單位為毫秒(內(nèi)部使用,因?yàn)橄f(xié)議的區(qū)別和限制,不暴露給客戶端).默認(rèn)值為15000 |
heartbeat | 服務(wù)器和客戶端連接的心跳延遲, 單位為秒.如果設(shè)置為0 ,則禁用心跳。在有大量連接的情況下,禁用心跳可以提高性能,但可能會(huì)導(dǎo)致一些異常。默認(rèn)值為60 。在3 . 5 .5版本之前為580 |
default_vhost | 設(shè)置默認(rèn)的vhost。交換器amq.rabbitmq.log 就在這個(gè)vhost 上默認(rèn)值為<<"/">> |
default_user | 設(shè)置默認(rèn)的用戶.默認(rèn)值為<<"guest">> |
default_pass | 設(shè)置默認(rèn)的密碼.默認(rèn)值為<<"guest" >> |
default_user_tags | 設(shè)置默認(rèn)用戶的角色。默認(rèn)值為[administrator] |
default_permissions | 設(shè)置默認(rèn)用戶的權(quán)限。默認(rèn)值為[<<".">>, <<".">>, <<".*">>] |
loopback_ users | 設(shè)置只能通過本地網(wǎng)絡(luò)(如localhost) 來訪問Broker 的用戶列表。如果希望通過默認(rèn)的guest 用戶能夠通過遠(yuǎn)程網(wǎng)絡(luò)訪問Broker ,那么需要將這項(xiàng)設(shè)置為[].默認(rèn)值為<<"guest">> |
cluster_nodes | 可以用來配置集群。這個(gè)值是一個(gè)二元組,二元組的第一個(gè)元素是想要與其建立集群關(guān)系的節(jié)點(diǎn),第二個(gè)元素是節(jié)點(diǎn)的類型,要么是disc ,要么是ram. 默認(rèn)值為{[], disc} |
server_properues | 連接時(shí)向客戶端聲明的鍵值對(duì)列表。默認(rèn)值為[] |
collect_statistics | 統(tǒng)計(jì)數(shù)據(jù)的收集模式,主要與RabbitMQ Management 插件相關(guān),共有3 個(gè)值可選: ( 1) none: 不發(fā)布統(tǒng)計(jì)事件 (2) coarse: 發(fā)布每個(gè)隊(duì)列/信道/連接的統(tǒng)計(jì)事件 (3) fine: 同時(shí)還發(fā)布每個(gè)消息的統(tǒng)計(jì)事件 默認(rèn)值為none |
collect_statistics_interval | 統(tǒng)計(jì)數(shù)據(jù)的收集時(shí)間間隔,主要與RabbitMQ Management 插件相關(guān)。默認(rèn)值為5000 |
management_db_ cache_multiplier | 設(shè)置管理插件將緩存代價(jià)較高的查詢的時(shí)間.緩存將把最后一個(gè)查詢的運(yùn)行時(shí)間乘以這個(gè)值,并在此時(shí)間內(nèi)緩存結(jié)果。默認(rèn)值為5 |
delegate_count | 內(nèi)部集群通信中,委派進(jìn)程的數(shù)目。在擁有很多個(gè)內(nèi)核并且是集群中的一個(gè)節(jié)點(diǎn)的機(jī)器上可以增加此值。默認(rèn)值為16 |
tcp_listen_options | 默認(rèn)的socket 選項(xiàng)。默認(rèn)值為: [{backlog, 128}, {nodelay, true} , {linger, {true,0} }, {exit_ on_close, false}) |
hipe_compile | 將此項(xiàng)設(shè)直為田e 就可以開啟HiPE 功能,即Er1ang 的即時(shí)編譯器。雖然在啟動(dòng)時(shí)會(huì)增加時(shí)延,但是能夠有20%- 50%的性能提升, 當(dāng)然這個(gè)數(shù)字高度依賴于負(fù)載和機(jī)器硬件。在你的Er1ang 安裝包中可能沒有包含HiPE 的支持,如果沒有,則在開啟這一項(xiàng),并且在RabbitMQ 啟動(dòng)時(shí)會(huì)有相應(yīng)的告警信息。HiPE 并非在所有平臺(tái)都可以尤其是Windows操作系統(tǒng),在Erlang/OTP17.5版本之前,HiPE 有明顯問題。如果要使用HiPE 推薦使用最新版的Erlang/OTP. 默認(rèn)值為false |
cluster_partition_handling | 如何處理網(wǎng)絡(luò)分區(qū)。有4 種取值: ignore; pause_minority; {pause_if_a ll_down, [nodes],ignore |autheal}; autoheal 默認(rèn)值為fa l se |
cluster_keepalive_interval | 向其他節(jié)點(diǎn)發(fā)送存活消息的頻率.單位為毫秒。這個(gè)參數(shù)和net_ticktime 參數(shù)不同,丟失存活消息并不會(huì)導(dǎo)致節(jié)點(diǎn)被認(rèn)為己失效。默認(rèn)值為10000 |
queue_index_embed_msgs_below | 消息的大小小于此值時(shí)會(huì)直接嵌入到隊(duì)列的索引中.單位為B . 默認(rèn)值為4096 |
msg_store_index_module | 隊(duì)列索引的實(shí)現(xiàn)模塊。默認(rèn)值為:rabbit_msg_store_ets_index |
backing_queue_module | 隊(duì)列內(nèi)容的實(shí)現(xiàn)模塊。默認(rèn)值為rabbit_variable_queue . 不建議修改此項(xiàng) |
rnnesia_table_loading_retry_limit | 等待集群中Mnes ia 數(shù)據(jù)表可用時(shí)最大的重試次數(shù) 默認(rèn)值為10 |
mnesia_table_loading_retry_timeout | 每次重試時(shí),等待集群中Mnesia 數(shù)據(jù)表可用時(shí)的超時(shí)時(shí)間 默認(rèn)值為30000 |
queue_master_locator | 隊(duì)列的定位策略, 即創(chuàng)建隊(duì)列時(shí)以什么策略判斷坐落的Broker 節(jié)點(diǎn),如果配置了鏡像,則這里指master 鏡像的定位策略可用的策略有<<"min- masters">> 、<<"cli ent-l ocal ">> 、<<" random" >> 。默認(rèn)值為<<"client-local">> |
lazy_queue_explicit_gc_run_operation_threshold | 在使用惰性隊(duì)列(lazy queue) 時(shí)進(jìn)行內(nèi)存回收動(dòng)作的閥值。一個(gè)低的值會(huì)降低性能,一個(gè)高的值可以提高性能, 但是會(huì)導(dǎo)致更高的內(nèi)存消稅。默認(rèn)值為1 000 |
queue_explicit_gc_run_operation_threshold | 在使用正常隊(duì)列時(shí)進(jìn)行內(nèi)存回收動(dòng)作的閥值. 一個(gè)低的值會(huì)降低性能, 一個(gè)高的值可以提高性能, 但是會(huì)導(dǎo)致更高的內(nèi)存消耗.默認(rèn)值為1 000 |
2.3、網(wǎng)絡(luò)配置優(yōu)化
????????網(wǎng)絡(luò)是客戶端和RabbitMQ 之間通信的媒介。RabbitMQ 支持的所有協(xié)議都是基于TCP 層面的。包括操作系統(tǒng)和RabbitMQ 本身都提供了許多可調(diào)節(jié)的參數(shù),除了操作系統(tǒng)內(nèi)核參數(shù)和DNS ,所有的RabbitMQ 設(shè)置都可以通過在rabbitmq.config 配置文件中配置來實(shí)現(xiàn)。
????????RabbitMQ 在等待接收客戶端連接時(shí)需要綁定一個(gè)或者多個(gè)網(wǎng)絡(luò)接口( 可以理解成E 地址),并監(jiān)聽特定的端口。網(wǎng)絡(luò)接口使用rabbit .tcp listeners 選項(xiàng)來配置。默認(rèn)情況下,RabbitMQ 會(huì)在所有可用的網(wǎng)絡(luò)接口上監(jiān)聽5672 端口。下面的示例演示了如何在一個(gè)指定的IP地址和端口上進(jìn)行監(jiān)聽:
## Related doc guide: https://rabbitmq.com/networking.html.
##
## By default, RabbitMQ will listen on all interfaces, using
## the standard (reserved) AMQP 0-9-1 and 1.0 port.
##
# listeners.tcp.default = 5672## To listen on a specific interface, provide an IP address with port.
## For example, to listen only on localhost for both IPv4 and IPv6:
##
# IPv4
# listeners.tcp.local = 127.0.0.1:5672
# IPv6
# listeners.tcp.local_v6 = ::1:5672## You can define multiple listeners using listener names
# listeners.tcp.other_port = 5673
# listeners.tcp.other_ip = 10.10.10.10:5672
????????優(yōu)化網(wǎng)絡(luò)配置的一個(gè)重要目標(biāo)就是提高吞吐量,比如禁用Nagle 算法、增大TCP 緩沖區(qū)的大小。每個(gè)TCP 連接都分配了緩沖區(qū)。一般來說,緩沖區(qū)越大,吞吐量也會(huì)越高,但是每個(gè)連接上耗費(fèi)的內(nèi)存也就越多,從而使總體服務(wù)的內(nèi)存增大,這是一個(gè)權(quán)衡的問題。在Linux 操作系統(tǒng)中,默認(rèn)會(huì)自動(dòng)調(diào)節(jié)TCP 緩沖區(qū)的大小,通常會(huì)設(shè)置為80KB 到120KB 之間。要提高吞吐量可以使用rabbit.tcp_listen_options 來加大配置。下面的示例中將TCP 緩沖區(qū)大小設(shè)置為192KB(192*1024 = 196608):
## Customising TCP Listener (Socket) Configuration.
##
## Related doc guides:
##
## * https://rabbitmq.com/networking.html
## * https://www.erlang.org/doc/man/inet.html#setopts-2
### tcp_listen_options.backlog = 128
# tcp_listen_options.nodelay = true
# tcp_listen_options.exit_on_close = false
#
# tcp_listen_options.keepalive = true
# tcp_listen_options.send_timeout = 15000
#
# tcp_listen_options.buffer = 196608
# tcp_listen_options.sndbuf = 196608
# tcp_listen_options.recbuf = 196608
????????Erlang 在運(yùn)行時(shí)使用線程池來異步執(zhí)行1/0 操作。線程池的大小可以通過RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS 這個(gè)環(huán)境變量來調(diào)節(jié)。示例如下:
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS= "+A 128"
????????目前3.6.x 版本的默認(rèn)值為128。當(dāng)機(jī)器的內(nèi)核個(gè)數(shù)大于等于8 時(shí),建議將此值設(shè)置為大于等于96 , 這樣可以確保每個(gè)內(nèi)核上可以運(yùn)行大于等于12 個(gè)I/O 線程。注意這個(gè)值并不是越高越能提高吞吐量。
????????大部分操作系統(tǒng)都限制了同一時(shí)間可以打開的文件句柄數(shù)。在優(yōu)化并發(fā)連接數(shù)的時(shí)候, 需確保系統(tǒng)有足夠的文件句柄數(shù)來支撐客戶端和Broker 的交互。可以用每個(gè)節(jié)點(diǎn)上連接的數(shù)目乘以 1.5來粗略的估算限制。例如,要支撐10 萬個(gè)TCP 連接,需要設(shè)置文件句柄數(shù)為15 萬。當(dāng)然,略微增加文件句柄數(shù)可以增加閑置機(jī)器內(nèi)存的使用量,但這需要合理權(quán)衡。
????????如上所述,增大TCP 緩沖區(qū)的大小可以提高吞吐量,如果減小TCP 緩沖區(qū)的大小,這樣就可以減小每個(gè)連接上的內(nèi)存使用量。如果并發(fā)量比吞吐量更重要,可以修改此值。
????????前面所提到的禁用Nagle 算法可以提高吞吐量,但是其主要還是用于減少延遲。RabbitMQ 內(nèi)部節(jié)點(diǎn)交互時(shí)可以在kernel.inet_default_connect_options 和kernel.inet_default_listen_options 配置項(xiàng)中配置{nodelay , true} 來禁用Nagle 算法。rabbit.tcp_listen_options 也需要包含同樣的配置,井且默認(rèn)都是這樣配置的,參考下面示例:
#設(shè)置為true時(shí),禁用 Nagle的算法。默認(rèn)是真的。
tcp_listen_options.nodelay
????????當(dāng)優(yōu)化井發(fā)連接數(shù)時(shí),恰當(dāng)?shù)腅rlang 虛擬機(jī)的 I/O?線程池的大小也很重要,具體可以參考前面的內(nèi)容。
????????當(dāng)只有少量的客戶端時(shí),新建立的連接分布是非常不均勻的, 但是由于數(shù)量足夠小, 所以沒有太大的差異。當(dāng)連接數(shù)量到達(dá)數(shù)萬或者更多時(shí),重要的是確保服務(wù)器能夠接受入站連接。未接受的TCP 連接將會(huì)放在有長度限制的隊(duì)列中。這個(gè)通過rabbit.tcp_listen_options.backlog 參數(shù)來設(shè)置,詳細(xì)內(nèi)容可以參考前一個(gè)示例。默認(rèn)值為128 ,當(dāng)掛起的連接隊(duì)列的長度超過此值時(shí),連接將被操作系統(tǒng)拒絕。
通用TCP套接字選項(xiàng)
參數(shù)項(xiàng) | 描述 |
---|---|
rabbit.tcp_listen_options. nodelay | 當(dāng)設(shè)置為true. 可禁用Nagle 算法。默認(rèn)為true。對(duì)于大多數(shù)用戶而言,推薦設(shè)置為true |
rabbit. tcp_listen_options.sndbuf | 參考前面討論的TCP 緩沖區(qū)。一般取值范圍在88 KB 至128KB 之間。增大緩沖區(qū)可以提高消費(fèi)者的吞吐量,同時(shí)也會(huì)加大每個(gè)連接上的內(nèi)存使用量。減小則有相反的效果 |
rabbit. tcp_listen_options.recbuf | 參考前面討論的TCP 緩沖區(qū)。一般取值范圍同樣在88阻至1 28KB 之間。一般是針對(duì)發(fā)送者或者協(xié)議操作 |
rabbit.tcp_listen_options. backlog | 隊(duì)列中未接受連接的最大數(shù)目。當(dāng)達(dá)到此值時(shí),新連接會(huì)被拒絕。對(duì)于成千上萬的并發(fā)連接環(huán)境及可能存在大量客戶重新連接的場(chǎng)景,可設(shè)為4096 或更高 |
rabbit.tcp listen_ options.linger | 當(dāng)套接字關(guān)閉時(shí),設(shè)置為{true,N}. 用于設(shè)置刷新未發(fā)送數(shù)據(jù)的超時(shí)時(shí)間, 單位為秒 |
rabbit.tcp_listen_options.keepalive | 當(dāng)設(shè)置為true 時(shí),啟用TCP 的存活時(shí)間。默認(rèn)為falseo 對(duì)于長時(shí)間空閑的連接(至少10 分鐘〕是有意義的,雖然更推薦使用heartbeat 的選項(xiàng) |
????????與操作系統(tǒng)有關(guān)的網(wǎng)絡(luò)設(shè)置也會(huì)影響到RabbitMQ 的運(yùn)行, 理解這些設(shè)置選項(xiàng)同樣至關(guān)重要。注意這一類型的內(nèi)核參數(shù)在 /etc/sysctl.conf?文件( Linux 操作系統(tǒng))中配置, 而不是在rabbitmq . config 這個(gè)文件中。
可配置的內(nèi)核選項(xiàng)
參數(shù)項(xiàng) | 描述 |
---|---|
fs.file-max | 內(nèi)核分配的最大文件句柄數(shù)。極限值和當(dāng)前值可以通過/proc/sys/fs/file-nr 來查看。 示例如下: [iot@lidechang-test ~]$ cat /proc/sys/fs/file-nr 81632 0 1048576 |
net. ipv4.ip_local_port_range | 本地 IP 端口范圍,定義為一對(duì)值。該范圍必須為并發(fā)連接提供足夠的條目 |
net. ipv4. tcp_tw_reuse | 當(dāng)啟用時(shí),允許內(nèi)核重用TIME_WAIT 狀態(tài)的套接字。當(dāng)用在NAT 時(shí),此選項(xiàng)是很危險(xiǎn)的 |
net. ipv4.tcp_fin_timeout | 降低此值到5-10 可減少連接關(guān)閉的時(shí)間,之后會(huì)停留在TIME WAIT狀態(tài),建議用在有大量并發(fā)連接的場(chǎng)景 |
net.core.somaxconn | 監(jiān)聽隊(duì)列的大小〈同一時(shí)間建立過程中有多少個(gè)連接).默認(rèn)為128. 增大到4096 或更高,可以支持入站連接的爆發(fā),如clients 集體重連 |
net. ipv4.tcp_max_syn_backlog | 尚未收到連接客戶端確認(rèn)的連接請(qǐng)求的最大數(shù)量.默認(rèn)為128. 最大值為65535 . 優(yōu)化吞吐量時(shí). 4096 和8192 是推薦的起始值 |
net.ipv4.tcp_keepalive_* | net.ipv4. tcp_keepalive_time, net.ipv4. tcp_keepalive _ intvl 和net. ipv4.tcp_keepalive_probes 用于配置TCP 存活時(shí)間 |
net. ipv4.conf.defau1t.rp_filter | 啟用反向地址過濾.如果系統(tǒng)不關(guān)心 IP 地址欺騙,那么就禁用它 |
2.4、基本配置說明
##Rabbitmq下載地址 & Erlang下載地址
###Rabbitmq下載: https://www.rabbitmq.com/download.html
###Erlang下載:https://github.com/rabbitmq/erlang-rpm/releases#端口訪問說明
##SELinux和類似的機(jī)制可能會(huì)阻止RabbitMQ綁定到一個(gè)端口。發(fā)生這種情況時(shí),RabbitMQ將無法啟動(dòng)防火墻可以防止節(jié)點(diǎn)和CLI工具相互通信。確??梢源蜷_以下端口:
4369:#epmd, RabbitMQ節(jié)點(diǎn)和CLI工具使用的對(duì)等發(fā)現(xiàn)服務(wù)
5672,5671: #由AMQP 0-9-1和1.0客戶端使用
25672: #由Erlang分配用于節(jié)點(diǎn)間和CLI工具通信,并且從動(dòng)態(tài)范圍分配(AMQP端口+20000)
15672: #HTTP API客戶端和rabbitmqadmin(僅當(dāng)管理插件啟用時(shí))#調(diào)整系統(tǒng)限制
##運(yùn)行生產(chǎn)工作負(fù)載的RabbitMQ安裝可能需要系統(tǒng)限制和內(nèi)核參數(shù)調(diào)整,以便處理體面的并發(fā)連接和隊(duì)列。需要調(diào)整的主要設(shè)置是打開文件的最大數(shù)量
echo "* soft nproc 65535" >> /etc/security/limits.conf
echo "* hard nproc 65535" >> /etc/security/limits.conf
echo "* soft nofile 655350" >> /etc/security/limits.conf
echo "* hard nofile 655350" >> /etc/security/limits.conf
echo "ulimit -u 65535" >> /etc/profile
echo "ulimit -n 655350" >> /etc/profile#修改rabbitmq配置
# 修改/etc/systemd/system/multi-user.target.wants/rabbitmq-server.service
# 在[Service]中,增加LimitNOFILE=30000(具體數(shù)值根據(jù)需要)
##執(zhí)行重啟rabbitmq服務(wù)
systemctl daemon-reload
##查看狀態(tài)
rabbitmqctl status#日志
##默認(rèn)的情況下,日志位于/var/log/rabbitmq目錄中,服務(wù)器的輸出被發(fā)送到RABBITMQ_NODENAME.log文件 。其他日志數(shù)據(jù)寫入RABBITMQ_NODENAME-sasl.log
2.5、常用操作
#配置方式
#環(huán)境變量:網(wǎng)絡(luò)參數(shù)及配置文件路徑
#配置文件:服務(wù)器各組件訪問權(quán)限,資源限制,插件及集群
#運(yùn)行時(shí)參數(shù):集群的運(yùn)行時(shí)參數(shù)設(shè)定
#
#環(huán)境變量:/etc/rabbitmq/rabbitmq-env.confRABBITMQ_BASE:數(shù)據(jù)庫和日志文件存放位置RABBITMQ_CONFIG_FILE:配置文件路徑; /etc/rabbitmq/rabbitmqRABBITMQ_LOGS:日志RABBITMQ_NODE_IP_ADDRESS:監(jiān)聽的ipRABBITMQ_NODE_PORT:RABBITMQ_PLUGINS_DIR:#配置文件:auth_mechanisms:認(rèn)證機(jī)制default_user:guestdefault_pass:guestdefault_permission:disk_free_limit: 磁盤預(yù)留空間heartbeat:消息時(shí)長hipe_compile:使用默認(rèn)編譯器還是高級(jí)編譯器log_levels:{none|error|warning|info}tcp_listeners:監(jiān)聽的地址和端口ssl_listeners:基于ssl通信監(jiān)聽的地址和端口vm_memory_high_watermark:#運(yùn)行時(shí)參數(shù):rabbitmqctl -hrabbitmqctl statusset_parameter [-p <vhostpath>] <component_name> <name> <value>clear_parameter [-p <vhostpath>] <component_name> <key>list_parameters [-p <vhostpath>]#設(shè)置清除參數(shù)set_policy [-p <vhostpath>] <name> <pattern> <definition> [<priority>] clear_policy [-p <vhostpath>] <name>list_policies [-p <vhostpath>]set_vm_memory_high_watermark <fraction>stop [<pid_file>]stop_app 停止所有應(yīng)用start_app 啟動(dòng)所有應(yīng)用add_user <username> <password>delete_user <username>change_password <username> <newpassword>clear_password <username>set_user_tags <username> <tag> ... 例:rabbitmqctl set_user_tags test administratorlist_users#設(shè)定哪個(gè)用戶對(duì)哪個(gè)虛擬主機(jī)有哪些權(quán)限add_vhost <vhostpath> 例:rabbitmqctl add_vhost /myhost/test1 delete_vhost <vhostpath>list_vhosts [<vhostinfoitem> ...]set_permissions [-p <vhostpath>] <user> <conf> <write> <read>clear_permissions [-p <vhostpath>] <username>list_permissions [-p <vhostpath>]list_user_permissions <username>rabbitmqctl set_permissions -p /myhost/test test '.*' '.*' '.*'Setting permissions for user "test" in vhost "/myhost/test" ......done.rabbitmqctl list_permissions -p /myhost/testListing permissions in vhost "/myhost/test" ...test .* .* .*...done.#組件查看list_queues [-p <vhostpath>] [<queueinfoitem> ...]list_exchanges [-p <vhostpath>] [<exchangeinfoitem> ...]list_bindings [-p <vhostpath>] [<bindinginfoitem> ...]list_connections [<connectioninfoitem> ...]list_channels [<channelinfoitem> ...]list_consumers [-p <vhostpath>]#broker狀態(tài)查看status#環(huán)境變量查看environment#關(guān)閉指定連接close_connection <connectionpid> <explanation>#內(nèi)存使用set_vm_memory_high_watermark <fraction>
2.6、配置參數(shù)解釋
#像RabbitMQ這樣的數(shù)據(jù)服務(wù)通常有許多可調(diào)參數(shù)。一些配置對(duì)開發(fā)有很大的意義,但并不適合生產(chǎn),本指南旨在為此提供幫助
#
#虛擬主機(jī)
#例如,在單租戶環(huán)境中,當(dāng)您的RabbitMQ集群專門為生產(chǎn)中的單個(gè)系統(tǒng)供電時(shí),使用默認(rèn)的虛擬主機(jī)(/)是完全正確的
#在多租戶環(huán)境中,為每個(gè)租戶/環(huán)境使用單獨(dú)的虛擬主機(jī),例如project1_development, project1_production,project2_development和 project2_production等
#
#
#用戶
#對(duì)于生產(chǎn)環(huán)境,請(qǐng)刪除默認(rèn)用戶(guest),默認(rèn)用戶只能從本地主機(jī)默認(rèn)連接,因?yàn)樗哂斜娝苤膽{據(jù)。不要啟用遠(yuǎn)程連接,而應(yīng)考慮使用具有管理權(quán)限和生成密碼的單獨(dú)用戶
#建議每個(gè)應(yīng)用程序使用一個(gè)單獨(dú)的用戶。例如,如果您有一個(gè)移動(dòng)應(yīng)用程序,一個(gè)Web應(yīng)用程序和一個(gè)數(shù)據(jù)聚合系統(tǒng),您將有3個(gè)獨(dú)立的用戶。這使得許多事情更容易:將客戶端連接與應(yīng)用程序關(guān)聯(lián)
#
#
#權(quán)限控制
#認(rèn)證和授權(quán)通常會(huì)混淆或互換使用。這是錯(cuò)誤的,在RabbitMQ中,兩者是分開的。為了簡單起見,我們將認(rèn)證定義為“標(biāo)識(shí)用戶是誰”,授權(quán)定義為“確定用戶是什么,不允許做什么”
#默認(rèn)的虛擬主機(jī)和用戶
# 當(dāng)服務(wù)器首次開始運(yùn)行,并檢測(cè)到其數(shù)據(jù)庫未初始化或被刪除時(shí),它將使用一下資源初始化一個(gè)新的數(shù)據(jù)庫
# 一個(gè)名為 /虛擬主機(jī)
# 一個(gè)名為guest的用戶,默認(rèn)密碼為guest,被授予對(duì)/虛擬主機(jī)的完全訪問權(quán)限
# 明智的做法是刪除guest用戶或更改密碼,特別是在公共網(wǎng)絡(luò)上訪問
# 默認(rèn)情況下guest用戶被禁止遠(yuǎn)程連接到代理,它只能通過localhost連接。我們創(chuàng)建的其他用戶默認(rèn)情況下沒有這種限制
# 如果我們希望允許guest用戶從遠(yuǎn)程主機(jī)連接,則應(yīng)將loopback_users配置設(shè)置 為 none,如下:loopback_users = none
#權(quán)限如何工作
#
#當(dāng)一個(gè)RabbitMQ客戶端建立到一個(gè)服務(wù)器的連接時(shí),它指定了一個(gè)虛擬主機(jī)。此時(shí)執(zhí)行第一級(jí)訪問控制,服務(wù)器檢查用戶是否有權(quán)訪問虛擬主機(jī),否則拒絕連接嘗試
#資源(即交換和隊(duì)列)在特定虛擬主機(jī)內(nèi)被命名為實(shí)體;當(dāng)對(duì)資源執(zhí)行某些操作時(shí),強(qiáng)制執(zhí)行第二級(jí)訪問控制
#
#RabbitMQ在資源上有配置、寫入、讀取操作
# 配置:創(chuàng)建或銷毀資源,或更改其行為
# 寫: 寫入消息到資源
# 讀: 檢索資源的消息
#
#
#內(nèi)存
#默認(rèn)情況下,當(dāng)RabbitMQ檢測(cè)到使用的內(nèi)存超過40%(由操作系統(tǒng)報(bào)告)時(shí),將不會(huì)接收任何消息:{vm_memory_high_watermark,0.4},這是一個(gè)安全的默認(rèn)值
#在修改此值應(yīng)該小心,即使主機(jī)是專用的RabbitMQ節(jié)點(diǎn),因?yàn)槿绻麤]有足夠的空閑系統(tǒng)內(nèi)存,將會(huì)對(duì)操作系統(tǒng)交換造成不利影響,甚至?xí)?dǎo)致RabbitMQ進(jìn)程終止
#調(diào)整默認(rèn)vm_memory_high_watermark時(shí)的一些建議
# 托管RabbitMQ的節(jié)點(diǎn)應(yīng)始終具有至少128MB的可用內(nèi)存
# 推薦的vm_memory_high_watermark范圍是 0.40到0.66
# 值不要超過0.7。操作系統(tǒng)和文件系統(tǒng)必須至少保留30%的內(nèi)存,否則性能可能因?qū)ず舳鴩?yán)重降級(jí)
#比如修改配置調(diào)整為0.6,編輯rabbitmq.conf
vm_memory_high_watermark.relative = 0.6#磁盤空間
#disk_free_limit默認(rèn)值是50MB
# {disk_free_limit,{mem_relative,1.0}}是最小推薦值,和內(nèi)存的容量一樣大
# 例如,在專用于具有4GB系統(tǒng)內(nèi)存的RabbitMQ的主機(jī)上,如果可用磁盤空間低于4GB,所有發(fā)布者將被阻止,并且不會(huì)接收新消息。隊(duì)列將需要被排空,通常由消費(fèi)者,在發(fā)布之前將被允許恢復(fù)
# {disk_free_limit,{mem_relative,1.5}}是一個(gè)更安全的產(chǎn)品價(jià)值
# 在具有4GB內(nèi)存的RabbitMQ節(jié)點(diǎn)上,如果可用磁盤空間低于6GB,則所有新消息都將被阻止,直到磁盤警報(bào)清除
#{disk_free_limit,{mem_relative,2.0}}是最保守的產(chǎn)品價(jià)值,我們想不出任何理由使用更高的產(chǎn)品。如果您希望RabbitMQ擁有所有需要的磁盤空間,編輯rabbitmq.conf,比如修改配置調(diào)整為2Gdisk_free_limit.absolute = 2GB#打開文件句柄限制
#保證您的環(huán)境至少允許有效的RabbitMQ用戶使用至少50K的開放文件描述符,包括在開發(fā)環(huán)境中
#
#
#監(jiān)控
#強(qiáng)烈建議監(jiān)視系統(tǒng)的幾個(gè)方面,從基礎(chǔ)架構(gòu)和內(nèi)核度量到RabbitMQ到應(yīng)用程序級(jí)度量。雖然監(jiān)控需要在時(shí)間上進(jìn)行前期投資,但在提前(或根本)解決問題方面非常有效。
#參考zabbix監(jiān)控(http://blog.thomasvandoren.com/monitoring-rabbitmq-queues-with-zabbix.html)
#https://github.com/jasonmcintosh/rabbitmq-zabbix
#
#
#日志收集
#強(qiáng)烈建議所有RabbitMQ節(jié)點(diǎn)和應(yīng)用程序(如果可能的話)的日志都被收集和匯總。日志對(duì)于調(diào)查不尋常的系統(tǒng)行為至關(guān)重要
#
#
#節(jié)點(diǎn)時(shí)間同步
#節(jié)點(diǎn)時(shí)間同步
#
#
#網(wǎng)絡(luò)配置
#TCP偵聽器配置接口和端口listeners.tcp.1 = 192.168.1.99:5672
#將RabbitMQ配置為僅在IPv4和IPv6上的本地主機(jī)上偵聽(雙協(xié)議)listeners.tcp.1 = 127.0.0.1:5672
listeners.tcp.2 = :: 1:5672
TCP緩沖區(qū)大小#這是關(guān)鍵的可調(diào)參數(shù)之一。每個(gè)TCP連接都有為其分配的緩沖區(qū)。一般來說,這些緩沖區(qū)越大,每個(gè)連接使用的內(nèi)存就越多,吞吐量越好
#在Linux系統(tǒng)上,操作系統(tǒng)默認(rèn)會(huì)自動(dòng)調(diào)整TCP緩沖區(qū)大小,通常在80-120KB之間
#可以使用rabbit.tcp_listen_options, rabbitmq_mqtt.tcp_listen_options, rabbitmq_amqp1_0.tcp_listen_options和相關(guān)的配置項(xiàng)來增加緩沖區(qū)大小
#以下示例將AMQP 0-9-1連接的TCP緩沖區(qū)設(shè)置為192 KiB(請(qǐng)注意,將發(fā)送和接收緩沖區(qū)大小設(shè)置為不同的值是危險(xiǎn)的,不推薦使用):即每個(gè)連接使用的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
#有些環(huán)境中每個(gè)節(jié)點(diǎn)持續(xù)并發(fā)連接數(shù)量比吞吐量更重要,因此需要為每個(gè)工作負(fù)載找到吞吐量和每個(gè)連接的RAM使用量之間的最佳值,不建議低于8K
#
#連接握手超時(shí)
#RabbitMQ的連接握手超時(shí),默認(rèn)10秒。當(dāng)客戶端運(yùn)行在嚴(yán)重受限的環(huán)境中時(shí),可能需要增加超時(shí)。這可以通過rabbit.handshake_timeout(毫秒)完成:
handshake_timeout = 20000#OS級(jí)調(diào)整
fs.file-MAX 內(nèi)核將分配的最大文件數(shù)量
net.ipv4.ip_local_port_range 本地IP端口范圍,定義為一對(duì)值。范圍必須為并發(fā)連接的峰值數(shù)量提供足夠的條目
net.ipv4.tcp_tw_reuse 啟用時(shí),允許內(nèi)核在TIME_WAIT 狀態(tài)下重新使用套接字
net.ipv4.tcp_fin_timeout 將此值降低到5-10會(huì)減少關(guān)閉連接保持TIME_WAIT狀態(tài)的時(shí)間。推薦用于預(yù)計(jì)大量并發(fā)連接的情況。
net.core.somaxconn 偵聽隊(duì)列的大小(同時(shí)建立多少個(gè)連接)。默認(rèn)值是128.增加到4096或更高,以支持入站連接突發(fā),例如,當(dāng)客戶端重新連接時(shí)
net.ipv4.tcp_max_syn_backlog 記錄的連接請(qǐng)求的最大數(shù)量尚未從連接客戶端收到確認(rèn)。默認(rèn)值為128,最大值為65535.當(dāng)優(yōu)化吞吐量時(shí),建議使用4096和8192開始值
net.ipv4.conf.default.rp_filter 啟用反向路徑過濾。如果IP地址欺騙 不是您的系統(tǒng)所關(guān)心的,請(qǐng)將其禁用tcp_listen_options.nodelay 設(shè)置為true時(shí),禁用 Nagle的算法。默認(rèn)是真的。強(qiáng)烈建議大多數(shù)用戶
tcp_listen_options.sndbuf 默認(rèn)值由OS自動(dòng)調(diào)整,通常在現(xiàn)代Linux版本的88 KiB至128 KiB范圍內(nèi)。增加緩沖區(qū)大小可提高每個(gè)連接的消費(fèi)者吞吐量和RAM使用量。減少有相反的效果
tcp_listen_options.recbuf 默認(rèn)值的效果與rabbit.tcp_listen_options.sndbuf類似,但是對(duì)于發(fā)布者和協(xié)議操作來說一般
tcp_listen_options.backlog 未接受的TCP連接隊(duì)列的最大大小。達(dá)到這個(gè)尺寸時(shí),新的連接將被拒絕。對(duì)于具有數(shù)千個(gè)并發(fā)連接和可能的批量客戶端重新連接的環(huán)境,設(shè)置為4096或更高
tcp_listen_options.keepalive 當(dāng)設(shè)置為true時(shí),啟用TCP保持活動(dòng)(見上文)。默認(rèn)是false。對(duì)于連接可以長時(shí)間閑置(至少10分鐘)的環(huán)境有意義,但仍然建議使用心跳TCP Keepalivesnet.ipv4.tcp_keepalive_time = 60net.ipv4.tcp_keepalive_intvl = 15net.ipv4.tcp_keepalive_probes = 4
# TCP包含一個(gè)類似于心跳(aka keepalive)的機(jī)制,在消息傳遞協(xié)議和上面的網(wǎng)絡(luò)核對(duì)超時(shí)(TCP tickal timeout)中包含TCP保持活動(dòng)。由于默認(rèn)設(shè)置不足,TCP Keepalive通常不會(huì)按照
# 預(yù)期的方式工作:需要很長時(shí)間(例如,一個(gè)小時(shí)或更長時(shí)間)才能檢測(cè)到死亡的對(duì)等方。但是,通過調(diào)整,它們可以達(dá)到與心跳相同的目的,并且有意或無意地清除陳舊的TCP連接,例如
# 選擇不使用心跳的客戶端。下面是TCP keepalive的sysctl配置示例,它認(rèn)為TCP連接在120秒后死機(jī)或不可達(dá)(連接空閑60秒后每15秒4次嘗試):
# 在RabbitMQ操作員無法控制應(yīng)用程序設(shè)置或使用的客戶端庫的環(huán)境中,TCP Keepalive可以成為有用的附加防御機(jī)制。
#分區(qū)處理策略
#
#在投入生產(chǎn)之前 選擇分區(qū)處理策略非常重要
#強(qiáng)烈建議不要在網(wǎng)絡(luò)分區(qū)的環(huán)境中部署RabbitMQ集群
2.7、官方配置詳解
官方的配置文件說明:http://www.rabbitmq.com/configure.html
##相關(guān)文檔指南:http://rabbitmq.com/configure.html。看到## 聯(lián)網(wǎng)
## ====================
##
##相關(guān)文檔指南:http://rabbitmq.com/networking.html。
##
##默認(rèn)情況下,RabbitMQ將使用偵聽所有接口
##標(biāo)準(zhǔn)(保留)AMQP 0-9-1和1.0端口。
##
#listeners.tcp.default = 5672##要監(jiān)聽特定的接口,請(qǐng)?zhí)峁в卸丝诘腎P地址。
##例如,只在本地主機(jī)上偵聽IPv4和IPv6:
##
#IPv4
#listeners.tcp.local = 127.0.0.1:5672
#IPv6
#listeners.tcp.local_v6 = :: 1:5672##您可以使用偵聽器名稱定義多個(gè)偵聽器
#listeners.tcp.other_port = 5673
#listeners.tcp.other_ip = 10.10.10.10:5672## TLS監(jiān)聽器的配置方式與TCP監(jiān)聽器相同,
##包括控制界面選擇的選項(xiàng)。
##
#listeners.ssl.default = 5671##將接受TCP連接的Erlang進(jìn)程的數(shù)量
##和TLS監(jiān)聽器。
##
#num_acceptors.tcp = 10
#num_acceptors.ssl = 1## AMQP 0-8 / 0-9 / 0-9-1握手的最大時(shí)間(套接字連接后)
##和TLS握手),以毫秒為單位。
##
#handshake_timeout = 10000##設(shè)置為'true'在接受a時(shí)執(zhí)行反向DNS查詢
##連接。主機(jī)名將被顯示,而不是IP地址
#在rabbitmqctl中的##和管理插件。
##
#reverse_dns_lookups = true##
##安全,訪問控制
## ==============
####相關(guān)文檔指南:http://rabbitmq.com/access-control.html。##默認(rèn)的“訪客”用戶只能訪問服務(wù)器
##通過一個(gè)回送接口(例如本地主機(jī))。
## {loopback_users,[<<“guest”>>]},
##
#loopback_users.guest = true##如果您想允許訪問,請(qǐng)取消注釋以下行
##來賓用戶從網(wǎng)絡(luò)上的任何地方。
#loopback_users.guest = false## TLS配置。
##
##相關(guān)文檔指南:http://rabbitmq.com/ssl.html。
##
#ssl_options.verify = verify_peer
#ssl_options.fail_if_no_peer_cert = false
#ssl_options.cacertfile = /path/to/cacert.pem
#ssl_options.certfile = /path/to/cert.pem
#ssl_options.keyfile = /path/to/key.pem##選擇要使用的認(rèn)證/授權(quán)后端。
##
##備用后端由插件提供,例如rabbitmq-auth-backend-ldap。
##
##注意:這些設(shè)置需要啟用某些插件。
##
##相關(guān)文檔指南:
##
## * http://rabbitmq.com/plugins.html
## * http://rabbitmq.com/access-control.html
###auth_backends.1 = rabbit_auth_backend_internal##使用單獨(dú)的后端進(jìn)行身份驗(yàn)證和授權(quán),
## 見下文。
#auth_backends.1.authn = rabbit_auth_backend_ldap
#auth_backends.1.authz = rabbit_auth_backend_internal## rabbitmq_auth_backend_ldap插件允許經(jīng)紀(jì)人
##通過推遲到一個(gè)執(zhí)行認(rèn)證和授權(quán)
##外部LDAP服務(wù)器。
##
##相關(guān)文檔指南:
##
## * http://rabbitmq.com/ldap.html
## * http://rabbitmq.com/access-control.html
##
##使用LDAP進(jìn)行身份驗(yàn)證和授權(quán)
#auth_backends.1 = rabbit_auth_backend_ldap##使用HTTP服務(wù)進(jìn)行身份驗(yàn)證和
##授權(quán)
#auth_backends.1 = rabbit_auth_backend_http##在鏈中使用兩個(gè)后端:首先是HTTP,然后是內(nèi)部
#auth_backends.1 = rabbit_auth_backend_http
#auth_backends.2 = rabbit_auth_backend_internal##認(rèn)證
##內(nèi)置的機(jī)制是“普通”,
##'AMQPLAIN'和'EXTERNAL'可以通過添加其他機(jī)制
##插件。
##
##相關(guān)文檔指南:http://rabbitmq.com/authentication.html。
##
#auth_mechanisms.1 = PLAIN
#auth_mechanisms.2 = AMQPLAIN## rabbitmq-auth-mechanism-ssl插件使得它成為可能
##根據(jù)客戶端的x509(TLS)證書對(duì)用戶進(jìn)行身份驗(yàn)證。
##相關(guān)文檔指南:http://rabbitmq.com/authentication.html。
##
##要使用auth-mechanism-ssl,EXTERNAL機(jī)制應(yīng)該
##被啟用:
##
#auth_mechanisms.1 = PLAIN
#auth_mechanisms.2 = AMQPLAIN
#auth_mechanisms.3 = EXTERNAL##要強(qiáng)制所有客戶端上基于x509證書的身份驗(yàn)證,
##排除所有其他機(jī)制(注意:這將禁用基于密碼的
##認(rèn)證甚至管理用戶界面!):
##
#auth_mechanisms.1 = EXTERNAL##這涉及rabbitmq-auth-mechanism-ssl插件和
## STOMP ssl_cert_login配置。查看RabbitMQ STOMP插件
## 稍后在此文件和README中的##配置部分
## https://github.com/rabbitmq/rabbitmq-auth-mechanism-ssl進(jìn)一步
## 細(xì)節(jié)。
##
##使用TLS證書的CN而不是DN作為用戶名
##
#ssl_cert_login_from = common_name## TLS握手超時(shí),以毫秒為單位。
##
#ssl_handshake_timeout = 5000##密碼散列實(shí)現(xiàn)。只會(huì)影響新的
##創(chuàng)建用戶。重新計(jì)算現(xiàn)有用戶的散列值
##有必要更新她的密碼。
##
##要使用SHA-512,請(qǐng)?jiān)O(shè)置為rabbit_password_hashing_sha512。
##
#password_hashing_module = rabbit_password_hashing_sha256##導(dǎo)入從早期版本導(dǎo)出的定義
##比3.6.0,有可能回到MD5(只做這個(gè)
##作為臨時(shí)措施!)通過將其設(shè)置為rabbit_password_hashing_md5。
##
#password_hashing_module = rabbit_password_hashing_md5##
##默認(rèn)用戶/ VHost
## ====================
####首先啟動(dòng)RabbitMQ將創(chuàng)建一個(gè)虛擬主機(jī)和一個(gè)用戶。這些
## config items控制創(chuàng)建的內(nèi)容。
##相關(guān)文檔指南:http://rabbitmq.com/access-control.html
##
#default_vhost = /
#default_user = guest
#default_pass = guest#default_permissions.configure =。*
#default_permissions.read =。*
#default_permissions.write =。*##默認(rèn)用戶的標(biāo)簽
##
##有關(guān)標(biāo)簽的更多詳細(xì)信息,請(qǐng)參閱文檔
##管理插件在http://rabbitmq.com/management.html。
##
#default_user_tags.administrator = true##定義這樣的其他標(biāo)簽:
#default_user_tags.management = true
#default_user_tags.custom_tag = true##
##其他網(wǎng)絡(luò)和協(xié)議相關(guān)的配置
## ================================================ =====
####設(shè)置默認(rèn)的AMQP 0-9-1心跳間隔(以秒為單位)。
##相關(guān)文檔指南:
##
## * http://rabbitmq.com/heartbeats.html
## * http://rabbitmq.com/networking.html
##
#心跳= 600##設(shè)置AMQP幀的最大允許大小(以字節(jié)為單位)。
##
#frame_max = 131072##設(shè)置連接前服務(wù)器將接受的最大幀大小
##調(diào)整發(fā)生
##
#initial_frame_max = 4096##設(shè)置每個(gè)連接的最大允許通道數(shù)量。
## 0的意思是“沒有限制”。
##
#channel_max = 128##自定義TCP監(jiān)聽器(套接字)配置。
##
##相關(guān)文檔指南:
##
## * http://rabbitmq.com/networking.html
## * http://www.erlang.org/doc/man/inet.html#setopts-2
###tcp_listen_options.backlog = 128
#tcp_listen_options.nodelay = true
#tcp_listen_options.exit_on_close = false##
##資源限制和流量控制
## ==============================
##
##相關(guān)文檔指南:http://rabbitmq.com/memory.html。##基于內(nèi)存的流量控制閾值。
##
#vm_memory_high_watermark.relative = 0.4##或者,我們可以設(shè)置節(jié)點(diǎn)使用的RAM的限制(以字節(jié)為單位)。
##
#vm_memory_high_watermark.absolute = 1073741824##或者您可以使用內(nèi)存單位設(shè)置絕對(duì)值(使用RabbitMQ 3.6.0+)。
##如果相對(duì)定義,絕對(duì)水印將被忽略!
##
#vm_memory_high_watermark.absolute = 2GB
##
##支持的單位后綴:
##
## kb,KB:kibibytes(2 ^ 10個(gè)字節(jié))
## mb,MB:mebibytes(2 ^ 20)
## gb,GB:gibibytes(2 ^ 30)##隊(duì)列開始的高水印限制的分?jǐn)?shù)
##尋呼消息到光盤為了釋放內(nèi)存。
##例如,當(dāng)vm_memory_high_watermark被設(shè)置為0.4并且該值被設(shè)置為0.5時(shí),
##分頁可以在節(jié)點(diǎn)使用總可用RAM的20%時(shí)開始。
##
##大于1.0的值可能是危險(xiǎn)的,應(yīng)謹(jǐn)慎使用。
##
##一個(gè)替代方案是使用持久隊(duì)列和發(fā)布消息
##作為永久(交付模式= 2)。有了這個(gè)組合隊(duì)列將
##將消息更快地移動(dòng)到磁盤。
##
##另一種選擇是配置隊(duì)列來尋呼所有消息(都是
##持久性和瞬態(tài))到磁盤
##盡可能參見http://rabbitmq.com/lazy-queues.html。
##
#vm_memory_high_watermark_paging_ratio = 0.5##選擇Erlang VM內(nèi)存消耗計(jì)算策略??梢允恰胺峙洹?#xff0c;“rss”或“l(fā)egacy”(別名為“erlang”),
##在3.6.11中介紹?!皉ss”是3.6.12的默認(rèn)值。
##查看https://github.com/rabbitmq/rabbitmq-server/issues/1223和rabbitmq / rabbitmq-common#224獲取背景信息。
#vm_memory_calculation_strategy = rss##我們執(zhí)行內(nèi)存檢查的間隔(以毫秒為單位)
##水平對(duì)水印。
##
#memory_monitor_interval = 2500##可用的總內(nèi)存可以從OS資源中計(jì)算出來
## - 默認(rèn)選項(xiàng) - 或作為配置參數(shù)提供。
#total_memory_available_override_value = 2GB##設(shè)置磁盤空閑限制(以字節(jié)為單位)。一旦可用磁盤空間達(dá)到此目的
##下限,磁盤報(bào)警將被設(shè)置 - 請(qǐng)參閱文檔
##上面列出了更多的細(xì)節(jié)。
##
##如果相對(duì)定義,絕對(duì)水印將被忽略!
#disk_free_limit.absolute = 50000##或者你可以使用內(nèi)存單元(與vm_memory_high_watermark相同)
##與RabbitMQ 3.6.0+。
#disk_free_limit.absolute = 500KB
#disk_free_limit.absolute = 50mb
#disk_free_limit.absolute = 5GB##或者,我們可以設(shè)置一個(gè)相對(duì)于可用RAM總量的限制。
##
##低于1.0的值可能是危險(xiǎn)的,應(yīng)謹(jǐn)慎使用。
#disk_free_limit.relative = 2.0##
##聚類
## =====================
##
#cluster_partition_handling =忽略## pause_if_all_down策略需要額外的配置
#cluster_partition_handling = pause_if_all_down##恢復(fù)策略??梢允恰癮utoheal”或“忽略”
#cluster_partition_handling.pause_if_all_down.recover =忽略##節(jié)點(diǎn)名稱檢查
#cluster_partition_handling.pause_if_all_down.nodes.1 = rabbit @ localhost
#cluster_partition_handling.pause_if_all_down.nodes.2 = hare @ localhost##在消息中鏡像同步批量大小。增加這將加快速度
##同步,但批量總大小(以字節(jié)為單位)不得超過2 GiB。
##在RabbitMQ 3.6.0或更高版本中可用。
##
#mirroring_sync_batch_size = 4096##在啟動(dòng)時(shí)自動(dòng)進(jìn)行聚類。僅適用
##到第一次剛復(fù)位或啟動(dòng)的節(jié)點(diǎn)。
##
##相關(guān)文檔指南:http://rabbitmq.com//cluster-formation.html
###autocluster.peer_discovery_backend = rabbit_peer_discovery_classic_config
#
#autocluster.classic_config.nodes.node1 = rabbit1 @ hostname
#autocluster.classic_config.nodes.node2 = rabbit2 @ hostname
#autocluster.classic_config.nodes.node3 = rabbit3 @ hostname
#autocluster.classic_config.nodes.node4 = rabbit4 @ hostname##基于DNS的對(duì)等發(fā)現(xiàn)。這后端將列出A記錄
##配置的主機(jī)名##并執(zhí)行反向查找
##返回的地址。#autocluster.peer_discovery_backend = rabbit_peer_discovery_dns
#autocluster.dns.hostname = rabbitmq.discovery.mycompany.local##此節(jié)點(diǎn)的類型可以配置。如果你不確定
##使用什么節(jié)點(diǎn)類型,總是使用“光盤”。
#autocluster.node_type =光盤##發(fā)送Keepalive消息的間隔(以毫秒為單位)
##給其他集群成員。請(qǐng)注意,這不是一回事
## as net_ticktime; 遺漏的keepalive消息不會(huì)導(dǎo)致節(jié)點(diǎn)
##被認(rèn)為是失望的。
##
#cluster_keepalive_interval = 10000##
##統(tǒng)計(jì)收集
## =====================
####設(shè)置(內(nèi)部)統(tǒng)計(jì)信息收集粒度。
##
##可以不是,粗或細(xì)
#collect_statistics =無#collect_statistics =粗略##統(tǒng)計(jì)信息收集間隔(以毫秒為單位)。增加
##這將減少管理數(shù)據(jù)庫的負(fù)載。
##
#collect_statistics_interval = 5000##
##其他/高級(jí)選項(xiàng)
## =====================
##
##注意:只有在你明白自己在做什么的情況下才能改變這些!
####顯式啟用/禁用hipe編譯。
##
#hipe_compile = false##在等待群集中的Mnesia表時(shí)使用的超時(shí)
##變得可用。
##
#mnesia_table_loading_retry_timeout = 30000##在群集啟動(dòng)中等待Mnesia表時(shí)重試。注意
##此設(shè)置不適用于Mnesia升級(jí)或節(jié)點(diǎn)刪除。
##
#mnesia_table_loading_retry_limit = 10##以字節(jié)為單位的大小,低于該大小將消息嵌入到隊(duì)列索引中。
##相關(guān)文檔指南:http://rabbitmq.com/persistence-conf.html
##
#queue_index_embed_msgs_below = 4096##你也可以用內(nèi)存單位來設(shè)置這個(gè)大小
##
#queue_index_embed_msgs_below = 4kb##是否啟用所有的后臺(tái)定期GC
## Erlang處于“等待”狀態(tài)。
##
##禁用后臺(tái)GC可以減少客戶端操作的延遲,
##保持啟用可能會(huì)減少RAM的使用量。
##
#background_gc_enabled = false##運(yùn)行背景GC的目標(biāo)(期望)間隔(以毫秒為單位)。
##實(shí)際時(shí)間間隔取決于執(zhí)行時(shí)間的長短
##操作(可高于此間隔)。值小于
##不建議使用30000毫秒。
##
#background_gc_target_interval = 60000##是否啟用代理協(xié)議支持。
##一旦啟用,客戶端不能直接連接到代理
##了。他們必須通過一個(gè)負(fù)載均衡器連接發(fā)送
##代理協(xié)議頭在連接時(shí)間給代理。
##此設(shè)置僅適用于AMQP客戶端,其他協(xié)議
##像MQTT或STOMP這樣的##有自己的設(shè)置來啟用代理協(xié)議。
##請(qǐng)參閱插件文檔以獲取更多信息。
##
#proxy_protocol = false## ------------------------------------------------ ----------------------------
##高級(jí)的Erlang網(wǎng)絡(luò)/集群選項(xiàng)。
##
##相關(guān)文檔指南:http://rabbitmq.com/clustering.html
## ------------------------------------------------ ----------------------------#======================================
#內(nèi)核部分
#======================================#kernel.net_ticktime = 60## ------------------------------------------------ ----------------------------
## RabbitMQ管理插件
##
##相關(guān)文檔指南:http://rabbitmq.com/management.html。
## ------------------------------------------------ ----------------------------#=======================================
#管理部分
#=======================================##從以下JSON文件中預(yù)載模式定義。
##相關(guān)文檔指南:http://rabbitmq.com/management.html#load-definitions。
##
#management.load_definitions = /path/to/exported/definitions.json##將所有對(duì)管理HTTP API的請(qǐng)求記錄到一個(gè)文件中。
##
#management.http_log_dir = /path/to/access.log##更改HTTP偵聽器偵聽的端口,
##指定Web服務(wù)器綁定的接口。
##還要將偵聽器設(shè)置為使用TLS并提供TLS選項(xiàng)。
###management.listener.port = 15672
#management.listener.ip = 127.0.0.1
#management.listener.ssl = true#management.listener.ssl_opts.cacertfile = /path/to/cacert.pem
#management.listener.ssl_opts.certfile = /path/to/cert.pem
#management.listener.ssl_opts.keyfile = /path/to/key.pem##“基本”,“詳細(xì)”或“無”之一??吹?## http://rabbitmq.com/management.html#fine-stats了解更多詳情。
#management.rates_mode =基本##配置聚合數(shù)據(jù)的長度(如消息速率和隊(duì)列
##長度)被保留。請(qǐng)閱讀插件的文檔
## http://rabbitmq.com/management.html#configuration更多
## 細(xì)節(jié)。
##您可以使用“分鐘”,“小時(shí)”和“日”鍵或整數(shù)鍵(以秒為單位)
#management.sample_retention_policies.global.minute = 5
#management.sample_retention_policies.global.hour = 60
#management.sample_retention_policies.global.day = 1200#management.sample_retention_policies.basic.minute = 5
#management.sample_retention_policies.basic.hour = 60#management.sample_retention_policies.detailed.10 = 5## ------------------------------------------------ ----------------------------
## RabbitMQ鏟子插件
##
##相關(guān)文檔指南:http://rabbitmq.com/shovel.html
## ------------------------------------------------ ----------------------------## Shovel插件配置示例在additional.config文件中定義## ------------------------------------------------ ----------------------------
## RabbitMQ STOMP插件
##
##相關(guān)文檔指南:http://rabbitmq.com/stomp.html
## ------------------------------------------------ ----------------------------#=======================================
#STOMP部分
#=======================================##網(wǎng)絡(luò)配置。格式通常與核心代理相同。
##
#stomp.listeners.tcp.default = 61613##與ssl監(jiān)聽器相同
##
#stomp.listeners.ssl.default = 61614##將接受TCP連接的Erlang進(jìn)程的數(shù)量
##和TLS監(jiān)聽器。
##
#stomp.num_acceptors.tcp = 10
#stomp.num_acceptors.ssl = 1##其他TLS選項(xiàng)##使用TLS時(shí),從客戶端證書中提取名稱。
##
#stomp.ssl_cert_login = true##設(shè)置默認(rèn)的用戶名和密碼。這被用作默認(rèn)登錄
##每當(dāng)CONNECT框架省略登錄名和密碼頭。
##
##請(qǐng)注意,設(shè)置這將允許客戶端連接沒有
##驗(yàn)證!
##
#stomp.default_user = guest
#stomp.default_pass = guest##如果配置了默認(rèn)用戶,或者您已配置使用TLS客戶端
##證書為基礎(chǔ)的身份驗(yàn)證,您可以選擇允許客戶端
##完全忽略CONNECT幀。如果設(shè)置為true,則客戶端是
##自動(dòng)連接為默認(rèn)用戶或用戶提供的
##每當(dāng)在一個(gè)會(huì)話上發(fā)送的第一幀不是一個(gè)## TLS證書
##連接框架。
##
#stomp.implicit_connect = true##是否啟用代理協(xié)議支持。
##一旦啟用,客戶端不能直接連接到代理
##了。他們必須通過一個(gè)負(fù)載均衡器連接發(fā)送
##代理協(xié)議頭在連接時(shí)間給代理。
##此設(shè)置僅適用于STOMP客戶端,其他協(xié)議
##像MQTT或AMQP這樣的##有自己的設(shè)置來啟用代理協(xié)議。
##請(qǐng)參閱插件或代理文檔以獲取更多信息。
##
#stomp.proxy_protocol = false## ------------------------------------------------ ----------------------------
## RabbitMQ MQTT適配器
##
##見https://github.com/rabbitmq/rabbitmq-mqtt/blob/stable/README.md
##的細(xì)節(jié)
## ------------------------------------------------ ----------------------------#=======================================
#MQTT部分
#=======================================##設(shè)置默認(rèn)的用戶名和密碼。將被用作默認(rèn)登錄
##如果連接客戶端沒有提供其他登錄信息。
##
##請(qǐng)注意,設(shè)置這將允許客戶端連接沒有
##驗(yàn)證!
##
#mqtt.default_user = guest
#mqtt.default_pass = guest##啟用匿名訪問。如果這被設(shè)置為false,客戶端必須提供
##登錄信息才能連接。請(qǐng)參閱default_user / default_pass
##配置元素管理登錄沒有身份驗(yàn)證。
##
#mqtt.allow_anonymous = true##如果你有多個(gè)chosts,指定哪個(gè)
##適配器連接。
##
#mqtt.vhost = /##指定發(fā)布來自MQTT客戶端的消息的交換。
##
#mqtt.exchange = amq.topic##指定TTL(生存時(shí)間)來控制非干凈會(huì)話的生命周期。
##
#mqtt.subscription_ttl = 1800000##設(shè)置預(yù)取計(jì)數(shù)(控制未確認(rèn)的最大數(shù)量
##消息將被交付)。
##
#mqtt.prefetch = 10## TCP / SSL配置(按照代理配置)。
##
#mqtt.listeners.tcp.default = 1883##與ssl監(jiān)聽器相同
##
#mqtt.listeners.ssl.default = 1884##將接受TCP連接的Erlang進(jìn)程的數(shù)量
##和TLS監(jiān)聽器。
##
#mqtt.num_acceptors.tcp = 10
#mqtt.num_acceptors.ssl = 1## TCP偵聽器選項(xiàng)(按照代理配置)。
##
#mqtt.tcp_listen_options.backlog = 128
#mqtt.tcp_listen_options.nodelay = true##是否啟用代理協(xié)議支持。
##一旦啟用,客戶端不能直接連接到代理
##了。他們必須通過一個(gè)負(fù)載均衡器連接發(fā)送
##代理協(xié)議頭在連接時(shí)間給代理。
##此設(shè)置僅適用于STOMP客戶端,其他協(xié)議
##像STOMP或AMQP有自己的設(shè)置來啟用代理協(xié)議。
##請(qǐng)參閱插件或代理文檔以獲取更多信息。
##
#mqtt.proxy_protocol = false## ------------------------------------------------ ----------------------------
## RabbitMQ AMQP 1.0支持
##
##見https://github.com/rabbitmq/rabbitmq-amqp1.0/blob/stable/README.md。
## ------------------------------------------------ ----------------------------#=======================================
#AMQP 1.0部分
#=======================================##未通過SASL認(rèn)證的連接將以此連接
##帳戶。請(qǐng)參閱自述文件以獲取更多信息。
##
##請(qǐng)注意,設(shè)置這將允許客戶端連接沒有
##驗(yàn)證!
##
#amqp1_0.default_user = guest##啟用協(xié)議嚴(yán)格模式。請(qǐng)參閱自述文件以獲取更多信息。
##
#amqp1_0.protocol_strict_mode = false## Lager控制記錄。
##請(qǐng)參閱https://github.com/basho/lager獲取更多文檔
##
## Log direcrory,默認(rèn)情況下取自RABBITMQ_LOG_BASE env變量。
##
#log.dir = / var / log / rabbitmq##記錄到控制臺(tái)(可以為true或false)
##
#log.console = false## Loglevel登錄到控制臺(tái)
##
#log.console.level = info##記錄到文件??梢允羌俚幕蛭募?。
##默認(rèn):
#log.file = rabbit.log## 把關(guān)掉:
#log.file = false## Loglevel記錄到文件
##
#log.file.level = info##文件旋轉(zhuǎn)配置。沒有旋轉(zhuǎn)的defualt。
##不要將旋轉(zhuǎn)日期設(shè)置為“”。如果需要“”值,請(qǐng)保持不變
#log.file.rotation.date = $ D0
#log.file.rotation.size = 0## QA:配置系統(tǒng)日志記錄
#log.syslog = false
#log.syslog.identity = rabbitmq
#log.syslog.level = info
#log.syslog.facility =守護(hù)進(jìn)程## ------------------------------------------------ ----------------------------
## RabbitMQ LDAP插件
##
##相關(guān)文檔指南:http://rabbitmq.com/ldap.html。
##
## ------------------------------------------------ ----------------------------#=======================================
#LDAP部分
#=======================================##
##連接到LDAP服務(wù)器
## ================================
####指定要綁定的服務(wù)器。你*必須*設(shè)置為了插件
##正常工作。
##
#auth_ldap.servers.1 =你的服務(wù)器名稱在這里##您可以定義多個(gè)服務(wù)器
#auth_ldap.servers.2 =你的其他服務(wù)器##使用TLS連接到LDAP服務(wù)器
##
#auth_ldap.use_ssl = false##指定要連接的LDAP端口
##
#auth_ldap.port = 389## LDAP連接超時(shí),以毫秒或“無限”
##
#auth_ldap.timeout =無限##或號(hào)碼
#auth_ldap.timeout = 500##啟用LDAP查詢的記錄。
##其中之一
## - false(不記錄)
## - true(詳細(xì)記錄插件使用的邏輯)
## - 網(wǎng)絡(luò)(如同,但另外記錄LDAP網(wǎng)絡(luò)流量)
##
##默認(rèn)為false。
##
#auth_ldap.log = false##也可以是真實(shí)的或網(wǎng)絡(luò)
#auth_ldap.log = true
#auth_ldap.log =網(wǎng)絡(luò)##
##認(rèn)證
## ==============
####模式將通過AMQP給出的用戶名轉(zhuǎn)換為DN
## 捆綁
##
#auth_ldap.user_dn_pattern = cn = $ {username},ou = People,dc = example,dc = com##或者,您可以將用戶名轉(zhuǎn)換為Distinguished
##綁定后通過LDAP查找命名。請(qǐng)參閱文檔
##全部細(xì)節(jié)。##通過查找將用戶名轉(zhuǎn)換為dn時(shí),將其設(shè)置為
##表示用戶名的屬性的名稱,而查找查詢的
##base DN。
##
#auth_ldap.dn_lookup_attribute = userPrincipalName
#auth_ldap.dn_lookup_base = DC = gopivotal,DC = com##控制如何綁定授權(quán)查詢,也可以
##檢索登錄用戶的詳細(xì)信息,而不顯示一個(gè)
##密碼(例如,SASL EXTERNAL)。
##其中之一
## - as_user(作為認(rèn)證用戶進(jìn)行綁定 - 需要密碼)
## - 匿名(匿名綁定)
## - {UserDN,Password}(用指定的用戶名和密碼綁定)
##
##默認(rèn)為'as_user'。
##
#auth_ldap.other_bind = as_user##或者可以更復(fù)雜:
#auth_ldap.other_bind.user_dn =用戶
#auth_ldap.other_bind.password =密碼##如果user_dn和密碼定義 - 其他選項(xiàng)被忽略。#-----------------------------
#太復(fù)雜的LDAP部分
#-----------------------------##
##授權(quán)
## =============
#### LDAP插件可以針對(duì)您的應(yīng)用程序執(zhí)行各種查詢
## LDAP服務(wù)器來確定授權(quán)的問題。
##
##相關(guān)文檔指南:http://rabbitmq.com/ldap.html#authorisation。##以下配置應(yīng)該在additional.config文件中定義
##不要處理這條線!##將查詢?cè)O(shè)置為在確定訪問虛擬主機(jī)時(shí)使用
##
## {vhost_access_query,{in_group,
##“ou = $ {vhost} -users,ou = vhosts,dc = example,dc = com”}}##設(shè)置查詢以在確定資源(例如,隊(duì)列)訪問時(shí)使用
##
## {resource_access_query,{constant,true}},##設(shè)置查詢來確定用戶擁有哪些標(biāo)簽
##
## {tag_queries,[]}
#]},
#-----------------------------
2.8、參數(shù)及策略
????????RabbitMQ 絕大大多數(shù)的配置都可以通過修改rabbitrnq.config 配置文件來完成,但是其中有些配置并不太適合在rabbitrnq.config 中去實(shí)現(xiàn)。比如某項(xiàng)配置不需要同步到集群中的其他節(jié)點(diǎn)中,或者某項(xiàng)配置需要在運(yùn)行時(shí)更改,因?yàn)閞abbitrnq.config 需要重啟Broker 才能生效。這種類型的配置在RabbitMQ 中的另一種稱呼為參數(shù)(P缸ameter) ,也可以稱之為運(yùn)行時(shí)參數(shù)(Runtime Parameter) 。英文中的"arguments" 也翻譯為參數(shù),比如channel .basicPublish 方法中的參數(shù)就是指"arguments",為了與之能夠有效地區(qū)分,后邊都使用 Parameter 或者 Runtime Parameter 的稱謂來進(jìn)行相應(yīng)的闡述。
????????Parameter 可以通過rabbitrnqctl 工具或者RabbitMQ Management 插件提供的HTTP API接口來設(shè)置。RabbitMQ 中一共有兩種類型的Parameter: vhost 級(jí)別的Parameter 和global 級(jí)別的Parameter。vhost 級(jí)別的Parameter 由一個(gè)組件名稱(component name) 、名稱(name) 和值
( value) 組成,而global 級(jí)別的參數(shù)由一個(gè)名稱和值組成,不管是vhost 級(jí)別還是global 級(jí)別的
參數(shù),其所對(duì)應(yīng)的值都是JSON 類型的。舉例來說, Federation upstream 是一個(gè)vhost 級(jí)別的
Parameter ,它用來定義Federation link 的上游信息,其對(duì)應(yīng)的Parameter 的組件名稱為
" federation-upstream" 名稱對(duì)應(yīng)于其自身的名稱,而值對(duì)應(yīng)于與上游的相關(guān)的連接參數(shù)等;對(duì)
于Shovel 而言也可以通過Parameter 設(shè)置,其對(duì)應(yīng)組件名稱為"shovel"
????????vhost 級(jí)別的參數(shù)對(duì)應(yīng)的 rabbitmq 相關(guān)的命令有三種: set_pararneter 、list_parameters 和clear_parameter。
rabbitmqctl set_parameter [-p vhost] {component_name} {name} {value}
????????用來設(shè)置一個(gè)參數(shù)。示例如下(例子中演示的Federation upstream 的Parameter 設(shè)置, 需要
先開啟rabbitmq federation 插件) :
[root@myblnp ~]# rabbitmq-plugins enable rabbitmq_federation
Enabling plugins on node rabbit@myblnp:
rabbitmq_federation
The following plugins have been configured:rabbitmq_federationrabbitmq_managementrabbitmq_management_agentrabbitmq_web_dispatch
Applying plugin configuration to rabbit@myblnp...
The following plugins have been enabled:rabbitmq_federationstarted 1 plugins.
[root@myblnp ~]#
使用 Rabbitmq_federation 插件設(shè)置參數(shù):
[root@myblnp ~]# rabbitmqctl set_parameter federation-upstream f1 '{"uri":"amqp://root:root123@192.168.56.106:5672","ack-mode":"on-confirm"}'
Setting runtime parameter "f1" for component "federation-upstream" to "{"uri":"amqp://root:root123@192.168.56.106:5672","ack-mode":"on-confirm"}" in vhost "/" ...
[root@myblnp ~]#
rabbitmqctllist_parameters [-p vhost]
#用來列出指定虛擬主機(jī)上所有的Parameter?
[root@myblnp ~]# rabbitmqctl list_parameters -p /
Listing runtime parameters for vhost "/" ...
component name value
federation-upstream f1 {"ack-mode":"on-confirm","uri":"amqp://root:root123@192.168.56.106:5672"}
[root@myblnp ~]#
rabbitmqctl clear_parameter [-p vhost] {componenet_name} {key}
#用來清除指定的參數(shù)
[root@myblnp ~]# rabbitmqctl clear_parameter -p / federation-upstream f1
Clearing runtime parameter "f1" for component "federation-upstream" on vhost "/" ...
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_parameters -p /
Listing runtime parameters for vhost "/" ...[root@myblnp ~]#
與rabbitmqctl 工具相對(duì)應(yīng)的HTTP API 接口如下所述:
- 設(shè)置一個(gè)參數(shù): PUT /api/parameters/{componenet_name}/vhost/name
- 清除一個(gè)參數(shù): DELETE? /api/parameters/{componenet_name}/vhost/name
- 列出指定vhost 中的所有參數(shù): GET /api/parameters
global 級(jí)別的 Parameter 操作
方式 | 詳細(xì)內(nèi)容 |
---|---|
rabbitmqctl | rabbitmqctl set_global_parameter name value |
rabbitmqctl list_global_parameters | |
rabbitmqctl clear_global_parameter name | |
HTTP API 接口 | PUT /api/global-parameters/name |
DELETE /api/global-parameters/name | |
GET /api/global-parameters/ |
[root@myblnp ~]# rabbitmqctl list_global_parameters
Listing global runtime parameters ...
name value
cluster_name "myblnps"
internal_cluster_id "rabbitmq-cluster-id-jpA-C8h6S2NRi300jibXlQ"
[root@myblnp ~]#
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl set_global_parameter name1 '{}'
Setting global runtime parameter "name1" to "{}" ...
[root@myblnp ~]#
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_global_parameters
Listing global runtime parameters ...
name value
cluster_name "myblnps"
internal_cluster_id "rabbitmq-cluster-id-jpA-C8h6S2NRi300jibXlQ"
name1 []
[root@myblnp ~]# rabbitmqctl clear_global_parameter name1
Clearing global runtime parameter "name1" ...
[root@myblnp ~]#
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_global_parameters
Listing global runtime parameters ...
name value
cluster_name "myblnps"
internal_cluster_id "rabbitmq-cluster-id-jpA-C8h6S2NRi300jibXlQ"
[root@myblnp ~]#
????????除了一些固定的參數(shù)(比如durable 或者exclusive) ,客戶端在創(chuàng)建交換器或者隊(duì)列的時(shí)候可以配置一些可選的屬性參數(shù)來獲得一些不同的功能,比如x-message-ttl 、x-expires 、x-max-length 等。通過客戶端設(shè)定的這些屬性參數(shù)一旦設(shè)置成功就不能再改變(不能修改也不能添加),除非刪除原來的交換器或隊(duì)列之后再重新創(chuàng)建新的。
????????Policy 的介入就可以很好的解決這類問題,它是一種特殊的Parameter 的用法。Policy 是vhost 級(jí)別的。一個(gè)Policy 可以匹配一個(gè)或者多個(gè)隊(duì)列(或者交換器,或者兩者兼有),這樣便于批量管理。與此同時(shí),Policy 也可以支持動(dòng)態(tài)地修改一些屬性參數(shù), 大大地提高了應(yīng)用的靈活度。一般來說, Policy 用來配置Federation 、鏡像、備份交換器、死信等功能。
????????rabbitmq_managemet 插件本身就提供了Policy 的支持??梢栽?#34;Admin" -> "Policies "
-> "Add / update a policy" 中添加一個(gè)Policy 。包含以下幾個(gè)參數(shù):
- Virtual host: 表示當(dāng)前Policy 所在的vhost 是哪個(gè)。
- Name : 表示當(dāng)前Policy 的名稱
- Pattern: 一個(gè)正則表達(dá)式,用來匹配相關(guān)的隊(duì)列或者交換器
- Apply to : 用來指定當(dāng)前Policy 作用于哪一方。一共有三個(gè)選項(xiàng)"Exchanges and queues" 表示作用與Pattern 所匹配的所有隊(duì)列和交換器; "Exchanges" 表示作用于與Pattern 所匹配的所有交換器; "Queues" 表示作用于與Pattern 所匹配的所有隊(duì)列
- Priority: 定義優(yōu)先級(jí)。如果有多個(gè)Policy 作用于同一個(gè)交換器或者隊(duì)列,那么Priority 最大的那個(gè)Policy 才會(huì)有用
- Definition: 定義一組或者多組鍵值對(duì),為匹配的交換器或者隊(duì)列附加相應(yīng)的功能
????????作為一種Paramter,Policy 也可以通過rabbitmqctl 工具或者HTTP API 接口來操作。與前面所講的Parameter 對(duì)應(yīng), rabbitmqctl 工具或者HTTP API 接口各種都有set 、clear 和list的功能。
rabbitmqctl set_policy [-p vhost] [--priority priority] [--apply-to apply-to] {name} {pattern}
{definition}#用來設(shè)置一個(gè)Policy。其中的參數(shù)name 、patte口和definition 是必填項(xiàng)
#示例如下,設(shè)置默認(rèn)的vhost 中所有以"^amq." 開頭的交換器為聯(lián)邦交換器:
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl set_policy --apply-to exchanges --priority 1 p1 "^amq." '{"federation-upstream":"f1"}'
Setting policy "p1" for pattern "^amq." to "{"federation-upstream":"f1"}" with priority "1" for vhost "/" ...
[root@myblnp ~]#
[root@myblnp ~]# #對(duì)應(yīng)的HTTP API 接口調(diào)用為:
[root@myblnp ~]# curl -i -u root:root123 -XPUT -d '{"pattern":"^amq\.","definition":{"federation-upstream":"f2"},"priority":2,"apply-to":"exchanges"}' http://192.168.56.106:15672/api/policies/%2F/p2
HTTP/1.1 201 Created
content-length: 0
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
date: Tue, 17 Oct 2023 02:52:49 GMT
server: Cowboy
vary: accept, accept-encoding, origin[root@myblnp ~]#
rabbitmqctl list_policies [-p vhost]
#列出默認(rèn)vhost 中所有的Policy
[root@myblnp ~]# rabbitmqctl list_policies
Listing policies for vhost "/" ...
vhost name pattern apply-to definition priority
/ AE2 ^exchange_demo$ all {"alternate-exchange":"myAE"} 0
/ p1 ^amq. exchanges {"federation-upstream":"f1"} 1
/ p2 ^amq\. exchanges {"federation-upstream":"f2"} 2
[root@myblnp ~]#
[root@myblnp ~]# #HTTP API 接口查詢
[root@myblnp ~]# curl -i -u root:root123 -XGET http://192.168.56.106:15672/api/policies/%2F
HTTP/1.1 200 OK
cache-control: no-cache
content-length: 375
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
content-type: application/json
date: Tue, 17 Oct 2023 02:56:03 GMT
server: Cowboy
vary: accept, accept-encoding, origin[{"vhost":"/","name":"AE2","pattern":"^exchange_demo$","apply-to":"all","definition":{"alternate-exchange":"myAE"},"priority":0},{"vhost":"/","name":"p1","pattern":"^amq.","apply-to":"exchanges","definition":{"federation-upstream":"f1"},"priority":1},{"vhost":"/","name":"p2","pattern":"^amq\\.","apply-to":"exchanges","definition":{"federation-upstream":"f2"},"priority":2}][root@myblnp ~]#
[root@myblnp ~]#
[root@myblnp ~]#
rabbitmqctl clear_policy [-p vhost] {name}
#清除指定的Policy
[root@myblnp ~]# rabbitmqctl clear_policy p1
Clearing policy "p1" on vhost "/" ...
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_policies
Listing policies for vhost "/" ...
vhost name pattern apply-to definition priority
/ AE2 ^exchange_demo$ all {"alternate-exchange":"myAE"} 0
/ p2 ^amq\. exchanges {"federation-upstream":"f2"} 2
[root@myblnp ~]#
[root@myblnp ~]#
[root@myblnp ~]# curl -i -u root:root123 -XDELETE http://192.168.56.106:15672/api/policies/%2F/p2
HTTP/1.1 204 No Content
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
date: Tue, 17 Oct 2023 02:58:47 GMT
server: Cowboy
vary: accept, accept-encoding, origin[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_policies
Listing policies for vhost "/" ...
vhost name pattern apply-to definition priority
/ AE2 ^exchange_demo$ all {"alternate-exchange":"myAE"} 0
[root@myblnp ~]#
特別注意:如果兩個(gè)或多個(gè)Policy 都作用到同一個(gè)交換器或者隊(duì)列上,且這些Policy 的優(yōu)先級(jí)都是一樣的,則參數(shù)項(xiàng)最多的Policy 具有決定權(quán)。如果參數(shù)一樣多,則最后添加的Policy 具有決定權(quán)。
?