Centos7 安裝配置 Rabbitmq Cluster

Rabbitmq介紹

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

RabbitMQ的基礎概念

  • Broker:簡單來講就是消息隊列服務器實體web

  • Exchange:消息交換機,它指定消息按什麼規則,路由到哪一個隊列shell

  • Queue:消息隊列載體,每一個消息都會被投入到一個或多個隊列緩存

  • Binding:綁定,它的做用就是把exchange和queue按照路由規則綁定起來安全

  • Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞服務器

  • vhost:虛擬主機,一個broker裏能夠開設多個vhost,用做不一樣用戶的權限分離cookie

  • producer:消息生產者,就是投遞消息的程序

  • consumer:消息消費者,就是接受消息的程序

  • channel:消息通道,在客戶端的每一個鏈接裏,可創建多個channel,每一個channel表明一個會話任務

RabbitMQ的特性

  • 可靠性:包括消息持久化,消費者和生產者的消息確認

  • 靈活路由:遵循AMQP協議,支持多種Exchange類型實現不一樣路由策略

  • 分佈式:集羣的支持,包括本地網絡與遠程網絡

  • 高可用性:支持主從備份與鏡像隊列

  • 多語言支持:支持多語言的客戶端

  • WEB界面管理:能夠管理用戶權限,exhange,queue,binding,與實時監控

  • 訪問控制:基於vhosts實現訪問控制

  • 調試追蹤:支持tracing,方便調試

 

RabbitMQ 安裝

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配置集羣

 

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 配置

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

  

 

 

Rabbitmq 管理

用戶角色

按照我的理解,用戶角色可分爲五類,超級管理員, 監控者, 策略制定者, 普通管理者以及其餘。

(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

相關文章
相關標籤/搜索