末学者笔记--openstack共享组件:rabbitmq(3)
?
openstack共享組件:消息隊列rabbitmq
一、MQ 全稱為?Message Queue, 消息隊列(?MQ )? ? ? ? ? ? ? ? ? ? ??
?
是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數(shù)據(jù))來通信,而無需專用連接來鏈接它們。
?
消息傳遞指的是程序之間通過在消息中發(fā)送數(shù)據(jù)進行通信,而不是通過直接調(diào)用彼此來通信,直接調(diào)用通常是用于諸如遠程過程調(diào)用的技術。排隊指的是應用程序通過隊列來通信。隊列的使用除去了接收和發(fā)送應用程序同時執(zhí)行的要求。
?
排隊指的是應用程序通過 隊列來通信。隊列的使用除去了接收和發(fā)送應用程序同時執(zhí)行的要求。
?
二、AMQP? 即?Advanced Message Queuing Protocol? ? ? ? ? ? ? ? ? ? ?
?
高級消息隊列協(xié)議,是應用層協(xié)議的一個開放標準,為面向消息的中間件設計。消息中間件主要用于組件之間的解耦,消息的發(fā)送者無需知道消息使用者的存在,反之亦然。
?
AMQP 的主要特征是面向消息、隊列、路由(包括點對點和發(fā)布 / 訂閱)、可靠性、安全。
?
三、?Rabbitmq概念:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
???????屬于一個流行的開源消息隊列系統(tǒng)。屬于AMQP( 高級消息隊列協(xié)議 ) 標準的一個 實現(xiàn)。是應用層協(xié)議的一個開放標準,為面向消息的中間件設計。用于在分布式系統(tǒng)中存儲轉發(fā)消息,在 易用性、擴展性、高可用性等方面表現(xiàn)不俗。
???????消息中間件主要用于組件之間的解耦,消息的發(fā)送者無需知道消息使用者的存在,反之亦然。
???????AMQP 的主要特征是面向消息、隊列、路由(包括點對點和發(fā)布 / 訂閱)、可靠性、安全。
?
???????RabbitMQ特點:
?? 使用Erlang編寫
?? 支持持久化
?? 支持HA
?? 提供C# , erlang,java,perl,python,ruby等的client開發(fā)端
?
四、什么是耦合、解耦合? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
(一)、耦合
1、耦合是指兩個或兩個以上的體系或兩種運動形式間通過相互作用而彼此影響以至聯(lián)合起來的現(xiàn)象。
?
2、在軟件工程中,對象之間的耦合度就是對象之間的依賴性。對象之間的耦合越高,維護成本越高,因此對象的設計應使類和構件之間的耦合最小。
?
3、分類:有軟硬件之間的耦合,還有軟件各模塊之間的耦合。耦合性是程序結構中各個模塊之間相互關聯(lián)的度量。它取決于各個模塊之間的接口的復雜程度、調(diào)用模塊的方式以及哪些信息通過接口。
?
(二)、解耦
1、解耦,字面意思就是解除耦合關系。
?
2、在軟件工程中,降低耦合度即可以理解為解耦,模塊間有依賴關系必然存在耦合,理論上的絕對零耦合是做不到的,但可以通過一些現(xiàn)有的方法將耦合度降至最低。
?
3、設計的核心思想:盡可能減少代碼耦合,如果發(fā)現(xiàn)代碼耦合,就要采取解耦技術。讓數(shù)據(jù)模型,業(yè)務邏輯和視圖顯示三層之間彼此降低耦合,把關聯(lián)依賴降到最低,而不至于牽一發(fā)而動全身。原則就是A功能的代碼不要寫在B的功能代碼中,如果兩者之間需要交互,可以通過接口,通過消息,甚至可以引入框架,但總之就是不要直接交叉寫。
?
五、RabbitMQ中的概念名詞? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
Broker:簡單來說就是消息隊列服務器實體。
Exchange:消息交換機,它指定消息按什么規(guī)則,路由到哪個隊列。
Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。
Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來。
Routing Key:路由關鍵字, exchange根據(jù)這個關鍵字進行消息投遞。
vhost:虛擬主機,一個broker里可以開設多個vhost,用作不同用戶的權限分離。
producer:消息生產(chǎn)者,就是投遞消息的程序。
consumer:消息消費者,就是接受消息的程序。
channel:消息通道,在客戶端的每個連接里,可建立多個channel,每個
channel代表一個會話任務。
?
六、RabbitMQ工作原理? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?
????MQ 是消費 - 生產(chǎn)者模型的一個典型的代表,一端往消息隊列中不斷寫入消息,而另一端則可以讀取或者訂閱隊列中的消息。 MQ 則是遵循了 AMQP協(xié)議的具體實現(xiàn)和產(chǎn)品。在項目中,將一些無需即時返回且耗時的操作提取出來,進行了異步處理,而這種異步處理的方式大大的節(jié)省了服務器的請求響應時間,從而提高了系統(tǒng)的吞吐量。
?
?
( 1)客戶端連接到消息隊列服務器,打開一個channel。
( 2)客戶端聲明一個exchange,并設置相關屬性。
( 3)客戶端聲明一個queue,并設置相關屬性。
( 4)客戶端使用routing key,在exchange和queue之間建立好綁定關系。
( 5)客戶端投遞消息到exchange。
( 6) exchange接收到消息后,就根據(jù)消息的key和已經(jīng)設置的binding,進
行消息路由,將消息投遞到一個或多個隊列里
?
?
?
七、Rabbitmq 的?metadata? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
??????元數(shù)據(jù)可以持久化在 RAM 或 Disc. 從這個角度可以把 RabbitMQ 集群中的節(jié)點分成兩種 :RAM Node和 Disk Node.
?????? RAM Node 只會將元數(shù)據(jù)存放在RAM
???????Disk node 會將元數(shù)據(jù)持久化到磁盤。?
???單節(jié)點系統(tǒng)就沒有什么選擇了 , 只允許 disk node, 否則由于沒有數(shù)據(jù)冗余一旦重啟就會丟掉所有的配置信息 . 但在集群環(huán)境中可以選擇哪些節(jié)點是 RAM node.在集群中聲明(declare) 創(chuàng)建 exchange queue binding, 這類操作要等到所有的節(jié)點都完成創(chuàng)建才會返回 :?
???????如果是內(nèi)存節(jié)點就要修改內(nèi)存數(shù)據(jù) ,?
???????如果是 disk node 就要等待寫磁盤 , 節(jié)點過多這里的速度就會被大大的拖慢 .
????有些場景 exchang queue 相當固定 , 變動很少 ,那即使全都是 disc node, 也沒有什么影響 . 如果使用 Rabbitmq 做 RPC( RPC :Remote Procedure Call—遠程過程調(diào)用),??RPC 或者類似 RPC 的場景這個問題就嚴重了 , 頻繁創(chuàng)建銷毀臨時隊列 , 磁盤讀寫能力就很快成為性能瓶頸了。所以 , 大多數(shù)情況下 , 我們盡量把 Node 創(chuàng)建為RAM Node. 這里就有一個問題了 , 要想集群重啟后元數(shù)據(jù)可以恢復就需要把集群元數(shù)據(jù)持久化到磁盤 , 那需要規(guī)劃 RabbitMQ 集群中的 RAM Node 和 Disc Node 。
?
????只要有一個節(jié)點是 Disc Node 就能提供條件把集群元數(shù)據(jù)寫到磁盤 ,RabbitMQ 的確也是這樣要求的 : 集群中只要有一個 disk node 就可以 , 其它的都可以是 RAM node. 節(jié)點加入或退出集群一定至少要通知集群中的一個 disk node 。
????如果集群中 disk node 都宕掉 , 就不要變動集群的元數(shù)據(jù) . 聲明 exchange queue 修改用戶權限 , 添加用戶等等這些變動在節(jié)點重啟之后無法恢復 。
?
????有一種情況要求所有的 disk node 都要在線情況在才能操作 , 那就是增加或者移除節(jié)點 .RAM node 啟動的時候會連接到預設的 disk node 下載最新的集群元數(shù)據(jù) . 如果你有兩個 disk node(d1 d2), 一個 RAM node 加入的時候你只告訴 d1, 而恰好這個 RAM node 重啟的時候 d1 并沒有啟動 , 重啟就會失敗 . 所以加入 RAM 節(jié)點的時候 , 把所有的disk node 信息都告訴它 ,RAM node 會把 disk node 的信息持久化到磁盤以便后續(xù)啟動可以按圖索驥 .
?
八、Rabbitmq 集群部署? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
(一)、前期準備
?
(1)條件:準備3臺linux系統(tǒng),確保配置好源,及epel源
?
這里請自尋可提供服務的源做實驗;
本次實驗使用的是一個企業(yè)內(nèi)部源,配置源的方法可能不同:
?
?
——# yum install wget
——# wget http://download2.yunwei.edu/shell/yum-repo.sh
如果解析出錯,可能是域名解析的問題,需改網(wǎng)卡配置將dns1改為企業(yè)源的域名解析服務器:
——# vim /etc/sysconfig/network-scripts/ifcfg-ens33
?
?
?
——#systemctl restart network
如果還不行,查看域名配置文件:
——#vim /etc/resolv.conf
?
保證你想用的dns服務器id在首位。
?
再下載:
——# wget http://download2.yunwei.edu/shell/yum-repo.sh
——#ls
anaconda-ks.cfg ?yum-repo.sh
——# sh ?yum-repo.sh
?
?
(2)三臺機器能夠靜態(tài)解析彼此
?
在每臺主機上:
——#vim /etc/hosts
?
?
?
【注】:一定要注意解析的是三臺主機的hostname
?
(3)設置可以無密鑰登陸
?
在node1上:
——#ssh-keygen
。。。。。。
——#ssh-copy-id ?node2
——#ssh-copy-id ?node3
?
?
(二)、安裝過程:
?
(1)所有node安裝rabbtimq和erlang軟件包:
?
——#yum install -y erlang rabbitmq-server.noarch
——#systemctl enable rabbitmq-server.service???#自啟動
——#systemctl start rabbitmq-server.service????#啟動
——#systemctl status rabbitmq-server.service????#查看狀態(tài)
?
查看監(jiān)聽端口:
——#netstat -lantp | grep 5672
?
?
配置文件:
——#vim /etc/rabbitmq/rabbitmq.config
??
(2)node1:編輯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.249.30
?
?
(3)node1:將rabbittmq變量文件拷貝到其他兩節(jié)點,之后并修改相應節(jié)點的ip
——#scp /etc/rabbitmq/rabbitmq-env.conf??node2:/etc/rabbitmq/
——#scp /etc/rabbitmq/rabbitmq-env.conf ?node3:/etc/rabbitmq/
?
查看rabbitmq插件:
?
——#/usr/lib/rabbitmq/bin/rabbitmq-plugins list
?
?
(4)所有node 開啟rabbitmq的web管理頁面
?
/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management mochiweb webmachine rabbitmq_web_dispatch amqp_client rabbitmq_management_agent
或者:——#rabbitmq-plugins enable rabbitmq_management
?
?
?
——#systemctl restart rabbitmq-server.service
查看是否開啟:
——#/usr/lib/rabbitmq/bin/rabbitmq-plugins list
?
?
——#systemctl status rabbitmq-server.service
?
網(wǎng)頁登陸:192.168.249.30:15672
?
?
輸入用戶:guest,密碼:guest ,進入界面:
?
?
(5)node1:可修改guest密碼為admin(默認用戶為:guest 密碼為:guest)
——#rabbitmqctl change_password guest admin
?
(6)node1:添加一個openstack的用戶,并設密碼為admin。并設置權限和成為管理員
【可以等實驗做完了再添加】
node1:
——#rabbitmqctl add_user openstack admin
?
——#rabbitmqctl set_permissions openstack ".*" ".*" ".*"
?
?
——#rabbitmqctl set_user_tags openstack administrator
?
?
?
(7)node1發(fā)送.erlang.cookie(隱藏文件)到其他節(jié)點配置集群
——# rabbitmqctl cluster_status
?
?
#scp /var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/.erlang.cookie
#scp /var/lib/rabbitmq/.erlang.cookie node3:/var/lib/rabbitmq/.erlang.cookie
?
?
?
(8)node2和node3停止應用,并以ram的方式加入node1節(jié)點,之后重啟應用
——#systemctl restart rabbitmq-server.service
——#rabbitmqctl stop_app
——#rabbitmqctl join_cluster --ram rabbit@node1???#這里要寫node1的名字
——#rabbitmqctl start_app
?
(9)node1檢查集群狀態(tài)
——# rabbitmqctl cluster_status
?
(10)登陸驗證:http://192.168.249.30:15672?????????guest/admin
?
?
?
?
?
其他命令:
(1)添加管理員:
rabbitmqctl add_user mqadmin mqadmin
rabbitmqctl set_user_tags mqadmin administrator
rabbitmqctl set_permissions -p / mqadmin ".*" ".*" ".*"
?
(2)更改節(jié)點類型(內(nèi)存型或磁盤型)
——#rabbitmqctl stop_app
——#rabbitmqctl change_cluster_node_type disc
或 rabbitmqctl change_cluster_node_type ram
——#rabbitmqctl start_app
?
(3)從集群移除節(jié)點(或者重置節(jié)點)
——#rabbitmqctl stop_app
——#rabbitmqctl reset
——#rabbitmqctl start_app
——#rabbitmqctl cluster_status
?
(4)從某個節(jié)點移除集群中其他節(jié)點
?
首先請確保node3節(jié)點是stop的;
在node1上:
——#rabbitmqctl forget_cluster_node rabbit@node3
在node3上:
——#rabbitmqctl reset
——#rabbitmqctl start_app
——#rabbitmqctl cluster_status
?
?
【note】:
1. 保證集群中至少有一個磁盤類型的節(jié)點以防數(shù)據(jù)丟失,在更改節(jié)點類型時尤其要注意。
2. 若整個集群被停掉了,應保證最后一個 down 掉的節(jié)點被最先啟動,若不能則要使用 forget_cluster_node 命令將其移出集群
3. 若集群中節(jié)點幾乎同時以不可控的方式 down 了此時在其中一個節(jié)點使用force_boot 命令重啟節(jié)點
?
?
轉載于:https://www.cnblogs.com/feige2L/p/11089032.html
總結
以上是生活随笔為你收集整理的末学者笔记--openstack共享组件:rabbitmq(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。