RabbitMQ 是由 LShift 提供的一個 Advanced Message Queuing Protocol (AMQP) 的開源實現,由以高性能、健壯以及可伸縮性出名的 Erlang 寫成,所以也是繼承了這些優勢。html
AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。它從生產者接收消息並遞送給消費者,在這個過程當中,根據規則進行路由,緩存與持久化。node
AMQP的主要特徵是面向消息、隊列、路由(包括點對點和發佈/訂閱)、可靠性、安全。git
RabbitMQ是一個開源的AMQP實現,服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。github
Broker:簡單來講就是消息隊列服務器實體web
Exchange:消息交換機,它指定消息按什麼規則,路由到哪一個隊列shell
Queue:消息隊列載體,每一個消息都會被投入到一個或多個隊列緩存
Binding:綁定,它的做用就是把exchange和queue按照路由規則綁定起來安全
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞服務器
vhost:虛擬主機,一個broker裏能夠開設多個vhost,用做不一樣用戶的權限分離cookie
producer:消息生產者,就是投遞消息的程序
consumer:消息消費者,就是接受消息的程序
channel:消息通道,在客戶端的每一個鏈接裏,可創建多個channel,每一個channel表明一個會話任務
可靠性:包括消息持久化,消費者和生產者的消息確認
靈活路由:遵循AMQP協議,支持多種Exchange類型實現不一樣路由策略
分佈式:集羣的支持,包括本地網絡與遠程網絡
高可用性:支持主從備份與鏡像隊列
多語言支持:支持多語言的客戶端
WEB界面管理:能夠管理用戶權限,exhange,queue,binding,與實時監控
訪問控制:基於vhosts實現訪問控制
調試追蹤:支持tracing,方便調試
rabbitmq安裝分爲 rpm安裝和binary安裝,本節使用rpm安裝。官方安裝地址以下 https://www.rabbitmq.com/install-rpm.html
安裝過程當中,因爲須要安裝erlang,官網導入的yum 源文件訪問比較慢,因此果斷使用阿里雲yum 源。注意版本問題,參考這裏
$ cat /etc/yum.repos.d/rabbit.repo
[rabbitmq-erlang] name=rabbitmq-erlang baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7 gpgcheck=1 gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc repo_gpgcheck=0 enabled=1
下載rabbitmq rpm安裝文件
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-3.7.14-1.el7.noarch.rpm && yum localinstall rabbitmq-server-3.7.14-1.el7.noarch.rpm
默認會自動安裝erlang
rabbitmq默認配置文件
/usr/lib/rabbitmq/lib/rabbitmq_server-3.7.14/sbin/rabbitmq-defaults,裏面定義了數據目錄和日誌目錄等
啓動rabbitmq
systemctl start rabbitmq-server
查看進程
$ ps -ef |grep rabbitmq root 13397 16602 0 17:14 pts/0 00:00:00 grep --color=auto rabbitmq rabbitmq 26797 1 1 15:30 ? 00:01:58 /usr/lib64/erlang/erts-9.3.3.6/bin/beam.smp -W w -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -K true -- -root /usr/lib64/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.14/ebin -noshell -noinput -s rabbit boot -sname rabbit@k8s_node2 -boot start_sasl -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -sasl sasl_error_logger false -rabbit lager_log_root "/var/log/rabbitmq" -rabbit lager_default_file "/var/log/rabbitmq/rabbit@k8s_node2.log" -rabbit lager_upgrade_file "/var/log/rabbitmq/rabbit@k8s_node2_upgrade.log" -rabbit enabled_plugins_file "/etc/rabbitmq/enabled_plugins" -rabbit plugins_dir "/usr/lib/rabbitmq/plugins:/usr/lib/rabbitmq/lib/rabbitmq_server-3.7.14/plugins" -rabbit plugins_expand_dir "/var/lib/rabbitmq/mnesia/rabbit@k8s_node2-plugins-expand" -os_mon start_cpu_sup false -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/rabbit@k8s_node2" -kernel inet_dist_listen_min 25672 -kernel inet_dist_listen_max 25672 rabbitmq 27167 26797 0 15:30 ? 00:00:00 erl_child_setup 32768 rabbitmq 27191 27167 0 15:30 ? 00:00:00 inet_gethost 4 rabbitmq 27192 27191 0 15:30 ? 00:00:00 inet_gethost 4
$ netstat -ntlp | grep 5672
查看狀態
$ systemctl status rabbitmq-server.service
$ rabbitmqctl status
安裝管理插件
web管理插件 rabbitmq-plugins list #查看插件列表 rabbitmq-plugins enable rabbitmq_management 日誌跟蹤插件 rabbitmq-plugins enable rabbitmq_tracing #rabbitmq啓用trace插件 rabbitmqctl trace_on #打開trace的開關 rabbitmqctl trace_on -p test #打開trace的開關(test爲須要日誌追蹤的vhost) rabbitmqctl trace_off #關閉trace的開關 安裝rabbitmq_delayed_message_exchange(延時隊列) 默認插件目錄: cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.14/plugins/ wget https://dl.bintray.com/rabbitmq/community-plugins/rabbitmq_delayed_message_exchange-0.0.1.ez rabbitmq-plugins enable rabbitmq_delayed_message_exchange The following plugins have been enabled: rabbitmq_delayed_message_exchange Applying plugin configuration to v01-app-rabbit@localhost... started 1 plugin.
至此3臺上面的rabbitmq都已安裝完成,而且啓動正常,如今開始配置集羣服務。
日誌文件:
參考默認配置文件
rabbitmq的集羣是依附於erlang的集羣來工做的,因此必須先構建起erlang的集羣鏡像。Erlang的集羣中各節點是經由過程一個magic cookie來實現的。這個cookie存放在 ${rabbitmq_home}/.erlang.cookie 中,本節使用rpm安裝的,因此.erlang.cookie就放在/var/lib/rabbitmq/中
erlang.cookie是erlang實現分佈式的必要文件,erlang分佈式的每一個節點上要保持相同的.erlang.cookie文件,同時保證文件的權限是400,否則節點之間就沒法通訊。
打開文件而後須要先把其中的一臺服務器的.erlang.cookie中的內容複製到別的機器上,最好是複製內容,由於文件權限不對的話會出現問題。
也但是直接使用scp傳過去,記得文件權限和用戶屬主屬組如scp .erlang.cookie root@10.20.200.232:/tmp
erlang.cookie複製完成後,逐個重啓節點服務:
systemctl restart rabbitmq-server.service
添加節點到集羣
將rabbit@k8s_node1做爲集羣主節點,在節點k8s_node2和節點k8s_node3上面分別執行以下命令,以加入集羣中.
$ rabbitmqctl stop_app Stopping rabbit application on node rabbit@k8s_node3 ...
$ rabbitmqctl join_cluster rabbit@k8s_node1 Clustering node rabbit@k8s_node3 with rabbit@k8s_node1
$ rabbitmqctl start_app Starting node rabbit@k8s_node3 ... completed with 3 plugins.
查看集羣狀態
$ rabbitmqctl cluster_status Cluster status of node rabbit@k8s_node3 ... [{nodes,[{disc,[rabbit@k8s_node1,rabbit@k8s_node2,rabbit@k8s_node3]}]}, {running_nodes,[rabbit@k8s_node1,rabbit@k8s_node2,rabbit@k8s_node3]}, {cluster_name,<<"rabbit@k8s_node1">>}, {partitions,[]}, {alarms,[{rabbit@k8s_node1,[]},{rabbit@k8s_node2,[]},{rabbit@k8s_node3,[]}]}]
從集羣中移除節點:
$ rabbitmqctl stop_app Stopping rabbit application on node 'rabbit@k8s_node2'
$ rabbitmqctl reset Resetting node 'rabbit@k8s_node2'
$ rabbitmqctl start_app Starting node 'rabbit@v01-app-rabbitmq02'
RABBITMQ集羣重啓
集羣重啓時,最後一個掛掉的節點應該第一個重啓,若是因特殊緣由(好比同時斷電),而不知道哪一個節點最後一個掛掉。可用如下方法重啓:
#先在一個節點上執行 $ rabbitmqctl force_boot $ systemctl start rabbitmq-server #在其餘節點上執行 $ systemctl start rabbitmq-server #查看cluster狀態是否正常(要在全部節點上查詢)。 $ rabbitmqctl cluster_status
若是有節點沒加入集羣,能夠先退出集羣,而後再從新加入集羣。
上述方法不適合內存節點重啓,內存節點重啓的時候是會去磁盤節點同步數據,若是磁盤節點沒起來,內存節點一直失敗。
改變集羣節點類型
加入集羣時指定節點類型:
rabbitmqctl stop_app rabbitmqctl join_cluster --ram rabbit@k8s_node2 rabbitmqctl start_app
--ram 指定內存節點類型,--disc指定磁盤節點類型,默認爲磁盤節點類型
修改節點類型:
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc
rabbitmqctl start_app
haproxy.cfg
frontend rabbitMQ_cluster_frontend mode tcp option tcpka log 127.0.0.1 local0 debug bind 0.0.0.0:5672 use_backend rabbitMQ_cluster_backend backend rabbitMQ_cluster_backend balance roundrobin server rabbitmq-node1 10.20.200.231:5672 check inter 3s rise 1 fall 2 server rabbitmq-node2 10.20.200.232:5672 check inter 3s rise 1 fall 2 server rabbitmq-node3 10.20.200.233:5672 check inter 3s rise 1 fall 2
用戶角色
按照我的理解,用戶角色可分爲五類,超級管理員, 監控者, 策略制定者, 普通管理者以及其餘。
(1) 超級管理員(administrator)
可登錄管理控制檯(啓用management plugin的狀況下),可查看全部的信息,而且能夠對用戶,策略(policy)進行操做。
(2) 監控者(monitoring)
可登錄管理控制檯(啓用management plugin的狀況下),同時能夠查看rabbitmq節點的相關信息(進程數,內存使用狀況,磁盤使用狀況等)
(3) 策略制定者(policymaker)
可登錄管理控制檯(啓用management plugin的狀況下), 同時能夠對policy進行管理。但沒法查看節點的相關信息。
(4) 普通管理者(management)
僅可登錄管理控制檯(啓用management plugin的狀況下),沒法看到節點信息,也沒法對策略進行管理。
(5) 其餘
沒法登錄管理控制檯,一般就是普通的生產者和消費者。
瞭解了這些後,就能夠根據須要給不一樣的用戶設置不一樣的角色,以便按需管理。
設置用戶角色的命令爲:
rabbitmqctl set_user_tags User Tag
User爲用戶名, Tag爲角色名(對應於上面的administrator,monitoring,policymaker,management,或其餘自定義名稱)。
也能夠給同一用戶設置多個角色,例如
rabbitmqctl set_user_tags hncscwc monitoring policymaker
帳號管理
添加帳號:
$rabbitmqctl add_user admin admin
添加 權限tag
$ rabbitmqctl set_user_tags admin administrator
刪除用戶(刪除guest用戶)
$ rabbitmqctl delete_user guest Deleting user "guest" 修改用戶的密碼 $rabbitmqctl change_password Username Newpassword $ rabbitmqctl change_password admin 0GM1aol4z8GeSZY99 Changing password for user "admin" 查看當前用戶列表 $ rabbitmqctl list_users Listing users admin [administrator]
用戶權限
用戶權限指的是用戶對exchange,queue的操做權限,包括配置權限,讀寫權限。配置權限會影響到exchange,queue的聲明和刪除。
讀寫權限影響到從queue裏取消息,向exchange發送消息以及queue和exchange的綁定(bind)操做。
例如: 將queue綁定到某exchange上,須要具備queue的可寫權限,以及exchange的可讀權限;向exchange發送消息須要具備exchange的可寫權限;從queue裏取數據須要具備queue的可讀權限。詳細請參考官方文檔中"How permissions work"部分。
相關命令爲:
# 設置用戶權限 $ rabbitmqctl set_permissions -p VHostPath User ConfP WriteP ReadP # 查看(指定hostpath)全部用戶的權限信息 $ rabbitmqctl list_permissions [-p VHostPath] # 查看指定用戶的權限信息 $ rabbitmqctl list_user_permissions User_name # 清除用戶的權限信息 $ rabbitmqctl clear_permissions [-p VHostPath] User
可參考這裏
web管理
ip:15672