玩轉(zhuǎn)RabbitMQ之五:運行與管理MQ

一、節(jié)點的概念

??在玩轉(zhuǎn)RabbitMQ之一:RabbitMQ的安裝中,曾簡單解釋過Erlang跟RabbitMQ之間的關(guān)系,我們用JVM跟Java之間的關(guān)系做了類比。

??如果你對分布式集群的概念有點理解的話,你可能經(jīng)常聽到節(jié)點這個詞,每臺服務(wù)器都可以看成是一個節(jié)點,多個節(jié)點連接在一起組成了集群,對外提供服務(wù)時好像一臺服務(wù)器一樣。分布式的流行是因為可以根據(jù)應(yīng)用程序請求壓力和容量需求,動態(tài)地為集群增加和減少節(jié)點,這種彈性的集群節(jié)點管理為系統(tǒng)性能的擴容提供了極大的便利,同時也避免了機器資源的浪費,更重要的是增強了系統(tǒng)的健壯性和殘存性,傳統(tǒng)的BS模式靠的是單一的服務(wù)器節(jié)點,一旦這臺機器掛掉,整個應(yīng)用程序就全部掛掉了,分布式集群從理論上說就算100個節(jié)點組成的集群有99個掛掉了,只要有一個節(jié)點還是正常的它就能夠?qū)ν馓峁┓?wù)。

??云計算也是在分布式的基礎(chǔ)上發(fā)展起來的,之前看過一個視頻,采訪阿里云創(chuàng)始人王堅,他對云計算做了一個很形象的比喻:讓計算資源像水龍頭供水一樣按需使用。這每一滴水,大概就像一個節(jié)點一樣,一個個節(jié)點,組成了計算資源的“水流”。

??扯遠了,回到Erlang節(jié)點,Erlang是RabbitMQ運行的環(huán)境或容器,RabbitMQ是節(jié)點上的應(yīng)用程序,RabbitMQ數(shù)據(jù)庫Mnesia也是運行在Erlang的應(yīng)用程序,如果只是RabbitMQ應(yīng)用程序崩潰了,并不會影響節(jié)點上的其他應(yīng)用程序的運行,如果是Erlang節(jié)點崩潰了,容器都掛了上面的所有應(yīng)用程序自然也會都掛掉,一般一個Erlang節(jié)點上只會運行一個RabbitMQ應(yīng)用程序和配合使用的其他應(yīng)用程序,你可以將一個RabbitMQ應(yīng)用程序稱為一個節(jié)點,但需要了解真正意義上的節(jié)點時什么含義。

Erlang節(jié)點和應(yīng)用程序

二、節(jié)點管理

1、啟動節(jié)點

??進入服務(wù)器上RabbitMQ可執(zhí)行文件目錄,執(zhí)行下面命令啟動節(jié)點:

[root@localhost huyihao]# cd /usr/sbin/
[root@localhost sbin]# rabbitmq
rabbitmqadmin     rabbitmqctl       rabbitmq-plugins  rabbitmq-server   
[root@localhost sbin]# rabbitmq-server 

              RabbitMQ 3.6.6. Copyright (C) 2007-2016 Pivotal Software, Inc.
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
  ##  ##
  ##########  Logs: /var/log/rabbitmq/rabbit@localhost.log
  ######  ##        /var/log/rabbitmq/rabbit@localhost-sasl.log
  ##########
              Starting broker...
 completed with 7 plugins.

??可以看到啟動的RabbitMQ相關(guān)的信息,使用組合鍵ctrl+c就能關(guān)閉節(jié)點,這里可以看到默認的節(jié)點名為rabbit@localhost,組成規(guī)則是nodeName@domain/ip

[root@localhost sbin]# rabbitmq-server 

              RabbitMQ 3.6.6. Copyright (C) 2007-2016 Pivotal Software, Inc.
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
  ##  ##
  ##########  Logs: /var/log/rabbitmq/rabbit@localhost.log
  ######  ##        /var/log/rabbitmq/rabbit@localhost-sasl.log
  ##########
              Starting broker...
 completed with 7 plugins.
^C
Session terminated, killing shell... ...已殺死。
[root@localhost sbin]# Stopping and halting node rabbit@localhost ...
Gracefully halting Erlang VM

??有時你不想讓一個終端窗口啟動后就被占用了,那么可以選擇后臺啟動節(jié)點:

[root@localhost sbin]# rabbitmq-server -detached
Warning: PID file not written; -detached was passed.


2、停止節(jié)點

??如果是前臺啟動的節(jié)點,可以用組合鍵ctrl+c關(guān)閉節(jié)點,如果是后臺呢?需要使用rabbitmqctl工具,對RabbitMQ進行管理時rabbitmqctl能滿足大多數(shù)需求:

[root@localhost sbin]# rabbitmqctl stop
Stopping and halting node rabbit@localhost ...


3、關(guān)閉應(yīng)用程序而不停止節(jié)點

??你可能突發(fā)奇想,既然節(jié)點上運行了多個應(yīng)用程序,那么是否能值關(guān)閉應(yīng)用程序而不停止節(jié)點,rabbitmqctl可以做到,打印信息明顯不同:

[root@localhost sbin]# rabbitmqctl stop_app
Stopping node rabbit@localhost ...


4、日志

??很幸運,順風順水成功啟動停止的節(jié)點,但有的時候節(jié)點可能發(fā)生故障,輸入的命令可能有各種報錯,這時候就需要查看日志了,從前臺啟動節(jié)點的打印輸出信息可以知道,日志的位置位于/var/log/rabbitmq,我們進入看看:

[root@localhost sbin]# cd /var/log/rabbitmq/
[root@localhost rabbitmq]# ll
總用量 28416
drwxr-xr-x. 2 root     root           6 9月  13 10:50 mnesia
-rw-r--r--. 1 rabbitmq rabbitmq       0 9月  16 10:22 rabbit_1.log
-rw-r--r--. 1 rabbitmq rabbitmq   72099 9月  15 23:40 rabbit_1.log-20180916
-rw-r--r--. 1 rabbitmq rabbitmq       0 9月  16 10:22 rabbit_1-sasl.log
-rw-r--r--. 1 rabbitmq rabbitmq   30953 9月  13 22:11 rabbit_1-sasl.log-20180916
-rw-r--r--. 1 rabbitmq rabbitmq       0 9月  16 10:22 rabbit_2.log
-rw-r--r--. 1 rabbitmq rabbitmq   60117 9月  15 23:38 rabbit_2.log-20180916
-rw-r--r--. 1 rabbitmq rabbitmq       0 9月  12 20:53 rabbit_2-sasl.log
-rw-r--r--. 1 rabbitmq rabbitmq       0 9月  16 10:22 rabbit_3.log
-rw-r--r--. 1 rabbitmq rabbitmq   10545 9月  13 22:11 rabbit_3.log-20180916
-rw-r--r--. 1 rabbitmq rabbitmq       0 9月  12 21:08 rabbit_3-sasl.log
-rw-r--r--. 1 rabbitmq rabbitmq       0 9月  26 20:28 rabbit_a.log
-rw-r--r--. 1 rabbitmq rabbitmq 3413413 9月  16 22:47 rabbit_a.log-20180926
-rw-r--r--. 1 rabbitmq rabbitmq       0 9月  26 20:28 rabbit_a-sasl.log
-rw-r--r--. 1 rabbitmq rabbitmq 5226269 9月  16 19:31 rabbit_a-sasl.log-20180926
-rw-r--r--. 1 rabbitmq rabbitmq       0 9月  26 20:28 rabbit_b.log
-rw-r--r--. 1 rabbitmq rabbitmq 1789380 9月  16 22:48 rabbit_b.log-20180926
-rw-r--r--. 1 rabbitmq rabbitmq       0 9月  26 20:28 rabbit_b-sasl.log
-rw-r--r--. 1 rabbitmq rabbitmq 5022542 9月  16 22:48 rabbit_b-sasl.log-20180926
-rw-r--r--. 1 rabbitmq rabbitmq  585944 9月  28 21:16 rabbit@localhost.log
-rw-r--r--. 1 rabbitmq rabbitmq     910 8月  15 08:02 rabbit@localhost.log-20180819.gz
-rw-r--r--. 1 rabbitmq rabbitmq    2278 8月  26 19:31 rabbit@localhost.log-20180826.gz
-rw-r--r--. 1 rabbitmq rabbitmq     656 9月   1 15:09 rabbit@localhost.log-20180902.gz
-rw-r--r--. 1 rabbitmq rabbitmq    1316 9月   2 23:36 rabbit@localhost.log-20180909.gz
-rw-r--r--. 1 rabbitmq rabbitmq    2729 9月  13 21:32 rabbit@localhost.log-20180916.gz
-rw-r--r--. 1 rabbitmq rabbitmq 7209837 9月  17 21:13 rabbit@localhost.log-20180926
-rw-r--r--. 1 rabbitmq rabbitmq 1594920 9月  28 21:16 rabbit@localhost-sasl.log
-rw-r--r--. 1 rabbitmq rabbitmq  289934 9月  17 19:59 rabbit@localhost-sasl.log-20180917.gz
-rw-r--r--. 1 rabbitmq rabbitmq 3699981 9月  17 21:13 rabbit@localhost-sasl.log-20180926
-rw-r--r--. 1 rabbitmq rabbitmq       0 9月  16 10:22 rabbit.log
-rw-r--r--. 1 rabbitmq rabbitmq   38817 9月  15 23:41 rabbit.log-20180916
-rw-r--r--. 1 rabbitmq rabbitmq       0 9月  16 10:22 rabbit-sasl.log
-rw-r--r--. 1 rabbitmq rabbitmq     802 9月  13 11:11 rabbit-sasl.log-20180916

??可以看到目錄下有很多文件,還有一個mnesia的目錄,這是RabbitMQ的數(shù)據(jù)庫數(shù)據(jù)存儲的目錄,除了rabbit@localhost.log,還看到很多前綴一樣的文件,后面帶了日期,很明顯這是對每日日志的備份,打印最近的20行rabbit@localhost.log看看:

[root@localhost rabbitmq]# tail -n 20 rabbit@localhost.log
     {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]}

=INFO REPORT==== 28-Sep-2018::21:16:22 ===
Server startup complete; 7 plugins started.
 * rabbitmq_management
 * rabbitmq_shovel
 * amqp_client
 * rabbitmq_web_dispatch
 * webmachine
 * mochiweb
 * rabbitmq_management_agent

=INFO REPORT==== 28-Sep-2018::21:16:25 ===
Stopping RabbitMQ

=INFO REPORT==== 28-Sep-2018::21:16:25 ===
stopped TCP Listener on [::]:5672

=INFO REPORT==== 28-Sep-2018::21:16:26 ===
Stopped RabbitMQ application

??可以看到RabbitMQ的命令日志,上面那一塊是啟動了一些插件,下面關(guān)閉了RabbitMQ,斷開與5672端口的鏈接,最后停止RabbitMQ應(yīng)用程序,從這里可以知道RabbitMQ默認的端口是5672,如果執(zhí)行命令時發(fā)生報錯,那么也可以在RabbitMQ日志里找到相應(yīng)的日志。

三、RabbitMQ配置

??RabbitMQ默認配置文件的目錄位于/etc/rabbitmq,在該目錄下可以看到兩個配置文件:

[root@localhost rabbitmq]# ll
總用量 8
-rw-r--r--. 1 root root   51 9月  16 22:58 enabled_plugins
-rw-r--r--. 1 root root 1752 9月  16 19:30 rabbitmq.config

??enabled_plugins看名字就知道是配置要啟用哪些RabbitMQ插件,有許多常用的插件跟RabbitMQ一起打包安裝比如管理控制臺rabbitmq_management,每個插件都有一個對應(yīng)ez文件,默認位于/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.6/plugins,從配置的內(nèi)容看啟用了三個插件。

[root@localhost rabbitmq]# cat enabled_plugins 
[amqp_client,rabbitmq_management,rabbitmq_shovel].

??rabbitmq.config是RabbitMQ的系統(tǒng)配置文件,如果沒有這個文件,則可自行創(chuàng)建,打印文件內(nèi)容,看看配置了些什么東西。

[root@localhost rabbitmq]# cat rabbitmq.config 
[
   {mnesia, [{dump_log_write_threshold, 1000}]},
   {rabbit, [{vm_memory_high_watermark, 0.4}]},
]

??配置文件的格式最外層是中括號(數(shù)組),每個配置元素都以花括號表示,每個元素的值又可能是一個數(shù)組,實際上數(shù)組允許多重嵌套,可以看到第一個配置mnesia數(shù)據(jù)庫的配置,配置了一個dump_log_write_threshold的配置項,值為1000,這個參數(shù)表示將僅限追加的日志內(nèi)容刷出/轉(zhuǎn)儲到真是數(shù)據(jù)庫文件的頻度,為什么不產(chǎn)生一條數(shù)據(jù)就馬上存儲到數(shù)據(jù)庫文件呢?而是每滿1000條就存一次,這樣做的目的是為了降低I/O(讀寫)的次數(shù),避免對系統(tǒng)性能造成影響,當然只有持久化消息才需要將數(shù)據(jù)持久化(存儲到數(shù)據(jù)庫文件中)。

??vm_memory_high_watermark為控制RabbitMQ允許消耗的內(nèi)存最大比例,這里設(shè)為0.4即最多允許MQ消耗服務(wù)器40%的內(nèi)存。

??Mnesia和Rabbit配置項羅列如下:

(1)Mnesia配置選項
配置項 默認值 描述
dump_log_write_threshold(整型) 100 將僅限追加的日志內(nèi)容刷出/轉(zhuǎn)儲至真實數(shù)據(jù)庫文件的頻度。它明確制定了在轉(zhuǎn)儲操作發(fā)生前,必須有多少個條目存儲在日志中。設(shè)置更高的數(shù)值將減少I/O負載并增加持久化消息的性能
(2)Rabbit配置選項
配置項 默認值 描述
tcp_listeners({"ip地址":端口號} 數(shù)組) [{"0.0.0.0", 5672},] 定義了RabbitMQ應(yīng)該監(jiān)聽的非SSL加密通信的IP地址和端口
ssl_listeners({"ip地址":端口號} 數(shù)組) 定義了RabbitMQ應(yīng)該監(jiān)聽的SSL加密通信的IP地址和端口
ssl_options({"鍵":值} 數(shù)組) 指定SSL相關(guān)的選項。有效的選項有cacertfile(CA證書文件)、certfile(服務(wù)器證書文件)、keyfile(服務(wù)器密鑰文件)和fail_if_no_peer_cert(需要客戶端安裝有效證書:True/False)
vm_memory_high_watermark(十進制百分數(shù)) 0.4 控制RabbitMQ允許消耗的內(nèi)存。它以十進制數(shù)值的形式明確了Rabbit允許使用的安裝內(nèi)存百分比(0.4=40%)
msg_store_file_size_limit(整型:字節(jié)) 16777216 RabbitMQ垃圾收集存儲內(nèi)容之前,消息存儲數(shù)據(jù)庫的最大大小
queue_index_max_journal_entries 262144 在轉(zhuǎn)儲到消息存儲數(shù)據(jù)庫并提交之前,消息存儲日志里的最大條目數(shù)

??除了這些配置,RabbitMQ的很多插件也是允許在配置文件中做配置并隨啟動生效的,具體的配置項要看使用的插件。

四、權(quán)限管理

??RabbitMQ的權(quán)限主要針對用戶而言,有點類似Linux的文件訪問權(quán)限,RabbitMQ的用戶權(quán)限由三部分組成:讀、寫、配置,如下表所示:

AMQP命令 配置
exchange.declare exchange
exchange.delete exchange
queue.declare queue
queue.delete queue
queue.bind queue exchange
basic.publish exchange
basic.get queue
basic.consume queue
queue.purge queue

??交換器、隊列的聲明和刪除屬于配置權(quán)限;隊列的綁定需要有對隊列的寫權(quán)限和對交換器的讀權(quán)限;消息發(fā)布到交換器上需要對交換器的寫權(quán)限;消息的獲取和消費需要隊列的讀權(quán)限;隊列的清空也屬于讀權(quán)限。

??權(quán)限管理可以對單個用戶在不同的vhost上設(shè)置不同的權(quán)限,不同的vhost上運行著不同的應(yīng)用程序,達到對用戶為不同的應(yīng)用程序設(shè)置不同級別的權(quán)限的目的,如下圖所示:

RabbitMQ權(quán)限工作原理:用戶可以為連接到RabbitMQ主機的應(yīng)用程序設(shè)置不同級別的權(quán)限(讀、寫、配置)

1、用戶管理

??要管理用戶權(quán)限先得有用戶,RabbitMQ默認的用戶是guest,密碼guest,我們使用rabbitmqctl來操作管理RabbitMQ。

??查看MQ中的用戶列表:

[root@localhost huyihao]# rabbitmqctl list_users
Listing users ...
monitor [administrator]
guest   [administrator]

??添加用戶(用戶名:huyihao,密碼:666):

[root@localhost huyihao]# rabbitmqctl add_user huyihao 666
Creating user "huyihao" ...

??重新看一下用戶列表:

[root@localhost huyihao]# rabbitmqctl list_users
Listing users ...
monitor [administrator]
huyihao []
guest   [administrator]

??刪除用戶:

[root@localhost huyihao]# rabbitmqctl delete_user huyihao
Deleting user "huyihao" ...

??哪一天你把用戶密碼忘了,需要重置:

[root@localhost huyihao]# rabbitmqctl add_user huyihao 666
Creating user "huyihao" ...
[root@localhost huyihao]# rabbitmqctl change_password huyihao 777
Changing password for user "huyihao" ...


2、虛擬主機管理與用戶授權(quán)

??RabbitMQ默認的虛擬主機是"/",查看系統(tǒng)中所有的vhost:

[root@localhost huyihao]# rabbitmqctl list_vhosts
Listing vhosts ...
/

??假設(shè)現(xiàn)在你有一個應(yīng)用要使用mq,為了跟其他原有的應(yīng)用區(qū)分開互相隔離,需要創(chuàng)建一個新的vhost:

[root@localhost huyihao]# rabbitmqctl add_vhost newapp
Creating vhost "newapp" ...

??既然每個用戶對每個vhost的權(quán)限都是獨立的,你可能好奇有沒有默認的權(quán)限之類的東西,使用下面的命令來查看用戶對每個vhosts的權(quán)限列表:

[root@localhost huyihao]# rabbitmqctl list_user_permissions huyihao
Listing permissions for user "huyihao" ...
# 默認是空的,說明新建的用戶不會對任何一個vhost(包括默認vhost)有任何操作權(quán)限!

??當MQ管理員定期想檢查某個應(yīng)用對應(yīng)的vhosts對不同用戶的授權(quán)情況如何時,可使用以下命令:

[root@localhost huyihao]# rabbitmqctl list_permissions -p newapp
Listing permissions in vhost "newapp" ...
# 默認是空的,說明新建的用戶不會對任何一個用戶(包括guest)授予任何權(quán)限!

??現(xiàn)在我們想讓新建的用戶huyihao對虛擬主機newapp授予讀寫配置的權(quán)限,可使用如下命令:

[root@localhost huyihao]# rabbitmqctl set_permissions -p newapp huyihao ".*" ".*" ".*"
Setting permissions for user "huyihao" in vhost "newapp" ...
[root@localhost huyihao]# rabbitmqctl list_permissions -p newapp
Listing permissions in vhost "newapp" ...
huyihao .*  .*  .*
[root@localhost huyihao]# rabbitmqctl list_user_permissions huyihao
Listing permissions for user "huyihao" ...
newapp  .*  .*  .*
# 授權(quán)命令的格式:rabbitmqctl set_permissions -p [vhost] [user] [配置權(quán)限] [讀權(quán)限] [寫權(quán)限]
# 授權(quán)正則表達式:
# (1)".*": 匹配任何隊列和交換器
# (2)"xx.*": 只匹配名字以xx開頭的交換器和隊列
# (3)"": 不匹配任何隊列和交換器(就是沒有權(quán)限)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么叫消息隊列? 消息(Message)是指在應(yīng)用間傳送的數(shù)據(jù)。消息可以非常簡單,比如只包含文本字符串,也可以更復(fù)...
    Agile_dev閱讀 2,438評論 0 24
  • 關(guān)于消息隊列,從前年開始斷斷續(xù)續(xù)看了些資料,想寫很久了,但一直沒騰出空,近來分別碰到幾個朋友聊這塊的技術(shù)選型,是時...
    Java機械師閱讀 594評論 0 2
  • 關(guān)于消息隊列,從前年開始斷斷續(xù)續(xù)看了些資料,想寫很久了,但一直沒騰出空,近來分別碰到幾個朋友聊這塊的技術(shù)選型,是時...
    Johnson_zx閱讀 1,157評論 0 5
  • 關(guān)于消息隊列,從前年開始斷斷續(xù)續(xù)看了些資料,想寫很久了,但一直沒騰出空,近來分別碰到幾個朋友聊這塊的技術(shù)選型,是時...
    預(yù)流閱讀 586,631評論 51 787
  • 傳我命令,誅殺軒轅家族所有血脈一 太淵國國公齊震,這一天正在神壇前偷聽太淵國國王的談話,這神壇有個功能就是能夠隨著...
    一見平天下閱讀 353評論 0 1

友情鏈接更多精彩內(nèi)容