日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

末学者笔记--openstack共享组件:rabbitmq(3)

發(fā)布時(shí)間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 末学者笔记--openstack共享组件:rabbitmq(3) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

openstack共享組件:消息隊(duì)列rabbitmq

一、MQ 全稱為?Message Queue, 消息隊(duì)列(?MQ )? ? ? ? ? ? ? ? ? ? ??

?

是一種應(yīng)用程序?qū)?yīng)用程序的通信方法。應(yīng)用程序通過讀寫出入隊(duì)列的消息(針對應(yīng)用程序的數(shù)據(jù))來通信,而無需專用連接來鏈接它們。

?

消息傳遞指的是程序之間通過在消息中發(fā)送數(shù)據(jù)進(jìn)行通信,而不是通過直接調(diào)用彼此來通信,直接調(diào)用通常是用于諸如遠(yuǎn)程過程調(diào)用的技術(shù)。排隊(duì)指的是應(yīng)用程序通過隊(duì)列來通信。隊(duì)列的使用除去了接收和發(fā)送應(yīng)用程序同時(shí)執(zhí)行的要求。

?

排隊(duì)指的是應(yīng)用程序通過 隊(duì)列來通信。隊(duì)列的使用除去了接收和發(fā)送應(yīng)用程序同時(shí)執(zhí)行的要求。

?

二、AMQP? ?Advanced Message Queuing Protocol? ? ? ? ? ? ? ? ? ? ?

?

高級消息隊(duì)列協(xié)議,是應(yīng)用層協(xié)議的一個(gè)開放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì)。消息中間件主要用于組件之間的解耦,消息的發(fā)送者無需知道消息使用者的存在,反之亦然。

?

AMQP 的主要特征是面向消息、隊(duì)列、路由(包括點(diǎn)對點(diǎn)和發(fā)布 / 訂閱)、可靠性、安全。

?

三、?Rabbitmq概念:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

???????屬于一個(gè)流行的開源消息隊(duì)列系統(tǒng)。屬于AMQP( 高級消息隊(duì)列協(xié)議 ) 標(biāo)準(zhǔn)的一個(gè) 實(shí)現(xiàn)。是應(yīng)用層協(xié)議的一個(gè)開放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì)。用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在 易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗。

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

???????AMQP 的主要特征是面向消息、隊(duì)列、路由(包括點(diǎn)對點(diǎn)和發(fā)布 / 訂閱)、可靠性、安全。

?

???????RabbitMQ特點(diǎn)

??  使用Erlang編寫

??  支持持久化

??  支持HA

??  提供C# , erlang,java,perl,python,ruby等的client開發(fā)端

?

四、什么是耦合、解耦合? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

(一)、耦合

1、耦合是指兩個(gè)或兩個(gè)以上的體系或兩種運(yùn)動(dòng)形式間通過相互作用而彼此影響以至聯(lián)合起來的現(xiàn)象。

?

2、在軟件工程中,對象之間的耦合度就是對象之間的依賴性。對象之間的耦合越高,維護(hù)成本越高,因此對象的設(shè)計(jì)應(yīng)使類和構(gòu)件之間的耦合最小。

?

3、分類:有軟硬件之間的耦合,還有軟件各模塊之間的耦合。耦合性是程序結(jié)構(gòu)中各個(gè)模塊之間相互關(guān)聯(lián)的度量。它取決于各個(gè)模塊之間的接口的復(fù)雜程度、調(diào)用模塊的方式以及哪些信息通過接口。

?

(二)、解耦

1、解耦,字面意思就是解除耦合關(guān)系。

?

2、在軟件工程中,降低耦合度即可以理解為解耦,模塊間有依賴關(guān)系必然存在耦合,理論上的絕對零耦合是做不到的,但可以通過一些現(xiàn)有的方法將耦合度降至最低。

?

3、設(shè)計(jì)的核心思想:盡可能減少代碼耦合,如果發(fā)現(xiàn)代碼耦合,就要采取解耦技術(shù)。讓數(shù)據(jù)模型,業(yè)務(wù)邏輯和視圖顯示三層之間彼此降低耦合,把關(guān)聯(lián)依賴降到最低,而不至于牽一發(fā)而動(dòng)全身。原則就是A功能的代碼不要寫在B的功能代碼中,如果兩者之間需要交互,可以通過接口,通過消息,甚至可以引入框架,但總之就是不要直接交叉寫。

?

五、RabbitMQ中的概念名詞? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

Broker:簡單來說就是消息隊(duì)列服務(wù)器實(shí)體。

Exchange:消息交換機(jī),它指定消息按什么規(guī)則,路由到哪個(gè)隊(duì)列。

Queue:消息隊(duì)列載體,每個(gè)消息都會(huì)被投入到一個(gè)或多個(gè)隊(duì)列。
Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來。

Routing Key:路由關(guān)鍵字, exchange根據(jù)這個(gè)關(guān)鍵字進(jìn)行消息投遞。

vhost:虛擬主機(jī),一個(gè)broker里可以開設(shè)多個(gè)vhost,用作不同用戶的權(quán)限分離。

producer:消息生產(chǎn)者,就是投遞消息的程序。

consumer:消息消費(fèi)者,就是接受消息的程序。

channel:消息通道,在客戶端的每個(gè)連接里,可建立多個(gè)channel,每個(gè)
channel代表一個(gè)會(huì)話任務(wù)。

?

六、RabbitMQ工作原理? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?

????MQ 是消費(fèi) - 生產(chǎn)者模型的一個(gè)典型的代表,一端往消息隊(duì)列中不斷寫入消息,而另一端則可以讀取或者訂閱隊(duì)列中的消息。 MQ 則是遵循了 AMQP協(xié)議的具體實(shí)現(xiàn)和產(chǎn)品。在項(xiàng)目中,將一些無需即時(shí)返回且耗時(shí)的操作提取出來,進(jìn)行了異步處理,而這種異步處理的方式大大的節(jié)省了服務(wù)器的請求響應(yīng)時(shí)間,從而提高了系統(tǒng)的吞吐量

?

?

1)客戶端連接到消息隊(duì)列服務(wù)器,打開一個(gè)channel。

2)客戶端聲明一個(gè)exchange,并設(shè)置相關(guān)屬性。

3)客戶端聲明一個(gè)queue,并設(shè)置相關(guān)屬性。

4)客戶端使用routing key,在exchange和queue之間建立好綁定關(guān)系。

5)客戶端投遞消息到exchange。

6) exchange接收到消息后,就根據(jù)消息的key和已經(jīng)設(shè)置的binding,進(jìn)
行消息路由,將消息投遞到一個(gè)或多個(gè)隊(duì)列里

?

?

?

七、Rabbitmq ?metadata? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

??????元數(shù)據(jù)可以持久化在 RAM 或 Disc. 從這個(gè)角度可以把 RabbitMQ 集群中的節(jié)點(diǎn)分成兩種 :RAM Node和 Disk Node.

?????? RAM Node 只會(huì)將元數(shù)據(jù)存放在RAM

???????Disk node 會(huì)將元數(shù)據(jù)持久化到磁盤。?

???單節(jié)點(diǎn)系統(tǒng)就沒有什么選擇了 , 只允許 disk node, 否則由于沒有數(shù)據(jù)冗余一旦重啟就會(huì)丟掉所有的配置信息 . 但在集群環(huán)境中可以選擇哪些節(jié)點(diǎn)是 RAM node.在集群中聲明(declare) 創(chuàng)建 exchange queue binding, 這類操作要等到所有的節(jié)點(diǎn)都完成創(chuàng)建才會(huì)返回 :?

???????如果是內(nèi)存節(jié)點(diǎn)就要修改內(nèi)存數(shù)據(jù) ,?

???????如果是 disk node 就要等待寫磁盤 , 節(jié)點(diǎn)過多這里的速度就會(huì)被大大的拖慢 .

????有些場景 exchang queue 相當(dāng)固定 , 變動(dòng)很少 ,那即使全都是 disc node, 也沒有什么影響 . 如果使用 Rabbitmq 做 RPC( RPC :Remote Procedure Call—遠(yuǎn)程過程調(diào)用),??RPC 或者類似 RPC 的場景這個(gè)問題就嚴(yán)重了 , 頻繁創(chuàng)建銷毀臨時(shí)隊(duì)列 , 磁盤讀寫能力就很快成為性能瓶頸了。所以 , 大多數(shù)情況下 , 我們盡量把 Node 創(chuàng)建為RAM Node. 這里就有一個(gè)問題了 , 要想集群重啟后元數(shù)據(jù)可以恢復(fù)就需要把集群元數(shù)據(jù)持久化到磁盤 , 那需要規(guī)劃 RabbitMQ 集群中的 RAM Node 和 Disc Node 。

?

????只要有一個(gè)節(jié)點(diǎn)是 Disc Node 就能提供條件把集群元數(shù)據(jù)寫到磁盤 ,RabbitMQ 的確也是這樣要求的 : 集群中只要有一個(gè) disk node 就可以 , 其它的都可以是 RAM node. 節(jié)點(diǎn)加入或退出集群一定至少要通知集群中的一個(gè) disk node 。

????如果集群中 disk node 都宕掉 , 就不要變動(dòng)集群的元數(shù)據(jù) . 聲明 exchange queue 修改用戶權(quán)限 , 添加用戶等等這些變動(dòng)在節(jié)點(diǎn)重啟之后無法恢復(fù) 。

?

????有一種情況要求所有的 disk node 都要在線情況在才能操作 , 那就是增加或者移除節(jié)點(diǎn) .RAM node 啟動(dòng)的時(shí)候會(huì)連接到預(yù)設(shè)的 disk node 下載最新的集群元數(shù)據(jù) . 如果你有兩個(gè) disk node(d1 d2), 一個(gè) RAM node 加入的時(shí)候你只告訴 d1, 而恰好這個(gè) RAM node 重啟的時(shí)候 d1 并沒有啟動(dòng) , 重啟就會(huì)失敗 . 所以加入 RAM 節(jié)點(diǎn)的時(shí)候 , 把所有的disk node 信息都告訴它 ,RAM node 會(huì)把 disk node 的信息持久化到磁盤以便后續(xù)啟動(dòng)可以按圖索驥 .

?

八、Rabbitmq 集群部署? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

(一)、前期準(zhǔn)備

?

1)條件:準(zhǔn)備3臺linux系統(tǒng),確保配置好源,及epel源

?

這里請自尋可提供服務(wù)的源做實(shí)驗(yàn);

本次實(shí)驗(yàn)使用的是一個(gè)企業(yè)內(nèi)部源,配置源的方法可能不同:

?

?

——# yum install wget

——# wget http://download2.yunwei.edu/shell/yum-repo.sh

如果解析出錯(cuò),可能是域名解析的問題,需改網(wǎng)卡配置將dns1改為企業(yè)源的域名解析服務(wù)器:

——# vim /etc/sysconfig/network-scripts/ifcfg-ens33

?

?

?

——#systemctl restart network

如果還不行,查看域名配置文件:

——#vim /etc/resolv.conf

?

保證你想用的dns服務(wù)器id在首位。

?

再下載:

——# wget http://download2.yunwei.edu/shell/yum-repo.sh

——#ls

anaconda-ks.cfg ?yum-repo.sh

——# sh ?yum-repo.sh

?

?

2)三臺機(jī)器能夠靜態(tài)解析彼此

?

在每臺主機(jī)上:

——#vim /etc/hosts

?

?

?

【注】:一定要注意解析的是三臺主機(jī)的hostname

?

3)設(shè)置可以無密鑰登陸

?

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???#自啟動(dòng)

——#systemctl start rabbitmq-server.service????#啟動(dòng)

——#systemctl status rabbitmq-server.service????#查看狀態(tài)

?

查看監(jiān)聽端口:

——#netstat -lantp | grep 5672

?

?

配置文件:

——#vim /etc/rabbitmq/rabbitmq.config

??

2node1:編輯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

?

?

3node1:將rabbittmq變量文件拷貝到其他兩節(jié)點(diǎn),之后并修改相應(yīng)節(jié)點(diǎn)的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 ,進(jìn)入界面:

?

?

5node1:可修改guest密碼為admin(默認(rèn)用戶為:guest 密碼為:guest)

——#rabbitmqctl change_password guest admin

?

6node1:添加一個(gè)openstack的用戶,并設(shè)密碼為admin。并設(shè)置權(quán)限和成為管理員

可以等實(shí)驗(yàn)做完了再添加

node1:

——#rabbitmqctl add_user openstack admin

?

——#rabbitmqctl set_permissions openstack ".*" ".*" ".*"

?

?

——#rabbitmqctl set_user_tags openstack administrator

?

?

?

7)node1發(fā)送.erlang.cookie(隱藏文件)到其他節(jié)點(diǎn)配置集群

——# 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停止應(yīng)用,并以ram的方式加入node1節(jié)點(diǎn),之后重啟應(yīng)用

——#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)登陸驗(yàn)證: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é)點(diǎn)類型(內(nèi)存型或磁盤型)

——#rabbitmqctl stop_app

——#rabbitmqctl change_cluster_node_type disc

rabbitmqctl change_cluster_node_type ram

——#rabbitmqctl start_app

?

3)從集群移除節(jié)點(diǎn)(或者重置節(jié)點(diǎn))

——#rabbitmqctl stop_app

——#rabbitmqctl reset

——#rabbitmqctl start_app

——#rabbitmqctl cluster_status

?

4)從某個(gè)節(jié)點(diǎn)移除集群中其他節(jié)點(diǎn)

?

首先請確保node3節(jié)點(diǎn)是stop的;

node1上:

——#rabbitmqctl forget_cluster_node rabbit@node3

node3上:

——#rabbitmqctl reset

——#rabbitmqctl start_app

——#rabbitmqctl cluster_status

?

?

note

1. 保證集群中至少有一個(gè)磁盤類型的節(jié)點(diǎn)以防數(shù)據(jù)丟失,在更改節(jié)點(diǎn)類型時(shí)尤其要注意。

2. 若整個(gè)集群被停掉了,應(yīng)保證最后一個(gè) down 掉的節(jié)點(diǎn)被最先啟動(dòng),若不能則要使用 forget_cluster_node 命令將其移出集群

3. 若集群中節(jié)點(diǎn)幾乎同時(shí)以不可控的方式 down 了此時(shí)在其中一個(gè)節(jié)點(diǎn)使用force_boot 命令重啟節(jié)點(diǎn)

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/feige2L/p/11089032.html

總結(jié)

以上是生活随笔為你收集整理的末学者笔记--openstack共享组件:rabbitmq(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。