1 概述
1.1 認(rèn)識(shí)消息隊(duì)列
message queue 簡(jiǎn)稱MQ,是一種跨進(jìn)程的通信機(jī)制,用于上下游傳遞信息
MQ作為消息的中間件,最主要的作用是各個(gè)系統(tǒng)之間的消息傳遞進(jìn)行"解耦",mq是數(shù)據(jù)可靠性的重要保證
1.2 什么是rabbitMq
rabbitmq是全世界最火的開(kāi)源代理服務(wù)器,再全世界有35000個(gè)項(xiàng)目部署再rabbitMq
rabbitmq 幾乎支持所有的操作系統(tǒng)與編程語(yǔ)言
rabbitmq提供了高并發(fā),高可用的部署方案,支持多種消息協(xié)議,容易部署和維護(hù)
1.3 rabbitmq 和其他mq比較
rabbitmqactivemqkafkarocketmq
社區(qū)活躍度非常活躍非常活躍活躍不活躍
持久化支持支持支持支持
并發(fā)吞吐量高一般極高極高
數(shù)據(jù)可靠性極高一般高高
生態(tài)完整性很好很好很好一般
用戶總量多多==>一般較多少
應(yīng)用場(chǎng)景分布式 高可靠的交易系統(tǒng)傳統(tǒng)業(yè)務(wù)系統(tǒng)日志處理和大數(shù)據(jù)應(yīng)用互聯(lián)網(wǎng)高并發(fā),高可用
2 安裝
基于docker 安裝rabbitmq#指定版本溶弟,該版本包含了web控制頁(yè)面
docker pull rabbitmq:management
#方式一:默認(rèn)guest 用戶绽榛,密碼也是 guest
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management
#方式二:設(shè)置用戶名和密碼
docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:management
方式三:jar包安裝
1 下載esl-erlang_21.0-1~centos~7_amd64.rpm**
– Erlang運(yùn)行環(huán)境RPM包
2. 下載rabbitmq-server-3.7.7-1.el7.noarch.rpm**
– rabbitmq服務(wù)器程序
3. mkdir /usr/local/temp*
4. cd /usr/local/temp**
5. 通過(guò)XFTP將文件上傳至temp目錄**
6. rpm -ivh --nodeps esl-erlang_21.0-1~centos~7_amd64.rpm**
安裝RPM包
7.rpm -ivh --nodeps rabbitmq-server-3.7.7-1.el7.noarch.rpm**
8. rabbitmq-plugins enable rabbitmq_management**
啟用控制臺(tái)
9. rabbitmq-server
10. chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie**
啟用服務(wù)
11. 防火墻放行5672/15672端口
訪問(wèn)
3 常用命令
3.1啟動(dòng)和關(guān)閉
rabbitmq-server 前臺(tái)啟動(dòng)服務(wù)
rabbitmq-server -detached 后臺(tái)啟動(dòng)服務(wù)
rabbitmqctl stop 停止服務(wù)
3.2 終止和啟動(dòng)應(yīng)用
rabbitmqctl start_app 啟動(dòng)應(yīng)用
rabbitmqctl stop_app 終止應(yīng)用
3.3 用戶管理
rabbitmqctl add_user {username} {password}
– 創(chuàng)建新用戶
rabbitmqctl delete_user {username}
– 刪除用戶
rabbitmqctl change_password {username} {newpassword}
– 重置密碼
rabbitmqctl set_user_tags {username} {tag}
– 授予用戶角色(Tag)
rabbitmqctl set_permissions -p / user_admin '.' '.' '.*'
– 設(shè)置用戶允許訪問(wèn)的vhost
3.4 rabbitmq 四種tag
超級(jí)管理員(administrator)
– 可登陸管理控制臺(tái)(啟用management plugin的情況下),可查看所有 的信息胳徽,并且可以對(duì)用戶积锅,策略(policy)進(jìn)行操作爽彤。
監(jiān)控者(monitoring)
– 登陸管理控制臺(tái)(啟用management plugin的情況下),同時(shí)可以查看 rabbitmq節(jié)點(diǎn)的相關(guān)信息(進(jìn)程數(shù)缚陷,內(nèi)存使用情況适篙,磁盤使用情況等)
策略制定者(policymaker)
– 可登陸管理控制臺(tái)(啟用management plugin的情況下), 同時(shí)可以對(duì) policy進(jìn)行管理。但無(wú)法查看節(jié)點(diǎn)的相關(guān)信息(上圖紅框標(biāo)識(shí)的部分)
普通管理者(management)
僅可登陸管理控制臺(tái)(啟用management plugin的情況下)箫爷,無(wú)法看到 節(jié)點(diǎn)信息嚷节,也無(wú)法對(duì)策略進(jìn)行管理。
4 第一次MQ通信
4.1 AMQP
AMQP虎锚,即Advanced Message Queuing Protocol,一個(gè)提供統(tǒng) 一消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)高級(jí)消息隊(duì)列協(xié)議,是應(yīng)用層協(xié)議的一個(gè)開(kāi) 放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì)硫痰。基于此協(xié)議的客戶端與消息中間 件可傳遞消息窜护,并不受客戶端/中間件不同產(chǎn)品效斑,不同的開(kāi)發(fā)語(yǔ)言等 條件的限制。Erlang中的實(shí)現(xiàn)有 RabbitMQ等
4.2 基本概念
Producer:生產(chǎn)者,消息的提供者
Consumer:消費(fèi)者,消息的使用者
Message:消息柱徙,程序間的通信的數(shù)據(jù)
Queue:隊(duì)列缓屠,消息存放的容器,消息先進(jìn)先出
Vhost:虛擬主機(jī),相當(dāng)于MQ的“數(shù)據(jù)庫(kù)” 坐搔,用于存儲(chǔ)隊(duì)列
5 rabbitmq的工作模式
1? 一個(gè)生產(chǎn)這? 多個(gè)消費(fèi)者? 一個(gè)消息 只適用于一個(gè)消費(fèi)者
2發(fā)布訂閱? 交換機(jī)? (把消息生成副本) 多個(gè)消費(fèi)者都可以看一個(gè)消息,消息會(huì)重復(fù)發(fā)給一個(gè)消費(fèi)者
3 路由器? 根據(jù)一定條件把消息 送給消費(fèi)者,再3的基礎(chǔ)上強(qiáng)調(diào)了根據(jù)規(guī)則
4? 主題模式? 定義一個(gè)表達(dá)式規(guī)程? 按照規(guī)則把消息送給指定的人(再4 的基礎(chǔ)上根據(jù)模糊匹配實(shí)現(xiàn))
5 Rpc 遠(yuǎn)程調(diào)用? 不同語(yǔ)言(dubbo? springcloud? webservice都可以實(shí)現(xiàn),rpc不是mq的強(qiáng)項(xiàng))
6 Work Queue工作隊(duì)列
本講將創(chuàng)建一個(gè)工作隊(duì)列(Work Queue)藏研,它會(huì)發(fā) 送一些耗時(shí)的任務(wù)給多個(gè)工作者(Worker)。
在多個(gè)消息的情況下概行,Work Queue會(huì)將消息分派給 不同的消費(fèi)者蠢挡,每個(gè)消費(fèi)者都會(huì)接收到不同的消息,并且可以根據(jù)處理消息的速度來(lái)接收消息的數(shù)量凳忙,進(jìn)
而讓消費(fèi)者程序發(fā)揮最大性能业踏。
Work Queue特別適合在集群環(huán)境中做異步處理,能最大程序發(fā)揮每一臺(tái)服務(wù)器的性能涧卵。
7 發(fā)布(Publish)/訂閱(Subscribe)模式
發(fā)布/訂閱模式中勤家,生產(chǎn)者不再直接與隊(duì)列綁定, 而是將數(shù)據(jù)發(fā)送至“交換機(jī)Exchange
交換機(jī)Exchange用于將數(shù)據(jù)按某種規(guī)則送入與之綁定的隊(duì)列柳恐,進(jìn)而供消費(fèi)者使用伐脖。 發(fā)布/訂閱模式中,交換機(jī)將無(wú)差別的將所有消 息送入與之綁定的隊(duì)列乐设,所有消費(fèi)者拿到的消息完全相同讼庇,交換機(jī)的類型被稱為fanout
7.1 發(fā)布/訂閱模式使用場(chǎng)景
發(fā)布訂閱模式因?yàn)樗邢M(fèi)者獲得相同的消息,所以 特別適合“數(shù)據(jù)提供商與應(yīng)用商
例如:中國(guó)氣象局提供“天氣預(yù)報(bào)”送入交換機(jī)近尚,網(wǎng)易市咆、新浪蕴纳、百度巡球、搜狐等門戶接入通過(guò)隊(duì)列綁定到該
交換機(jī)睁搭,自動(dòng)獲取氣象局推送的氣象數(shù)據(jù)。
8 路由Routing模式
路由(Routing)模式是在發(fā)布訂閱模式 基礎(chǔ)上的變種。 發(fā)布訂閱模式是無(wú)條件將所有消息分發(fā)給 所有消費(fèi)者隊(duì)列。
路由模式則是交換機(jī)根據(jù)Routing Key有條件的將數(shù)據(jù)篩選后發(fā)給消費(fèi)者隊(duì)列。
路由模式下交換機(jī)的類型被稱為direct留瞳,隊(duì)列和交換機(jī)可以自己綁定
9 主題Topic模式
主題Topic模式是在Routing模式基礎(chǔ)上, 提供了對(duì)RouteKey模糊匹配的功能叹卷,可以
簡(jiǎn)化程序的編寫(xiě)撼港。
主題模式下,模糊匹配表達(dá)式規(guī)則為
– * 匹配單個(gè)關(guān)鍵字
– # 匹配所有關(guān)鍵字
主題模式下交換機(jī)的類型被稱為topic骤竹。隊(duì)列和交換機(jī)可以自己綁定
10? Confirm & Return
Confirm代表生產(chǎn)者將消息送到Broker時(shí)產(chǎn)生的狀態(tài)帝牡,后續(xù)
會(huì)出現(xiàn)兩種情況:
– ack 代表Broker已經(jīng)將數(shù)據(jù)接收。
– nack 代表Broker拒收消息蒙揣。原因有多種靶溜,隊(duì)列已滿,限流懒震,IO異常...
Return代表消息被Broker正常接收(ack)后罩息,但Broker沒(méi)
有對(duì)應(yīng)的隊(duì)列進(jìn)行投遞時(shí)產(chǎn)生的狀態(tài),消息被退回給生產(chǎn)者个扰。
注意:上面兩種狀態(tài)只代表生產(chǎn)者與Broker之間消息投遞的
情況瓷炮。與消費(fèi)者是否接收/確認(rèn)消息無(wú)關(guān)。
11 RabbitMQ集群架構(gòu)模式
RabbitMQ集群包含四種架構(gòu)模式:
主備模式 (Warren)
鏡像模式 (Mirror)
遠(yuǎn)程模式 (Shovel)
多活模式 (Federation)
11.1 主備模式 (Warren)
主備模式; 實(shí)現(xiàn)rabbitmq的高可用集群递宅,一般在并發(fā)數(shù)量不高的情況下使用娘香。這種模型非常好用并且簡(jiǎn)單,主備模式也稱為 warren模式
11.2? 鏡像模式 (Mirror)
集群模式非常經(jīng)典的就是mirror 鏡像模式 办龄,保證數(shù)據(jù)100% 不丟失烘绽,實(shí)際工作中也是使用最多的。并且實(shí)現(xiàn)集群非常簡(jiǎn)單俐填,互聯(lián)網(wǎng)大廠通常會(huì)構(gòu)建這種集群模式
11.3 遠(yuǎn)程模式 (Shovel)
遠(yuǎn)程模式可以實(shí)現(xiàn)雙活的一種模式安接,簡(jiǎn)稱shovel,所謂shovel就是我們可以把消息進(jìn)行不同的數(shù)據(jù)中心復(fù)制的工作英融,我們可以地域讓兩個(gè)mq集群互聯(lián)
11.4 多活模式 (Federation)
多活模式是實(shí)現(xiàn)異地?cái)?shù)據(jù)復(fù)制的主流模式盏檐,因?yàn)閟hovel 模式配置比較復(fù)雜,所以一般來(lái)說(shuō)實(shí)現(xiàn)異地集群都是用這種雙活或者多活模式驶悟,這種模型需要依賴rabbitmq 的federation插件胡野,可以實(shí)現(xiàn)持續(xù)的amqp數(shù)據(jù)通信。
12 搭建mirror集群
12.1 準(zhǔn)備兩個(gè)已安裝好RabbitMQ的Centos環(huán)境
修改hostname
– vim /etc/hostname
– m1
– m2
加入主機(jī)列表 vim /etc/hosts
– vim /etc/hosts
– 192.168.132.137 m1
– 192.168.132.139 m2
12.2 準(zhǔn)備工作-開(kāi)放防火墻端口
開(kāi)放防火墻 4369/5672/15672/25672端口
– firewall-cmd --zone=public --add-port=4369/tcp --permanent
– firewall-cmd --zone=public --add-port=5672/tcp --permanent
– firewall-cmd --zone=public --add-port=15672/tcp --permanent
– firewall-cmd --zone=public --add-port=25672/tcp --permanent
– firewall-cmd --reload
重啟兩臺(tái)主機(jī)
– reboot
12.3 復(fù)制.erlang.cookie
.erlang.cookie是erlang分布式的token文件撩银,集群內(nèi)所有設(shè)備要
持有相同的.erlang.cookie文件才允許彼此通信给涕。
– find / -name *.cookie
– scp /var/lib/rabbitmq/.erlang.cookie 192.168.132.134:/var/lib/rabbitmq/
在兩臺(tái)電腦上執(zhí)行chmod進(jìn)行授權(quán)
– chmod 400 /var/lib/rabbitmq/.erlang.cookie
12.4 配置鏡像集群
在m2服務(wù)器上執(zhí)行下面的命令將與m1服務(wù)器進(jìn)行復(fù)制
– rabbitmqctl stop_app 暫停服務(wù)
– rabbitmqctl join_cluster rabbit@m1 加入到m1的集群
– rabbitmqctl start_app 啟動(dòng)服務(wù)
– rabbitmqctl cluster_status 驗(yàn)證集群結(jié)果
13 利用haproxy負(fù)載均衡
13.1鏡像模式遇到的問(wèn)題
13.2 HAProxy 代理服務(wù)器
HAProxy 是一款提供高可用性豺憔、負(fù)載均衡以及基于TCP(第四層)
和HTTP(第七層)應(yīng)用的代理軟件额获,支持虛擬主機(jī)够庙,它是免費(fèi)、
快速并且可靠的一種解決方案抄邀。
RabbitMQ集群鏡像模式中耘眨,HAProxy用于做Tcp,提供節(jié)點(diǎn)負(fù)載
均衡(LB-LoadBalance)與故障發(fā)現(xiàn)境肾。
13.3 haproxy安裝
yum install haproxy? //安裝
rpm -ql haproxy? //查看安裝是不是成功
find / -name haproxy.cfg? //找到核心配置文件
haproxy -f /etc/haproxy/haproxy.cfg? ? //啟動(dòng)命令
13.4 haproxy.cfg配置詳解
listen rabbitmq_cluster
bind 0.0.0.0:5672 #通過(guò)5672對(duì)M1剔难、M2進(jìn)行映射
option tcplog #記錄tcp 連接的狀態(tài)和時(shí)間
mode tcp #四層協(xié)議代理,即對(duì)TCP協(xié)議轉(zhuǎn)發(fā)
option clitcpka #開(kāi)啟TCP的Keep Alive(長(zhǎng)連接模式)
timeout connect 1s #haproxy與mq建立連接的超時(shí)時(shí)間
timeout client 10s #客戶端與haproxy最大空閑時(shí)間奥喻。
timeout server 10s #服務(wù)器與haproxy最大空閑時(shí)間偶宫。
balance roundrobin #采用輪詢轉(zhuǎn)發(fā)消息
#每5秒發(fā)送一次心跳包,如連續(xù)兩次有響應(yīng)則代表狀態(tài)良好环鲤,
#如連續(xù)三次沒(méi)有響應(yīng)纯趋,則視為服務(wù)故障,該節(jié)點(diǎn)將被剔除冷离。
server node1 192.168.132.137:5672 check inter 5s rise 2 fall 3
server node2 192.168.132.139:5672 check inter 5s rise 2? 2 fall 3
listen http_front
#監(jiān)聽(tīng)端口
bind 0.0.0.0:1080
#統(tǒng)計(jì)頁(yè)面自動(dòng)刷新時(shí)間
stats refresh 30s
#統(tǒng)計(jì)頁(yè)面url
stats uri /haproxy?stats
#統(tǒng)計(jì)頁(yè)面用戶名和密碼設(shè)置
stats auth admin:admin
訪問(wèn) :http://am3:1080/ha