RocketMQ介紹
Apache RocketMQ是一個分布式消息傳遞和流媒體平臺,具有低延遲诗鸭、高性能和可靠性染簇、萬億級別的容量和靈活的可伸縮性。
GitHub:https://github.com/apache/rocketmq
官網(wǎng):http://rocketmq.apache.org/
本文版本:rocketmq-4.2.0-SNAPSHOT
下載地址:http://mirror.bit.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip
它提供了各種特性:(翻譯自GitHub)
發(fā)布/訂閱消息傳遞模型
定期消息傳遞
按時間或偏移量進行消息回溯
日志中心流
大數(shù)據(jù)集成
在同一隊列中可靠的FIFO和嚴格的有序消息傳遞
有效的拉伸消費模式
在一個隊列中有百萬級的消息積累容量
多種消息傳遞協(xié)議只泼,如JMS和OpenMessaging
靈活的分布式擴展部署體系結構
快速批量消息交換系統(tǒng)剖笙。
各種消息過濾機制,如SQL和標記
用于隔離測試和云隔離集群的Docker映像请唱。
用于配置弥咪、度量和監(jiān)視的功能豐富的管理儀表板
選擇的理由
強調集群無單點过蹂,可擴展,任意一點高可用聚至,水平可擴展
????????方便集群配置酷勺,而且容易擴展(橫向和縱向),通過slave的方式每一點都可以實現(xiàn)高可用
支持上萬個隊列扳躬,順序消息
????????順序消費是實現(xiàn)在同一隊列的脆诉,如果高并發(fā)的情況就需要隊列的支持,rocketmq可以滿足上萬個隊列同時存在
任性定制你的消息過濾
????????rocketmq提供了兩種類型的消息過濾贷币,也可以說三種可以通過topic進行消息過濾击胜、可以通過tag進行消息過濾、還可以通過filter的方式任意定制過濾
消息的可靠性(無Buffer役纹,持久化偶摔,容錯,回溯消費)
????????消息無buffer就不用擔心buffer回滿的情況促脉,rocketmq的所有消息都是持久化的辰斋,生產(chǎn)者本身可以進行錯誤重試,發(fā)布者也會按照時間階梯的方式進行消息重發(fā)瘸味,消息回溯說的是可以按照指定的時間進行消息的重新消費宫仗,既可以向前也可以向后(前提條件是要注意消息的擦除時間)
海量消息堆積能力,消息堆積后旁仿,寫入低延遲
????????針對于provider需要配合部署方式藕夫,對于consumer,如果是集群方式一旦master返現(xiàn)消息堆積會向consumer下發(fā)一個重定向指令丁逝,此時consumer就可以從slave進行數(shù)據(jù)消費了
分布式事務
????????我個人感覺rocketmq對這一塊說的不是很清晰汁胆,而且官方也說現(xiàn)在這塊存在缺陷(會令系統(tǒng)pagecache過多),所以線上建議還是少用為好
消息失敗重試機制
????????針對provider的重試霜幼,當消息發(fā)送到選定的broker時如果出現(xiàn)失敗會自動選擇其他的broker進行重發(fā)嫩码,默認重試三次,當然重試次數(shù)要在消息發(fā)送的超時時間范圍內(nèi)罪既。
????????針對consumer的重試铸题,如果消息因為各種原因沒有消費成功,會自動加入到重試隊列琢感,一般情況如果是因為網(wǎng)絡等問題連續(xù)重試也是照樣失敗丢间,所以rocketmq也是采用階梯重試的方式。
定時消費
? ? ? ? 除了上面的配置驹针,在發(fā)送消息是也可以針對message設置setDelayTimeLevel
活躍的開源社區(qū)
????????現(xiàn)在rocketmq成為了apache的一款開源產(chǎn)品烘挫,活躍度也是不容懷疑的
成熟度(經(jīng)過雙十一考驗)
????????針對本身的成熟度,我們看看這么多年的雙十一就可想而知了
相關概念
NameServer
這里我們可以理解成類似于zk的一個注冊中心,而且rocketmq最初也是基于zk作為注冊中心的饮六,現(xiàn)在相當于為rocketmq自定義了一個注冊中心其垄,代碼不超過1000行。RocketMQ 有多種配置方式可以令客戶端找到 Name Server, 然后通過 Name Server 再找到 Broker卤橄,分別如下绿满,優(yōu)先級由高到低,高優(yōu)先級會覆蓋低優(yōu)先級窟扑±洌客戶端提供http和ip:端口號的兩種方式,推薦使用http的方式可以實現(xiàn)nameserver的熱部署嚎货。
Push Consumer
? ? ? ? Consumer 的一種橘霎,應用通常通過 Consumer 對象注冊一個 Listener 接口,一旦收到消息厂抖,Consumer 對象立刻回調 Listener 接口方法茎毁,類似于activemq的方式
Pull Consume
? ? ? ? Consumer 的一種克懊,應用通常主動調用 Consumer 的拉消息方法從 Broker 拉消息忱辅,主動權由應用控制
Producer Group
? ? ? ? 一類producer的集合名稱,這類producer通常發(fā)送一類消息谭溉,且發(fā)送邏輯一致
Consumer Group
? ? ? ? 同上墙懂,consumer的集合名稱
Broker
? ? ? ? 消息中轉的角色,負責存儲消息(實際的存儲是調用的store組件完成的)扮念,轉發(fā)消息损搬,一般也成為server,同jms中的provider
Message Filter
? ? ? ? 可以實現(xiàn)高級的自定義的消息過濾
Master/Slave
? ? ? ? 集群的主從關系柜与,broker的name相同巧勤,brokerid=0的為主master,大于0的為從slave弄匕,可以一主多從颅悉,但一從只能有一主
RocketMQ角色介紹
RocketMQ由四部分構成:Producer、Consumer迁匠、Broker和NameServer
啟動順序:NameServer->Broker
為了消除單點故障剩瓶,增加可靠性或增大吞吐量,可以在多臺機器上部署多個nameserver和broker城丧,并且為每個broker部署1個或多個slave延曙,rocketmq架構圖如圖1.1所示。
Topic & message queue:一個分布式消息隊列中間件部署好以后亡哄,可以給很多個業(yè)務提供服務枝缔,同一個業(yè)務也有不同類型的消息要投遞,這些不同類型的消息以不同的 Topic 名稱來區(qū)分蚊惯。所以發(fā)送和接收消息前愿卸,先創(chuàng)建topic拐辽,針對某個 Topic 發(fā)送和接收消息。有了 Topic 以后擦酌,還需要解決性能問題 俱诸。 如果一個Topic 要發(fā)送和接收的數(shù)據(jù)量非常大, 需要能支持增加并行處理的機器來提高處理速度赊舶,這時候一個 Topic 可以根據(jù)需求設置一個或多個 Message Queue, Message Queue 類似分區(qū)或 Partition 睁搭。Topic有了多個 Message Queue 后,消息可以并行地向各個Message Queue 發(fā)送笼平,消費者也可以并行地從多個 Message Queue 讀取消息并消費 园骆。
集群部署方式
單Master模式
????????只有一個 Master節(jié)點
????????優(yōu)點:配置簡單,方便部署
????????缺點:這種方式風險較大寓调,一旦Broker重啟或者宕機時锌唾,會導致整個服務不可用,不建議線上環(huán)境使用
多Master模式
????????一個集群無 Slave夺英,全是 Master晌涕,例如 2 個 Master 或者 3 個 Master
????????優(yōu)點:配置簡單,單個Master 宕機或重啟維護對應用無影響痛悯,在磁盤配置為RAID10 時余黎,即使機器宕機不可恢復情況下,由與 RAID10磁盤非吃孛龋可靠惧财,消息也不會丟(異步刷盤丟失少量消息,同步刷盤一條不丟)扭仁。性能最高垮衷。多 Master 多 Slave 模式,異步復制
????????缺點:單臺機器宕機期間乖坠,這臺機器上未被消費的消息在機器恢復之前不可訂閱搀突,消息實時性會受到受到影響
多Master多Slave模式(異步復制)---本文稍后以這種方式部署集群為例
? ? ? ? 每個 Master 配置一個 Slave,有多對Master-Slave瓤帚, HA描姚,采用異步復制方式,主備有短暫消息延遲戈次,毫秒級轩勘。
????????優(yōu)點:即使磁盤損壞,消息丟失的非常少怯邪,且消息實時性不會受影響绊寻,因為Master 宕機后,消費者仍然可以從 Slave消費,此過程對應用透明澄步。不需要人工干預冰蘑。性能同多 Master 模式幾乎一樣。
????????缺點: Master 宕機村缸,磁盤損壞情況祠肥,會丟失少量消息。
多Master多Slave模式(同步雙寫)---文中會說明補充此集群配置梯皿,線上使用的話仇箱,推薦使用此模式集群
? ? ? ? 每個 Master 配置一個 Slave,有多對Master-Slave东羹, HA采用同步雙寫方式剂桥,主備都寫成功,向應用返回成功属提。
????????優(yōu)點:數(shù)據(jù)與服務都無單點权逗, Master宕機情況下,消息無延遲冤议,服務可用性與數(shù)據(jù)可用性都非常高
????????缺點:性能比異步復制模式略低斟薇,大約低 10%左右,發(fā)送單個消息的 RT會略高求类。目前主宕機后奔垦,備機不能自動切換為主機,后續(xù)會支持自動切換功能
Rocketmq雙主從異步復制集群部署(文中包含同步雙寫集群的配置說明)
一尸疆、預裝環(huán)境:
rhel 6.9(其實redhat & centos 6~7都是通用的)
jdk-1.8
git,maven(非必須)
二惶岭、集群結構:
三寿弱、下載解壓
下載地址:http://mirror.bit.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip
mkdir -p?/opt/apps_install/rocketmq-4.2.0
cd?/opt/apps_install/rocketmq-4.2.0
unzip?rocketmq-all-4.2.0-bin-release.zip
ln -s /opt/apps_install/rocketmq-4.2.0 /opt/apps/rocketmq
四、創(chuàng)建存儲路徑
10.16.13.90(rocketmq-nameserver-1):
mkdir -p /data/rocketmq/store/{rootdir-a-m,commitlog-a-m,rootdir-b-s,commitlog-b-s}
10.16.13.91(rocketmq-nameserver-2):
mkdir -p /data/rocketmq/store/{rootdir-b-m,commitlog-b-m,rootdir-a-s,commitlog-a-s}
五按灶、配置hosts和環(huán)境變量
兩臺服務器修改/etc/hosts症革,加入下面兩行
10.16.13.90 rocketmq-nameserver-1
10.16.13.91 rocketmq-nameserver-2
修改/etc/profile,加入
export ROCKETMQ_HOME=/opt/apps/rocketmq
export PATH=$ROCKETMQ_HOME/bin:$PATH
source /etc/profile
六鸯旁、修改配置文件
國際慣例噪矛,修改之前先備份~以防意外
cd?/opt/apps/rocketmq;cp -r conf/ conf.default/
因為本文采用雙主雙從異步復制,默認的rocketmq已經(jīng)為我們配置了相應配置目錄
cd?/opt/apps/rocketmq/conf/2m-2s-async
10.16.13.90 rocketmq-nameserver-1 ? ? ?角色:broker-a-master & broker-b-slave
vim?broker-a.properties
#所屬集群名字
brokerClusterName=sns-rocket-mq-cluster
#broker名字铺罢,注意此處不同的配置文件填寫的不一樣
brokerName=rocketmq-nameserver-1
#brokerId 0 表示 Master艇挨,>0 表示 Slave
brokerId=0
# Broker 對外服務的監(jiān)聽端口
listenPort=10911
#nameServer地址,分號分割
namesrvAddr=rocketmq-nameserver-1:9876;rocketmq-nameserver-2:9876
# 刪除文件時間點韭赘,默認凌晨 4點
deleteWhen=04
#文件保留時間缩滨,默認 48 小時
fileReservedTime=72
#Broker role有3種:SYNC MASTER、ASYNC MASTER、SLAVE脉漏。關鍵詞SYNC和ASYNC表示Master和Slave之間同步消息的機制苞冯,SYNC即同步更新,指當Slave和Master消息同步完成后侧巨,再返回發(fā)送成功的狀態(tài)舅锄。ASYNC即異步更新,master與slave有短暫消息延遲司忱,毫秒級巧娱。本文在此使用了異步復制集群模式,線上環(huán)境推薦使用同步雙寫模式烘贴,即SYNC_MASTER
brokerRole=ASYNC_MASTER
# 刷盤方式 ASYNC_FLUSH 異步刷盤
flushDiskType=ASYNC_FLUSH
#存儲路徑
storePathRootDir=/data/rocketmq/store/rootdir-a-m
storePathCommitLog=/data/rocketmq/store/commitlog-a-m
# 是否允許 Broker 自動創(chuàng)建Topic
autoCreateTopicEnable=true
# 是否允許 Broker 自動創(chuàng)建訂閱組
autoCreateSubscriptionGroup=true
vim?broker-b-s.properties
brokerClusterName=sns-rocket-mq-cluster
brokerName=rocketmq-nameserver-2
listenPort=10921
namesrvAddr=rocketmq-nameserver-1:9876;rocketmq-nameserver-2:9876
brokerId=1
deleteWhen=04
fileReservedTime=72
brokerRole=SLAVE
storePathRootDir=/data/rocketmq/store/rootdir-b-s
storePathCommitLog=/data/rocketmq/store/commitlog-b-s
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
flushDiskType=ASYNC_FLUSH
10.16.13.91 rocketmq-nameserver-2 ? ? ?角色:broker-b-master & broker-a-slave
vim?broker-b.properties
brokerClusterName=sns-rocket-mq-cluster
brokerName=rocketmq-nameserver-2
brokerIP1=10.16.13.91
brokerId=0
listenPort=10911
namesrvAddr=rocketmq-nameserver-1:9876;rocketmq-nameserver-2:9876
deleteWhen=04
fileReservedTime=72
##?Broker role有3種:SYNC MASTER禁添、ASYNC MASTER、SLAVE桨踪。關鍵詞SYNC和ASYNC表示Master和Slave之間同步消息的機制老翘,SYNC即同步更新,指當Slave和Master消息同步完成后锻离,再返回發(fā)送成功的狀態(tài)铺峭。ASYNC即異步更新,master與slave有短暫消息延遲汽纠,毫秒級卫键。本文在此使用了異步復制集群模式ASYNC_MASTER,線上環(huán)境推薦使用同步雙寫模式虱朵,即SYNC_MASTER莉炉。
brokerRole=ASYNC_MASTER
storePathRootDir=/data/rocketmq/store/rootdir-b-m
storePathCommitLog=/data/rocketmq/store/commitlog-b-m
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
flushDiskType=ASYNC_FLUSH
vim?broker-a-s.properties
brokerClusterName=sns-rocket-mq-cluster
brokerName=rocketmq-nameserver-1
listenPort=10921
namesrvAddr=rocketmq-nameserver-1:9876;rocketmq-nameserver-2:9876
brokerId=1
deleteWhen=04
fileReservedTime=72
brokerRole=SLAVE
storePathRootDir=/data/rocketmq/store/rootdir-a-s
storePathCommitLog=/data/rocketmq/store/commitlog-a-s
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
flushDiskType=ASYNC_FLUSH
修改日志配置文件(兩臺一樣)
mkdir -p?/opt/apps/rocketmq/logs
cd /opt/apps/rocketmq/conf
sed -i 's#${user.home}#/opt/apps/rocketmq#g' *.xml
七、修改啟動腳本參數(shù)
繼續(xù)國際慣例碴犬,修改之前先備份絮宁,兩臺服務器相同操作
cd??/opt/apps/rocketmq/bin
cp?runbroker.sh?runbroker.sh.default
調一下JVM,包括nameserver 和 broker服协。限于自己機器的配置绍昂,參數(shù)調小一下。但Rocketmq最少的堆是1g偿荷,否則無法啟動窘游。兩臺機器執(zhí)行相同的操作。
JAVA_OPT="${JAVA_OPT} -server -Xms16g -Xmx16g -Xmn8g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g"
八跳纳、服務啟動
要先啟動namerserver忍饰,再啟broker,兩臺機器執(zhí)行相同的操作棒旗。
這里為了未來方便運維喘批,最好是寫好相應的服務啟動腳本撩荣,養(yǎng)成一個好習慣比擁有一個好記性更友愛不是么~
① 啟動nameserver,兩臺機器操作相同
mkdir -p?/opt/scripts/rocketmq
cd?/opt/scripts/rocketmq
vim?start_rocketmq_nameserver.sh
#!/bin/bash
source /etc/profile
nohup sh /opt/apps/rocketmq/bin/mqnamesrv > /data/rocketmq/store/mqnamesrv.log 2>&1 &
② 啟動broker饶深。當然兩臺機器不一樣餐曹,這里一個一個來
10.16.13.90 rocketmq-nameserver-1
vim?start_broker_a_master.sh
#!/bin/bash
nohup sh /opt/apps/rocketmq/bin/mqbroker -c /opt/apps/rocketmq/conf/2m-2s-async/broker-a.properties > /data/rocketmq/store/broker-a-m.log 2>&1 &
vim?start_broker_b_slave.sh
#!/bin/bash
nohup sh /opt/apps/rocketmq/bin/mqbroker -c /opt/apps/rocketmq/conf/2m-2s-async/broker-b-s.properties > /data/rocketmq/store/broker-b-s.log 2>&1 &
10.16.13.91 rocketmq-nameserver-2
vim?start_broker_b_master.sh
#!/bin/bash
nohup sh /opt/apps/rocketmq/bin/mqbroker -c /opt/apps/rocketmq/conf/2m-2s-async/broker-b.properties > /data/rocketmq/store/broker-b-m.log 2>&1 &
vim?start_broker_a_slave.sh
#!/bin/bash
nohup sh /opt/apps/rocketmq/bin/mqbroker -c /opt/apps/rocketmq/conf/2m-2s-async/broker-a-s.properties > /data/rocketmq/store/broker-a-s.log 2>&1 &
這里再啰嗦一遍,先啟動nameserver敌厘,再啟動broker台猴,兩臺機器的啟動順序:啟動nameserver---啟動broker master---啟動broker slave,done
都啟動完畢之后可以jps看一下
[@bx_13_90 /opt/scripts/rocketmq]# jps
60161 BrokerStartup
147505 Jps
59300 NamesrvStartup
60760 rocketmq-console-ng-1.0.0.jar
124248 BrokerStartup
查看服務啟動后的機器狀態(tài):
[@bx_13_90 /opt/scripts/rocketmq]# mqadmin clusterList --namesrvAddr=10.16.13.90:9876
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
#Cluster Name? ? #Broker Name? ? ? ? ? ? #BID? #Addr? ? ? ? ? ? ? ? ? #Version? ? ? ? ? ? ? ? #InTPS(LOAD)? ? ? #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
sns-rocket-mq-cluster? rocketmq-nameserver-1? 0? ? 10.16.13.90:10911? ? ? V4_2_0_SNAPSHOT? ? ? ? ? 0.00(0,0ms)? ? ? ? 0.00(0,0ms)? ? ? ? ? 0 425360.18 0.0000
sns-rocket-mq-cluster? rocketmq-nameserver-1? 1? ? 10.16.13.91:10921? ? ? V4_2_0_SNAPSHOT? ? ? ? ? 0.00(0,0ms)? ? ? ? 0.00(0,0ms)? ? ? ? ? 0 425360.18 0.0000
sns-rocket-mq-cluster? rocketmq-nameserver-2? 0? ? 10.16.13.91:10911? ? ? V4_2_0_SNAPSHOT? ? ? ? ? 0.00(0,0ms)? ? ? ? 0.00(0,0ms)? ? ? ? ? 0 425360.18 0.0000
sns-rocket-mq-cluster? rocketmq-nameserver-2? 1? ? 10.16.13.90:10921? ? ? V4_2_0_SNAPSHOT? ? ? ? ? 0.00(0,0ms)? ? ? ? 0.00(0,0ms)? ? ? ? ? 0 425360.18 0.0000
九俱两、服務關閉
關閉nameserver:
/opt/apps/rocketmq/bin/mqshutdown namesrv
關閉broker:
/opt/apps/rocketmq/bin/mqshutdown broker
十饱狂、部署rocketmq-console
部分開了天眼的童鞋可能看到上面jps時,有一個rocketmq-console-ng-1.0.0.jar宪彩,這里就具體說一下rocketmq的管控臺休讳,可以隨時觀測和修改rocketmq的狀態(tài)和一些配置
這個管控臺在GitHub上也有項目,GitHub地址:https://github.com/apache/rocketmq-externals尿孔,再次感謝國際開源組織gay站的無私貢獻俊柔,讓眾基可以做伸手黨,而且現(xiàn)在管控臺還能顯示簡體中文了~具體的介紹GitHub上有說活合,這里限于篇幅就不多啰嗦了
步入正題雏婶,如何部署rocketmq管控臺
這里還是福利一波吧,不用看GitHub如何編譯部署blablabla白指,筆者直接送上編譯好的jar包留晚,綠色無毒請大家安心下載,如果鏈接有問題不能下載告嘲,可以發(fā)我郵件向我要(fantasymango@163.com)
鏈接: https://pan.baidu.com/s/1Y4fzVc2r30jtIVpvYZocWA 密碼: vj2y
mkdir -p?/opt/apps_install/rocketmq-console/
把下載好的jar包放在這里
啟動腳本start.sh
#!/bin/bash
nohup java -jar ./rocketmq-console-ng-1.0.0.jar --server.port=8080 --rocketmq.config.namesrvAddr=10.16.13.90:9876;10.16.13.91:9876 &
訪問ip:8080即可
Tips:
Broker 重啟對客戶端的影響
Broker 重啟可能會導致正在發(fā)往這臺機器的的消息發(fā)送失敗错维,RocketMQ提供了一種優(yōu)雅關閉Broker的方法,通過執(zhí)行以下命令會清除Broker的寫權限状蜗,過40s后需五,所有客戶端都會更新Broker路由信息,此時再關閉Broker就不會發(fā)生發(fā)送消息失敗的情況轧坎,因為所有消息都發(fā)往了其他 Broker。
# sh mqadmin wipeWritePerm -b brokerName -n namesrvAddr
Master 與Slave的關系
RocketMQ的開源版本泽示,Master宕機缸血,Slave不能切換為Master,這里的Slave不可寫械筛,但可讀捎泻,類似于 Mysql 主備方式。