RabbitMQ系列3之執行和Rabbit服務
一、理解Erlang節點和Erlang應用程式的區別
1、Erlang節點
我們的mq服務是執行在Erlang的上面。Erlang和Erlang節點相當於java中java應用程式和jvm例項的區別
當一個Erlang應用程式啟動後會有對應的一個節點的概念。Erlang也有虛擬機器,當執行erlang程式的時候一個erlang虛擬機器例項會生成,這個虛擬機器例項被我們稱為一個節點。
2、Erlang應用程式
Erlang的特別之處在於多個Erlang應用程式可以執行在一個Erlang節點上,這裡所說的Erlang應用程式我們可以理解為我們自己的mq服務例項。
3、驗證Erlang節點和Erlang應用程式的關係
3.1、啟動Erlang節點和他上面RabbitMQ服務例項
進入自己安裝的RabbitMQ的bin目錄下執行
#以後臺執行的方式啟動Erlang節點和Erlang應用程式
[[email protected] bin]# ./rabbitmq-server -detached
這是筆者RabbitMQ的web管理頁面 可以訪問並進行操作
說明:如上的 ./rabbitmq-server 啟動了Erlang節點和其上的應用程式(rabbitMQ服務)
3.2、停止Erlang應用程式(RabbitMQ服務例項)
#stop-app僅僅停止Erlang節點上的Erlang應用程式 並沒有停止Erlang節點
#驗證再次訪問RabbitMQ的web管理頁面,該頁面不存在
[ [email protected] bin]# ./rabbitmqctl stop_app
Stopping rabbit application on node [email protected] ...
#驗證Erlang節點沒有被關閉,./rabbitmq-server -detached 重新啟動Erlang節點
#會提示Erlang節點已經存在
[[email protected] bin]# ./rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
ERROR: node with name "rabbit" already running on "bogon"
#停止Erlang節點
[[email protected] bin]# ./rabbitmqctl stop
Stopping and halting node [email protected] ...
#再次重新啟動 節點和應用程式均可以正確啟動了
[[email protected] bin]# ./rabbitmq-server -detached
頁面無法訪問
4、總結
開啟服務在控制檯執行: ./rabbitmq-server
開啟服務且服務已後臺程式執行 : ./rabbitmq-server -detached
關閉服務但是不關閉節點: ./rabbitmqctl stop_app
關閉服務並關閉節點:./rabbitmqctl stop
二、RabbitMQ的配置檔案
預設使用/etc/RabbitMQ/rabbitmq.config
在服務啟動的過程中預設會載入該config檔案,來設定初始化的配置檔案
#一定要按照這種方式進行配置 不要忘記後面的config檔案
[
{ mnesia,[
{dump_log_write_threshold,1000 }
]
},
{ rabbit,[
{vm_memory_high_watermark,0.4}
]
}
].
三、RabbitMQ的使用者許可權系統設定
1、使用者相關操作
1.1 新增使用者
#新增使用者格式為
#./rabbitmqctl add_user username password
../rabbitmqctl add_user aaa bbb
1.2 檢視使用者列表
#檢視使用者列表
[[email protected] bin]# ./rabbitmqctl list_users
Listing users ...
aaa []
guest [administrator]
1.3 更改使用者密碼
#更改使用者密碼
# ./rabbitmqctl change_password username newpassword
[[email protected] bin]# ./rabbitmqctl change_password guest 123456
Changing password for user "guest" ...
1.4 刪除使用者
#刪除使用者
[[email protected] bin]# ./rabbitmqctl delete_user guest
Deleting user "guest" ...
#檢視使用者 已經只存在剛才建立的使用者了
[[email protected] bin]# ./rabbitmqctl list_users
Listing users ...
aaa []
2、使用者角色
使用者角色可分為五類,超級管理員, 監控者, 策略制定者, 普通管理者以及其他。
(1) 超級管理員(administrator)
可登陸管理控制檯(啟用management plugin的情況下),可檢視所有的資訊,並且可以對使用者,策略(policy)進行操作。
(2) 監控者(monitoring)
可登陸管理控制檯(啟用management plugin的情況下),同時可以檢視rabbitmq節點的相關資訊(程序數,記憶體使用情況,磁碟使用情況等)
(3) 策略制定者(policymaker)
可登陸管理控制檯(啟用management plugin的情況下), 同時可以對policy進行管理。但無法
與administrator的對比,administrator能看到這些內容
(4) 普通管理者(management)
僅可登陸管理控制檯(啟用management plugin的情況下),無法看到節點資訊,也無法對策略進行管理。
(5) 其他
無法登陸管理控制檯,通常就是普通的生產者和消費者。
瞭解了這些後,就可以根據需要給不同的使用者設定不同的角色,以便按需管理。
設定使用者角色的命令為:
rabbitmqctl set_user_tags User Tag
User為使用者名稱, Tag為角色名(對應於上面的administrator,monitoring,policymaker,management,或其他自定義名稱)。
也可以給同一使用者設定多個角色,例如
rabbitmqctl set_user_tags hncscwc monitoring policymaker檢視節點的相關資訊(上圖紅框標識的部分)。
#先檢視使用者列表
[[email protected] bin]# ./rabbitmqctl list_users
Listing users ...
aaa []
#設定使用者角色
[[email protected] bin]# ./rabbitmqctl set_user_tags aaa administrator
Setting tags for user "aaa" to [administrator] ...
#再次檢視使用者列表
[[email protected] bin]# ./rabbitmqctl list_users
Listing users ...
aaa [administrator]
3、許可權相關控制
2.1、RabbitMQ的許可權系統提供了三種不同的許可權控制
- 有關訊息消費的讀操作許可權
- 有關釋出訊息的寫操作許可權
- 配置佇列和交換器的許可權
2.2 許可權控制規則組成
一條許可權控制由4部分組成
- 需要許可權控制的whost
- 被授予許可權的使用者
- 需要授予的讀/寫/配置的許可權組合
- 許可權範圍(不太懂)
如下的命令即為一個許可權控制語句
VHostPath 虛擬主機命令
User 使用者
其餘的為許可權控制的許可權組合
ConfP (配置) WriteP(寫) ReadP(讀)
rabbitmqctl set_permissions -p VHostPath User ConfP WriteP ReadP
#設定使用者的許可權資訊
[[email protected] bin]# ./rabbitmqctl set_permissions -p / aaa ".*" ".*" ".*"
Setting permissions for user "aa" in vhost "/" ...
#檢視使用者的許可權資訊 可讀可寫可配置
[[email protected] bin]# ./rabbitmqctl list_user_permissions aaa
Listing permissions for user "aaa" ...
/ .* .* .*
#清除使用者在指定的vhost下的許可權資訊
[[email protected] bin]# ./rabbitmqctl clear_permissions -p / aaa
Clearing permissions for user "aaa" in vhost "/" ...
#檢視使用者的許可權資訊 已經清除
[[email protected] bin]# ./rabbitmqctl list_user_permissions aaa
Listing permissions for user "aaa" ...
------沒有任何許可權資訊-----------
四、rabbitmqctl的相關命令
補充:在liunx命令列下執行 rabbitmqctl 後面不新增任何引數 會顯示該命令下的所有可配置引數資訊
Commands:
add_user <username> <password>
add_vhost <vhost>
authenticate_user <username> <password>
await_online_nodes <count> [-t <timeout>]
cancel_sync_queue [-p <vhost>] queue
change_cluster_node_type <disc|ram>
change_password <username> <password>
clear_global_parameter <key>
clear_operator_policy [-p <vhost>] <key>
clear_parameter [-p <vhost>] <component_name> <key>
clear_password <username>
clear_permissions [-p vhost] <username>
clear_policy [-p <vhost>] <key>
clear_topic_permissions [-p vhost] <username> [<exchange>]
clear_vhost_limits [-p <vhost>]
close_all_connections [-p <vhost> --limit <limit>] [-n <node> --global] [--per-connection-delay <delay>] <explanation>
close_connection <connectionpid> <explanation>
cluster_status
decode value passphrase [--cipher cipher] [--hash hash] [--iterations iterations]
delete_queue queue_name [--if_empty|-e] [--if_unused|-u] [-t <timeout>]
delete_user <username>
delete_vhost <vhost>
encode value passphrase [--cipher cipher] [--hash hash] [--iterations iterations]
environment
eval <expr>
exec <expr> [--offline]
force_boot
force_reset
forget_cluster_node [--offline] <existing_cluster_member_node>
help <command>
hipe_compile <directory>
join_cluster [--disc|--ram] <existing_cluster_member_node>
list_bindings [-p <vhost>] [<bindinginfoitem> ...] [-t <timeout>]
list_channels [<channelinfoitem> ...]
list_ciphers
list_connections [<connectioninfoitem> ...] [-t <timeout>]
list_consumers [-p vhost] [<consumerinfoitem> ...] [-t <timeout>]
list_exchanges [-p <vhost>] [<exchangeinfoitem> ...] [-t <timeout>]
list_global_parameters [-t <timeout>]
list_hashes
list_operator_policies [-p <vhost>] [-t <timeout>]
list_parameters [-p <vhost>] [-t <timeout>]
list_permissions [-p <vhost>] [-t <timeout>]
list_policies [-p <vhost>] [-t <timeout>]
list_queues [-p <vhost>] [--online] [--offline] [--local] [<queueinfoitem> ...] [-t <timeout>]
list_topic_permissions [-p <vhost>] [-t <timeout>]
list_unresponsive_queues [--local] [--queue-timeout <queue-timeout>] [<unresponsiveq_ueueinfoitem> ...] [-t <timeout>]
list_user_permissions <username> [-t <timeout>]
list_user_topic_permissions <username> [-t <timeout>]
list_users [-t <timeout>]
list_vhost_limits [-p <vhost>] [--global]
list_vhosts [<vhostinfoitem> ...] [-t <timeout>]
node_health_check [-t <timeout>]
ping [-t <timeout>]
purge_queue <queue> [-t <timeout>]
rename_cluster_node <oldnode1> <newnode1> [oldnode2] [newnode2] ...
report
reset
restart_vhost [-p <vhost>] [-t <timeout>]
rotate_logs
set_cluster_name <name>
set_disk_free_limit <disk_limit>
set_disk_free_limit mem_relative <fraction>
set_global_parameter <name> <value>
set_operator_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
set_parameter [-p <vhost>] <component_name> <name> <value>
set_permissions [-p <vhost>] <username> <conf> <write> <read>
set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
set_topic_permissions [-p <vhost>] <username> <exchange> <write_pattern> <read_pattern>
set_user_tags <username> <tag> [...]
set_vhost_limits [-p <vhost>] <definition>
set_vm_memory_high_watermark <fraction>
set_vm_memory_high_watermark absolute <value>
shutdown
start_app
status
stop [<pidfile>]
stop_app
sync_queue [-p <vhost>] queue
trace_off [-p <vhost>]
trace_on [-p <vhost>]
update_cluster_nodes <existing_cluster_member_node_to_seed_from>
wait [<pid_file>] [--pid|-P <pid>] [-t <timeout>]
<timeout> - operation timeout in seconds. Default is "infinity".
<queueinfoitem> must be a member of the list [name, durable, auto_delete, arguments, policy, pid, owner_pid, exclusive, exclusive_consumer_pid, exclusive_consumer_tag, messages_ready, messages_unacknowledged, messages, messages_ready_ram, messages_unacknowledged_ram, messages_ram, messages_persistent, message_bytes, message_bytes_ready, message_bytes_unacknowledged, message_bytes_ram, message_bytes_persistent, head_message_timestamp, disk_reads, disk_writes, consumers, consumer_utilisation, memory, slave_pids, synchronised_slave_pids, state].
<bindinginfoitem> must be a member of the list [source_name, source_kind, destination_name, destination_kind, routing_key, arguments].
<connectioninfoitem> must be a member of the list [pid, name, port, host, peer_port, peer_host, ssl, ssl_protocol, ssl_key_exchange, ssl_cipher, ssl_hash, peer_cert_subject, peer_cert_issuer, peer_cert_validity, state, channels, protocol, auth_mechanism, user, vhost, timeout, frame_max, channel_max, client_properties, recv_oct, recv_cnt, send_oct, send_cnt, send_pend, connected_at].
<channelinfoitem> must be a member of the list [pid, connection, name, number, user, vhost, transactional, confirm, consumer_count, messages_unacknowledged, messages_uncommitted, acks_uncommitted, messages_unconfirmed, prefetch_count, global_prefetch_count].
<exchangeinfoitem> must be a member of the list [name, type, durable, auto_delete, internal, arguments, policy].
<vhostinfoitem> must be a member of the list [name, tracing, cluster_state].
<consumerinfoitem> must be a member of the list [queue_name, channel_pid, consumer_tag, ack_required, prefetch_count, arguments].
<unresponsive_queueinfoitem> must be a member of the list [name, durable, auto_delete, arguments, pid, recoverable_slaves].
1、檢視佇列資訊
#檢視當前Erlang節點下的所有佇列資訊
#顯示的列表格式為: queuenName messageCount
[[email protected] /]# rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
fanout.A 0
topic.message 0
hello 0
fanout.C 0
direct.course 0
direct.teacher 0
user 0
queueOne 1000
direct.student 0
topic.messages 0
fanout.B 0
#檢視指定vhost下的所有佇列資訊 -p 後面的引數為vhost 名稱
[[email protected] /]# rabbitmqctl list_queues -p /
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
fanout.A 0
topic.message 0
hello 0
fanout.C 0
direct.course 0
direct.teacher 0
user 0
queueOne 1000
direct.student 0
topic.messages 0
fanout.B 0
[[email protected] /]#
#檢視佇列的更多資訊 佇列的名稱(name) 是否可持久化(durable) 是否完成後自動刪除(auto_delete) arguments
[[email protected] /]# rabbitmqctl list_queues name durable auto_delete arguments
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
fanout.A true false []
topic.message true false []
hello true false []
fanout.C true false []
direct.course true false []
direct.teacher true false []
user true false []
queueOne false false []
direct.student true false []
topic.messages true false []
fanout.B true false []
2、檢視交換器資訊
#檢視所有的交換器資訊 簡單格式 交換器name 交換器型別type
[[email protected] /]# rabbitmqctl list_exchanges
Listing exchanges for vhost / ...
amq.match headers
amq.direct direct
amq.headers headers
amq.rabbitmq.trace topic
amq.fanout fanout
directExchange direct
direct
topicExchange topic
exchangeOne direct
amq.topic topic
fanoutExchange fanout
#檢視指定vhost下的交換器資訊
[[email protected] /]# rabbitmqctl list_exchanges -p /
Listing exchanges for vhost / ...
amq.match headers
amq.direct direct
amq.headers headers
amq.rabbitmq.trace topic
amq.fanout fanout
directExchange direct
direct
topicExchange topic
exchangeOne direct
amq.topic topic
fanoutExchange fanout
#檢視更多的交換器資訊屬性 交換器name 交換器type 是否持久化durable 自動刪除auto_delete
[[email protected] /]# rabbitmqctl list_exchanges -p / name, type, durable, auto_delete
Listing exchanges for vhost / ...
amq.match headers true false
amq.direct direct true false
amq.headers headers true false
amq.rabbitmq.trace topic true
amq.fanout fanout true false
directExchange direct true false
direct true false false
topicExchange topic true false
exchangeOne direct false false
amq.topic topic true false
fanoutExchange fanout true false
3、檢視繫結資訊
#檢視所有的並繫結資訊
#具體的資訊格式為 分成兩個部分
# 第一部分將所有的交換器資訊都顯示出來(所有的)
#第一部分比較混亂 主要介紹第二部分 交換器名稱 型別 繫結的佇列名稱 佇列 路由鍵 引數資訊
[[email protected] /]# rabbitmqctl list_bindings -p /
Listing bindings for vhost /...
exchange direct.course queue direct.course []
exchange direct.student queue direct.student []
exchange direct.teacher queue direct.teacher []
exchange fanout.A queue fanout.A []
exchange fanout.B queue fanout.B []
exchange fanout.C queue fanout.C []
exchange hello queue hello []
exchange queueOne queue queueOne []
exchange topic.message queue topic.message []
exchange topic.messages queue topic.messages []
exchange user queue user []
directExchange exchange direct.course queue direct.course []
directExchange exchange direct.student queue direct.student []
directExchange exchange direct.teacher queue direct.teacher []
exchangeOne exchange queueOne queue queueOne []
fanoutExchange exchange fanout.A queue []
fanoutExchange exchange fanout.B queue []
fanoutExchange exchange fanout.C queue []
topicExchange exchange topic.message queue topic.* []
topicExchange exchange topic.message queue topic.message []
五、RabbitMQ的日誌資訊
1、檢視rabbitMQ執行過程中的日誌資訊 liunx下預設在var/log/rabbitmq 下
2、AMOP中提供了一個amq.rabbitmq.log的topic交換器它根據不同的日誌級別路由傳送訊息
,我們可以宣告對應的佇列來接受訊息 並進行儲存,從而便於檢視和除錯。