openstack共享服務組件-Rabbitmq消息隊列概念及配置

隊列(MQ)概念:

MQ 全稱爲 Message Queue, 消息隊列( MQ )

是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們。

消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。排隊指的是應用程序通過隊列來通信。隊列的使用除去了接收和發送應用程序同時執行的要求。

排隊指的是應用程序通過 隊列來通信。隊列的使用除去了接收和發送應用程序同時執行的要求。

AMQP
即 Advanced Message Queuing Protocol
高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。

AMQP 的主要特徵是面向消息、隊列、路由(包括點對點和發佈 / 訂閱)、可靠
性、安全。

Rabbitmq概念:

屬於一個流行的開源消息隊列系統。屬於AMQP( 高級消息隊列協議 ) 標準的一個 實現。是應用層協議的一個開放標準,爲面向消息的中間件設計。用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。

消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。

AMQP 的主要特徵是面向消息、隊列、路由(包括點對點和發佈 / 訂閱)、可靠性、安全。

RabbitMQ特點

使用Erlang編寫
支持持久化
支持HA
提供C# , erlang,java,perl,python,ruby等的client開發端

RabbitMQ中的概念名詞

Broker:簡單來說就是消息隊列服務器實體。

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

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

Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。

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

vhost:虛擬主機,一個broker裏可以開設多個vhost,用作不同用戶的權限分離 。

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

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

channel:消息通道,在客戶端的每個連接裏,可建立多個channel,每個channel代表一個會話任務。

RabbitMQ工作原理

MQ 是消費 - 生產者模型的一個典型的代表,一端往消息隊列中不斷寫入消息,而另一端則可以讀取或者訂閱隊列中的消息。 MQ 則是遵循了 AMQP協議的具體實現和產品。在項目中,將一些無需即時返回且耗時的操作提取出來,進行了異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提高了系統的吞吐量。
在這裏插入圖片描述

( 1)客戶端連接到消息隊列服務器,打開一個channel。
( 2)客戶端聲明一個exchange,並設置相關屬性。
( 3)客戶端聲明一個queue,並設置相關屬性。
( 4)客戶端使用routing key,在exchange和queue之間建立好綁定關係。
( 5)客戶端投遞消息到exchange。
( 6) exchange接收到消息後,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列裏

在這裏插入圖片描述

Rabbitmq 的 metadata(元數據)

元數據可以持久化在 RAM 或 Disc. 從這個角度可以把 RabbitMQ 集羣中的節點分成兩種 :RAM Node和 Disk Node.

RAM Node 只會將元數據存放在RAM Disk node 會將元數據持久化到磁盤。

單節點系統就沒有什麼選擇了 , 只允許 disk node, 否則由於沒有數據冗餘一旦重啓就會丟掉所有的配置信息 . 但在集羣環境中可以選擇哪些節點是 RAM node.

在集羣中聲明 (declare) 創建 exchange queue binding, 這類操作要等到所有的節點都完成創建纔會返回 :
如果是內存節點就要修改內存數據 ,
如果是 disk node 就要等待寫磁盤 , 節點過多這裏的速度就會被大大的拖慢 .

有些場景 exchang queue 相當固定 , 變動很少 ,那即使全都是 disc node, 也沒有什麼影響 . 如果使用 Rabbitmq 做 RPC( RPC :Remote Procedure Call—遠程過程調用), RPC 或者類似 RPC 的場景這個問題就嚴重了 , 頻繁創建銷燬臨時隊列 , 磁盤讀寫能力就很快成爲性能瓶頸了。所以 , 大多數情況下 , 我們儘量把 Node 創建爲RAM Node. 這裏就有一個問題了 , 要想集羣重啓後元數據可以恢復就需要把集羣元數據持久化到磁盤 , 那需要規劃 RabbitMQ 集羣中的 RAM Node 和 Disc Node 。

只要有一個節點是 Disc Node 就能提供條件把集羣元數據寫到磁盤 ,RabbitMQ 的確也是這樣要求的 : 集羣中只要有一個 disk node 就可以 , 其它的都可以是 RAMnode. 節點加入或退出集羣一定至少要通知集羣中的一個 disk node 。

如果集羣中 disk node 都宕掉 , 就不要變動集羣的元數據 . 聲明 exchange queue修改用戶權限 , 添加用戶等等這些變動在節點重啓之後無法恢復 。

有一種情況要求所有的 disk node 都要在線情況在才能操作 , 那就是增加或者移除節點 .RAM node 啓動的時候會連接到預設的 disk node 下載最新的集羣元數據 . 如果你有兩個 disk node(d1 d2), 一個 RAM node 加入的時候你只告訴 d1, 而恰好這個RAM node 重啓的時候 d1 並沒有啓動 , 重啓就會失敗 . 所以加入 RAM 節點的時候 ,把所有的disk node 信息都告訴它 ,RAM node 會把 disk node 的信息持久化到磁盤以便後續啓動可以按圖索驥 .

配置

環境準備:3臺centos7.3
pikachu1:ip 192.168.146.51
pikachu2:ip 192.168.146.52
pikachu3:ip 192.168.146.53
並且每臺機器都添加相互的域名解析,和免密登錄(關閉防火牆)

#yum install -y erlang rabbitmq-server.noarch
#systemctl enable rabbitmq-server.service
#systemctl start rabbitmq-server.service
#systemctl status rabbitmq-server.service

查看監聽端口:
#netstat -lantp | grep 5672
產看端口號的服務
#lsof -i:5672
配置文件:/etc/rabbitmq/rabbitmq.config

pikachu1:

修改guest密碼爲admin(默認用戶爲:guest 密碼爲:guest)
#rabbitmqctl change_password guest admin
-
創建rabbittmq變量文件
#vim /etc/rabbitmq/rabbitmq-env.conf
-
RABBITMQ_NODE_PORT=5672
ulimit -S -n 4096
RABBITMQ_SERVER_ERL_ARGS="+K true +A30 +P 1048576 -kernel inet_default_connect_options [{nodelay,true},{raw,6,18,<<5000:64/native>>}] -kernel inet_default_listen_options [{raw,6,18,<<5000:64/native>>}]"
RABBITMQ_NODE_IP_ADDRESS=192.168.146.51
-
將rabbittmq變量文件拷貝到其他兩節點,之後並修改相應節點的ip
#scp /etc/rabbitmq/rabbitmq-env.conf pikachu2:/etc/rabbitmq/
#scp /etc/rabbitmq/rabbitmq-env.conf pikachu3:/etc/rabbitmq/
-
查看rabbitmq插件
#/usr/lib/rabbitmq/bin/rabbitmq-plugins list

在這裏插入圖片描述

所有node 開啓rabbitmq的web管理頁面
centos7.3以上
#rabbitmq-plugins enable rabbitmq_management
centos7.3以下
/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management mochiweb webmachine rabbitmq_web_dispatch amqp_client rabbitmq_management_agent

在這裏插入圖片描述

#systemctl restart rabbitmq-server.service
#systemctl status rabbitmq-server.service
-
檢查集羣狀態
#rabbitmqctl cluster_status

在這裏插入圖片描述

pikachu1發送erlang.cookie到其他節點配置集羣
(在pikachu1上佈置集羣)
#scp /var/lib/rabbitmq/.erlang.cookie pikachu2:/var/lib/rabbitmq/.erlang.cookie
#scp /var/lib/rabbitmq/.erlang.cookie pikachu3:/var/lib/rabbitmq/.erlang.cookie
-
pikachu2、pikachu3:
pikachu2和pikachu3停止應用(停止消息隊列的應用),並以ram的方式加入pikachu1節點,之後重啓應用
#systemctl restart rabbitmq-server.service
#rabbitmqctl stop_app

在這裏插入圖片描述

#rabbitmqctl join_cluster --ram rabbit@pikachu1
#rabbitmqctl start_app

在這裏插入圖片描述

登陸驗證:http://192.168.146.51:15672/#/             guest/admin

其他命令:
(1)添加管理員:

#rabbitmqctl add_user mqadmin mqadmin
#rabbitmqctl set_user_tags mqadmin administrator
#rabbitmqctl set_permissions -p / mqadmin ".*" ".*" ".*"

(2)更改節點類型(內存型或磁盤型)

#rabbitmqctl stop_app
#rabbitmqctl change_cluster_node_type disc 或 rabbitmqctl change_cluster_node_type ram
#rabbitmqctl start_app

(3)從集羣移除節點(或者重置節點)

#rabbitmqctl stop_app
#rabbitmqctl reset
#rabbitmqctl start_app
#rabbitmqctl cluster_status

(4)從某個節點移除集羣中其他節點

#rabbitmqctl forget_cluster_node rabbit@node3(node3要先stop_app)
#rabbitmqctl reset
#rabbitmqctl start_app
#rabbitmqctl cluster_status
  1. 保證集羣中至少有一個磁盤類型的節點以防數據丟失,在更改節點類型時尤其要注意。
  2. 若整個集羣被停掉了,應保證最後一個 down 掉的節點被最先啓動,若不能則要使用 forget_cluster_node 命令將其移出集羣
  3. 若集羣中節點幾乎同時以不可控的方式 down 了此時在其中一個節點使用 force_boot 命令重啓節點
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章