相關概念
NameServer
這裏我們可以理解成類似於zk的一個註冊中心,而且rocketmq最初也是基於zk作爲註冊中心的,現在相當於爲rocketmq自定義了一個註冊中心,代碼不超過1000行。RocketMQ 有多種配置方式可以令客戶端找到 Name Server, 然後通過 Name Server 再找到 Broker,分別如下,優先級由高到低,高優先級會覆蓋低優先級。客戶端提供http和ip:端口號的兩種方式,推薦使用http的方式可以實現nameserver的熱部署。
Push Consumer
Consumer 的一種,應用通常通過 Consumer 對象註冊一個 Listener 接口,一旦收到消息,Consumer 對象立刻回調 Listener 接口方法,類似於activemq的方式
Pull Consume
Consumer 的一種,應用通常主動調用 Consumer 的拉消息方法從 Broker 拉消息,主動權由應用控制
Producer Group
一類producer的集合名稱,這類producer通常發送一類消息,且發送邏輯一致
Consumer Group
同上,consumer的集合名稱
Broker
消息中轉的角色,負責存儲消息(實際的存儲是調用的store組件完成的),轉發消息,一般也成爲server,同jms中的provider
Message Filter
可以實現高級的自定義的消息過濾
Master/Slave
集羣的主從關係,broker的name相同,brokerid=0的爲主master,大於0的爲從slave,可以一主多從,但一從只能有一主
RocketMQ角色介紹
RocketMQ由四部分構成:Producer、Consumer、Broker和NameServer
啓動順序:NameServer->Broker
rocketmq架構圖
RocketMQ的使用
下載
RocketMQ的下載地址http://rocketmq.apache.org/release_notes/release-notes-4.4.0/
配置環境變量
集羣部署方式
單Master模式
優點:配置簡單,方便部署
缺點:這種方式風險較大,一旦Broker重啓或者宕機時,會導致整個服務不可用,不建議線上環境使用
多Master模式
優點: 配置簡單,一個Master宕機重啓不會有什麼影響
缺點: 單臺機器宕機期間,這臺機器上未被消費的消息在機器恢復之前不可訂閱
多Master多Slave模式(異步複製)
一個Master配置一個Slave,有多對Master-Slave,採用的異步的方式
,可以一主多從,但一從只能有一主
優點: 即使磁盤損壞,消息丟失的非常少,且消息實時性不會受影響,因爲Master 宕機後,消費者仍然可以從 Slave消費,此過程對應用透明。不需要人工干預。性能同多 Master 模式幾乎一樣。
缺點: Master 宕機,磁盤損壞情況,會丟失少量消息。
多Master多Slave模式(同步雙寫)
同多 master 多 slave 異步複製模式類似,區別在於 master 和 slave 之間的數據同步方式。
優點:同步雙寫的同步模式能保證數據不丟失。
缺點:發送單個消息 RT 會略長,性能相比異步複製低10%左右。
刷盤策略:同步刷盤和異步刷盤(指的是節點自身數據是同步還是異步存儲)
同步方式:同步雙寫和異步複製(指的一組 master 和 slave 之間數據的同步)
開始搭建
修改broker-a.properties內容
#所屬集羣名字
brokerClusterName=rocketmq-cluster
#broker名字,名字可重複,爲了管理,每個master起一個名字,他的slave同他,eg:Amaster叫broker-a,他的slave也叫broker-a
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分號分割
namesrvAddr=localhost:9876;localhost:9877
#在發送消息時,自動創建服務器不存在的topic,默認創建的隊列數
defaultTopicQueueNums=4
#是否允許 Broker 自動創建Topic,建議線下開啓,線上關閉
autoCreateTopicEnable=true
#是否允許 Broker 自動創建訂閱組,建議線下開啓,線上關閉
autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽端口,
listenPort=10910
#刪除文件時間點,默認凌晨 4點
deleteWhen=04
#文件保留時間,默認 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認存30W條,根據業務情況調整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=C:\Users\Tang\Desktop\path\broker-a\RootDir
#commitLog 存儲路徑
storePathCommitLog=C:\Users\Tang\Desktop\path\broker-a\CommitLog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=C:\Users\Tang\Desktop\path\broker-a\ConsumeQueue
#消息索引存儲路徑
storePathIndex=C:\Users\Tang\Desktop\path\broker-a\Index
#checkpoint 文件存儲路徑
storeCheckpoint=C:\Users\Tang\Desktop\path\broker-a\point
#abort 文件存儲路徑
abortFile=C:\Users\Tang\Desktop\path\broker-a\File
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 異步複製Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageThreadPoolNums=128
#拉消息線程池數量
#pullMessageThreadPoolNums=128
修改broker-a-b.properties內容
#所屬集羣名字
brokerClusterName=rocketmq-cluster
#broker名字,名字可重複,爲了管理,每個master起一個名字,他的slave同他,eg:Amaster叫broker-a,他的slave也叫broker-a
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分號分割
namesrvAddr=localhost:9876;localhost:9877
#在發送消息時,自動創建服務器不存在的topic,默認創建的隊列數
defaultTopicQueueNums=4
#是否允許 Broker 自動創建Topic,建議線下開啓,線上關閉
autoCreateTopicEnable=true
#是否允許 Broker 自動創建訂閱組,建議線下開啓,線上關閉
autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽端口,
listenPort=10920
#刪除文件時間點,默認凌晨 4點
deleteWhen=04
#文件保留時間,默認 48 小時
fileReservedTime=120
#commitLog每個文件的大小默認1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認存30W條,根據業務情況調整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=C:\Users\Tang\Desktop\path\broker-a-s\RootDir
#commitLog 存儲路徑
storePathCommitLog=C:\Users\Tang\Desktop\path\broker-a-s\CommitLog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=C:\Users\Tang\Desktop\path\broker-a-s\ConsumeQueue
#消息索引存儲路徑
storePathIndex=C:\Users\Tang\Desktop\path\broker-a-s\Index
#checkpoint 文件存儲路徑
storeCheckpoint=C:\Users\Tang\Desktop\path\broker-a-s\point
#abort 文件存儲路徑
abortFile=C:\Users\Tang\Desktop\path\broker-a-s\File
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 異步複製Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SLAVE
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageThreadPoolNums=128
#拉消息線程池數量
#pullMessageThreadPoolNums=128
broker-b 與 broker-a的配置基本相同
修改配置文件
rocketmq默認自帶了三種建議的配置
rocketmq-all-4.4.0-bin-release\conf 下我們可以看到
- 2m-2s-async (2主2從異步)
- 2m-2s-sync (2主2從同步)
- 2m-noslave (2主)
我們這裏搭建2主2從的模式,企業爲了保證數據的不丟失使用的是2主2從 同步
注意事項
- autoCreateTopicEnable=true,建議線下開啓測試,線上關閉
- listenPort默認爲10911,當一個機器上啓動多個broker示例時,需區分開端口
- brokerClusterName 配置集羣名字必須相同
- namesrvAddr 配置的時候 有多少個nameSev就寫多少個,用";"號隔開.
- broker啓動時,默認內存設置比較大,改成適合機器的,細節看下面
- 當一個節點啓動多個broker實例時,存儲路徑如果顯示的設置,則需要指定不同的storePath路徑,(不設置的話,默認不同)
- brokerName 設置的時候 主broker需要和從broker相同
- brokerId 設置的時候 主設置爲0 ,從設置爲1,2,3…(有多少從設置多少)
需求內存太大
默認大小
-Xms8g -Xmx8g -Xmn4g
改爲:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"
該配置視環境情況而定,配置一定要在環境內存允許的情況下,否則啓動會報錯,本地虛擬機配置很多問題都出在這一步
啓動mqnamesrv.cmd(這裏是有一臺主機上)
啓動第一個mqnamesrv 我們可以使用默認的端口地址:9876
啓動第二個mqnamesrv 我們需要創建mqnamesrv的配置文件(namesrv.properties)
啓動命令
格式: mqnamesrv -c 配置文件
例如:
F:\rocketmq-all-4.4.0-bin-release\bin\mqnamesrv -c F:\rocketmq-all-4.4.0-bin-release\conf\namesrv.properties
啓動broker(2主2從)
啓動命令
格式: mqbroker -c 配置文件
例如
F:\rocketmq-all-4.4.0-bin-release\bin\mqbroker -c F:\rocketmq-all-4.4.0-bin-release\conf\2m-2s-async\broker-a.properties
啓動結果
成功開啓
可視化界面查看效果
下載地址:https://github.com/apache/rocketmq-externals
進入到 rocketmq-console
文件夾下,執行如下命令:
mvn clean package -Dmaven.test.skip=true
執行完之後啓動
java -jar target/rocketmq-console-ng-1.0.1.jar --server.port=8888 --rocketmq.config.namesrvAddr=localhost:9876;localhost:9877
或者修改application.properties文件
啓動
java -jar target/rocketmq-console-ng-1.0.1.jar
測試
成功了(累死了)