1. 程式人生 > >RabbitMQ系列3之執行和Rabbit服務

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交換器它根據不同的日誌級別路由傳送訊息

,我們可以宣告對應的佇列來接受訊息 並進行儲存,從而便於檢視和除錯。

 

    

                                          越努力,越幸運