RabbitMQ的執行與管理
本章內容
- 節點及節點啟停
- rabbit中的許可權
- 檢視rabbit
節點及節點啟停
我們都知道Rabbit是使用Erlang語言編寫的,它有自己的一套方式。主要包含兩個概念:Erlang節點和Erlang程式。我們所講的通常意義上的節點是批Rabbit伺服器的例項。實際上,節點描述的是一個Erlang節點上執行著一個Erlang應用程式。與java語言中的jvm類似,Erlang節點也可以看作是一個虛擬機器,但不同於JVM的是多個Erlang應用程式可以執行在同一個節點之上,並且節點與節點之間可以進行本地通訊(不管是否在同一臺機器上),這使得呼叫另一個節點的程式方法時像是呼叫本地方法一樣。
啟動與停止
rabbitmq啟動節點與應用程式非常簡單,在安裝目錄下找到/sbin目錄後直接執行rabbitmq-server。這樣就啟動了節點與節點上的所有應用程式,啟動的日誌可以在預設的目錄(/var/log/rabbitmq)下找到對應的日誌檔案檢視。你也可以通過引數的方式啟動節點,例如:增加-detached引數,rabbitmq-server -detached以守護程式的方式在後臺執行。節點與應用都已經啟動了,那麼如何停止呢?如果是以非後臺執行的方式啟動的話,但按下CTRL+C時可以看到:
BREAK:(a)bort (c)ontinue 等等內容
這是節點在詢問你是想要關閉應用程式還是整個節點,又或者這只是誤操作,你還是想繼續保持執行。如果是想關閉整個節點,選擇abort即可。除此之外,我們還可以使用rabbitmqctl命令來操作,它幾乎是所有rabbitmq管理需要的一站式解決方案,當執行./sbin/rabbitmqctl stop命令時它就會和本地節點進行通訊並指示其乾淨地關閉。你也可以指定關閉的節點(包括遠端節點),只需要傳入 -n [email protected][hostname]選項即可。當你看到rabbit stoped / mnesia stoped / os-mon stoped的時候,整個節點也就完全關閉了。
上面也說了,一個節點可以執行多個應用程式,如果我只是想停止rabbitmq這一個應用程式而不是整個節點怎麼辦呢?只需要執行./rabbitmqctl stop_app即可。對應的start_app是啟動應用程式。
配置
與其它應用程式類似,rabbitmq也允許你設定系統中可調節的引數並通過配置檔案來進行設定,rabbitmq的配置檔案是etc/rabbitmq.config,其格式類似於:
[
{mnesia,[{dump_log_writetheashold,1000}]},
{rabbit,[{vm_memory_high_watermark,0.4}]}
]
- mnesia是內建在rabbitmq上的非SQL型資料庫,用來儲存交換器、佇列元資料。
- rabbit是rabbit特定的配置選項。
它們中的每一項的格式都是{[option-name],[option-value]},具體有哪些option-name請參考api【http://www.rabbitmq.com/configure.html】
RabbitMQ中的許可權
在rabbitmq中,使用者是訪問控制的基本單元,許可權控制的對像是具體的vhost,單個使用者可以跨多個vhost進行授權。
管理使用者
可以通過
rabbitmqctl add_user xiaoming 123456
來建立一個使用者名稱為xiaoming密碼為123456的使用者。
如果決定作廢一個使用者的話可以使用
rabbitmqctl delete_user xiaoming
來刪除一個使用者,但要注意的是任何引用在此使用者下的訪問控制條目都將會自動刪除並且不會警告。所以請慎重刪除使用者操作。
修改一個使用者的密碼,可以通過:
rabbitmqctl change_password xiaoming new_password
來修改密碼。
可以通過:
rabbitmqctl list_users
來檢視有哪些使用者並且每個使用者是什麼角色,其返回結果為:
Listing users ...
user tags
xiaoming []
admin [administrator]
guest [administrator]
這說明新增加的使用者還沒有角色,可以通過:
rabbitmqctl set_user_tags rabbit management
來為xiaoming使用者增加management的角色,只有添加了角色的使用者才可以訪問控制檯。
使用者角色
rabbitmq的使用者角色可以分為:
- none,不能訪問management plugin
- management,使用者可以通過AMQP做的任何事外,還可以附加如下操作:
- 列出自己可以通過AMQP登入的vhosts列表
- 檢視vhosts中的交換器、佇列及繫結資訊
- 檢視和關閉自己的channels和connnections
- 檢視所有vhosts的全域性統計資訊
- policymaker,除management可以做的事情外,還可以附加如下操作:
- 檢視、建立和刪除自己的vhosts所屬的policies和parmeters
- monitoring,除mangement可以做的事情外,還可以附加如下操作:
- 列出rabbit中的所有vhosts(也包括不是自己的vhost)
- 檢視其它使用者的channels和connections
- 檢視節點級別的資料
- 檢視所有vhosts的全域性統計資訊
- administrator,管理員許可權,也是最大的許可權角色,除policymaker和monitoring可以做的事外,還可以操作:
- 建立和刪除vhost
- 管理users
- 管理permissions
- 關閉其它使用者的connections
管理許可權
rabbitmq實現了一套訪問控制列表(ACL)風格的許可權系統,它能夠進行細粒度的控制權限,同時可以授予使用者讀、寫、配置許可權
- 讀,有關消費訊息的任何操作,包括“清除”整個佇列
- 寫,釋出訊息
- 配置,佇列和交換器的建立和刪除
我們可以通過
rabbitmqctl set_permissions -p vhost xiaoming ".*" ".*" ".*"
這種命令的方式來給使用者xiaoming賦許可權。上例中的-p vhost表示是把許可權賦到哪一個vhost上,而xiaoming就是被賦許可權的使用者。".*" ".*" ".*"指授予的許可權 對映成:配置、寫、讀。“.*”的意思就是匹配任何佇列和交換器。而下面的命令
rabbitmqctl set_permissions -p vhost xiaoming ".*" "order-.*" ".*"
意思是隻可以操作名字以order-開頭的交換器和佇列。“”空字串表示不匹配任何交換器或佇列。
可以使用:rabbitmqctl list_permissions -p vhost列出在此vhost上的使用者的許可權
如果修改一個使用者的許可權,是重新執行set_permissions命令來設定。可以使用clear_permissions命令來清除使用者在vhost上的許可權。
綜上所述,許可權控制非常容易建立並且也很靈活,你可以為某個vhost建立複雜的許可權結構,但如果這麼做的話,如果沒有單獨的文件梳理,時間久後會很不好理解。所以,如果可能的話,儘量使用vhost來分隔業務並最小化每個vhost的訪問控制條目。
檢視rabbitmq
我們可以同樣使用rabbitmqctl的相關命令來檢視rabbitmq中的一些資訊,例如
rabbitmqctl list_exchanges name type durable auto_delete
rabbitmqctl list_queues name messages consumers memory
rabbitmqctl list_bindings
等等。
日誌
在rabbit.config配置檔案中我們可以通過{log_root, "/var/log/rabbitmq"},來指定rabbitmq執行的日誌儲存位置,同時也可以通過RABBITMQ_LOG_BASE的環境變數來指定。在此檔案下會建立兩個日誌檔案:
rabbitmq_nodename-sasl.log,rabbitmq_nodename是節點的名稱一般是[email protected]_或者就是rabbit。SASL(System Application Support Libraries,系統應用程式支援庫)記錄的是Erlang相關的資訊。
rabbitmq_nodename.log,記錄對rabbitmq的操作日誌,包含連線的主機客戶端等等。
輪換日誌:伺服器啟動會重新建立日誌檔案並在舊的檔案後面新增一個數字,例如:rabbit.log.1。如果你想手動輪換日誌檔案或者通過cronjob來完成的話,可以使用如下命令:
rabbitmqctl rotate_logs suffix
其中suffix是指一個單詞,通常是一個數字,例如:
rabbitmqctl rotate_logs .1
總結
本章主要是講rabbit服務的日常管理工作是如何進行的,通過這些內容我們可以建立非系統預設的一些引數來執行rabbit,例如:我們可以新建立一個vhost和一個新使用者並賦上一些許可權。以此來使得rabbitmq在實現運用中顯示更強大的功能,滿足不同業務的需求。