1 RocketMQ網絡部署圖
RocketMQ網絡部署圖如下圖所示:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiUmZ1EDMwgDZ1ETM0QjNiFWMhRjNiRWY10DZJVGbpZ2PldWYtlEdld2LcVGbpZ2LclGch9CXt92YuUGdv5WYlx2Lc9CX6MHc0RHaiojIsJye.jpg)
1.1 RocketMQ網絡部署特點:
- NameServer是一個幾乎無狀态節點,可叢集部署,節點之間無任何資訊同步。
- Broker部署相對複雜,Broker分為Master與Slave,一個Master可以對應多個Slave,但是一個Slave隻能對應一個Master,Master與Slave的對應關系通過指定相同的BrokerName,不同的BrokerId來定義,BrokerId為0表示Master,非0表示Slave。Master也可以部署多個。每個Broker與NameServer叢集中的所有節點建立長連接配接,定時注冊Topic資訊到所有 NameServer。
- Producer與NameServer叢集中的其中一個節點(随機選擇)建立長連接配接,定期從Name Server取Topic路由資訊,并向提供Topic服務的Master建立長連接配接,且定時向Master發送心跳。Producer完全無狀态,可叢集部署。
- Consumer與NameServer叢集中的其中一個節點(随機選擇)建立長連接配接,定期從Name Server取Topic路由資訊,并向提供Topic服務的Master、Slave建立長連接配接,且定時向Master、Slave發送心跳。Consumer既可以從Master訂閱消息,也可以從Slave訂閱消息,訂閱規則由Broker配置決定。
2 NameServer叢集
NameServer叢集如下:
NameServer叢集 | IP位址 |
---|---|
NameServer-1 | 192.168.1.101 |
NameServer-2 | 192.168.1.102 |
分别啟動
nohup sh mqnamesrv &
tail -f -n $ROCKETMQ_HOME/logs/rocketmqlogs/namesrv.log
3 RocketMQ配置檔案
衆所周知,RocketMQ有多種叢集部署方式,它們的配置檔案也是分開的,如下:
[[email protected] conf]# ls -rlt /usr/local/rocketmq/conf
total
-rw-r--r-- root root Sep broker.conf
drwxr-xr-x root root Sep m-noslave
drwxr-xr-x root root Sep m-s-sync
drwxr-xr-x root root Sep m-s-async
-rw-r--r-- root root Apr : logback_namesrv.xml
-rw-r--r-- root root Apr : logback_filtersrv.xml
-rw-r--r-- root root Apr : logback_broker.xml
-rw-r--r-- root root Apr : logback_tools.xml
說明:
- 2m-noslave: 多Master模式
- 2m-2s-sync: 多Master多Slave模式,同步雙寫
- 2m-2s-async:多Master多Slave模式,異步複制
RocketMQ預設提供的配置檔案都是最基本的,很多配置都是預設值,在生産環境中我們需要根據實際情況進行修改。樣例配置如下:
#所屬叢集名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置檔案填寫的不一樣
brokerName=broker-a|broker-b
#0表示Master,>0表示Slave
brokerId=
#nameServer位址,分号分割
namesrvAddr=.:;.:
#在發送消息時,自動建立伺服器不存在的topic,預設建立的隊列數
defaultTopicQueueNums=
#是否允許 Broker 自動建立Topic,建議線下開啟,線上關閉
autoCreateTopicEnable=true
#是否允許 Broker 自動建立訂閱組,建議線下開啟,線上關閉
autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽端口
listenPort=
#删除檔案時間點,預設淩晨 4點
deleteWhen=
#檔案保留時間,預設 48 小時
fileReservedTime=
#commitLog每個檔案的大小預設1G
mapedFileSizeCommitLog=
#ConsumeQueue每個檔案預設存30W條,根據業務情況調整
mapedFileSizeConsumeQueue=
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測實體檔案磁盤空間
diskMaxUsedSpaceRatio=
#存儲路徑
storePathRootDir=/usr/local/alibaba-rocketmq/store
#commitLog 存儲路徑
storePathCommitLog=/usr/local/alibaba-rocketmq/store/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/usr/local/alibaba-rocketmq/store/consumequeue
#消息索引存儲路徑
storePathIndex=/usr/local/alibaba-rocketmq/store/index
#checkpoint 檔案存儲路徑
storeCheckpoint=/usr/local/alibaba-rocketmq/store/checkpoint
#abort 檔案存儲路徑
abortFile=/usr/local/alibaba-rocketmq/store/abort
#限制的消息大小
maxMessageSize=
#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
4 Broker叢集部署
Broker叢集部署有幾種不同的方式。這裡的Slave不可寫,但可讀,類似于MySQL的主備方式。
4.1 單個Master
這種方式風險較大,一旦Broker重新開機或者當機時,會導緻整個服務不可用,不建議線上環境使用
4.2 多Master模式
一個叢集無Slave,全是Master,例如2個Master或者3個Master。
brokerName | brokerId | brokerRole | IP位址 |
---|---|---|---|
broker-a | ASYNC_MASTER | 192.168.1.101 | |
broker-b | ASYNC_MASTER | 192.168.1.102 |
優點:
配置簡單,單個Master當機或重新開機維護對應用無影響,在磁盤配置為RAID10時,即使機器當機不可恢複情況下,由于RAID10磁盤非常可靠,消息也不會丢失(異步刷盤丢失少量消息,同步刷盤一條不丢)。性能最高。
缺點:
單台機器當機期間,這台機器上未被消費的消息在機器恢複之前不可訂閱,消息實時性會受到影響。
啟動步驟:
第一步:先啟動NameServer叢集
第二步:在192.168.1.101,啟動第一個Master
nohup sh mqbroker -c $ROCKETMQ_HOME/conf/m-noslave/broker-a.properties >/dev/null >& &
tail -f -n $ROCKETMQ_HOME/logs/rocketmqlogs/broker.log
第三步:在192.168.1.102,啟動第二個Master
nohup sh mqbroker -c $ROCKETMQ_HOME/conf/m-noslave/broker-b.properties >/dev/null >& &
tail -f -n $ROCKETMQ_HOME/logs/rocketmqlogs/broker.log
4.3 多Master多Slave模式,異步複制
每個Master配置一個Slave,有多對Master-Slave,HA采用異步複制方式,主備有短暫消息延遲,毫秒級。
brokerName | brokerId | brokerRole | IP位址 |
---|---|---|---|
broker-a | ASYNC_MASTER | 192.168.1.101 | |
broker-a | 1 | SLAVE | 192.168.1.102 |
broker-b | ASYNC_MASTER | 192.168.1.103 | |
broker-b | 1 | SLAVE | 192.168.1.104 |
優點:即使磁盤損壞,消息丢失的非常少,且消息實時性不會受影響,因為Master 當機後,消費者仍然可以從Slave消費,此過程對應用透明。不需要人工幹預。性能同多 Master 模式幾乎一樣。
缺點:Master當機,磁盤損壞情況,會丢失少量消息。
啟動步驟
第一步:先啟動NameServer叢集
第二步:在192.168.1.101,啟動第一個Master
nohup sh mqbroker -c $ROCKETMQ_HOME/conf/m-s-async/broker-a.properties >$ROCKETMQ_HOME/log/mq.log >/dev/null >& &
tail -f -n $ROCKETMQ_HOME/logs/rocketmqlogs/broker.log
第三步:在192.168.1.102,啟動第一個Slave
nohup sh mqbroker -c $ROCKETMQ_HOME/conf/m-s-async/broker-a-s.properties >$ROCKETMQ_HOME/log/mq.log >/dev/null >& &
tail -f -n $ROCKETMQ_HOME/logs/rocketmqlogs/broker.log
第四步:在192.168.1.103,啟動第二個Master
nohup sh mqbroker -c $ROCKETMQ_HOME/conf/m-s-async/broker-b.properties >$ROCKETMQ_HOME/log/mq.log >/dev/null >& &
tail -f -n $ROCKETMQ_HOME/logs/rocketmqlogs/broker.log
第五步:在機器 192.168.1.104,啟動第二個Slave
nohup sh mqbroker -c $ROCKETMQ_HOME/conf/m-s-async/broker-b-s.properties >$ROCKETMQ_HOME/log/mq.log >/dev/null >& &
4.4 多Master多Slave模式,同步雙寫
每個Master配置一個Slave,有多對Master-Slave,HA采用同步雙寫方式,主備都寫成功,向應用才傳回成功。
brokerName | brokerId | brokerRole | IP位址 |
---|---|---|---|
broker-a | SYNC_MASTER | 192.168.1.101 | |
broker-a | 1 | SLAVE | 192.168.1.102 |
broker-b | SYNC_MASTER | 192.168.1.103 | |
broker-b | 1 | SLAVE | 192.168.1.104 |
優點:資料與服務都無單點,Master當機情況下,消息無延遲,服務可用性與資料可用性都非常高。
缺點:性能比異步複制模式略低,大約低10%左右,發送單個消息的RT會略高。目前主當機後,備機不能自動切換為主機,後續會支援自動切換功能。
啟動步驟:
第一步:先啟動NameServer叢集
第二步:在192.168.1.101,啟動第一個Master
nohup sh mqbroker -c $ROCKETMQ_HOME/conf/m-s-sync/broker-a.properties >$ROCKETMQ_HOME/log/mq.log >/dev/null >& &
tail -f -n $ROCKETMQ_HOME/logs/rocketmqlogs/broker.log
第三步:在192.168.1.102,啟動第一個Slave
nohup sh mqbroker -c $ROCKETMQ_HOME/conf/m-s-sync/broker-a-s.properties >$ROCKETMQ_HOME/log/mq.log >/dev/null >& &
tail -f -n $ROCKETMQ_HOME/logs/rocketmqlogs/broker.log
第四步:在192.168.1.103,啟動第二個Master
nohup sh mqbroker -c $ROCKETMQ_HOME/conf/m-s-sync/broker-b.properties >$ROCKETMQ_HOME/log/mq.log >/dev/null >& &
tail -f -n $ROCKETMQ_HOME/logs/rocketmqlogs/broker.log
第五步:在192.168.1.104,啟動第二個Slave
nohup sh mqbroker -c $ROCKETMQ_HOME/conf/m-s-sync/broker-b-s.properties >$ROCKETMQ_HOME/log/mq.log >/dev/null >& &
tail -f -n $ROCKETMQ_HOME/logs/rocketmqlogs/broker.log
注意事項:以上Broker與Slave配對是通過指定相同的brokerName參數來配對,Master的 BrokerId必須是0,Slave的BrokerId必須是大于0的數。另外一個Master下面可以挂載多個Slave,同一Master下的多個Slave 通過指定不同的BrokerId來區分。
4.5 總結
1、異步複制和同步雙寫總結
2、叢集方式對比
叢集方式 | 運維特點 | 消息可靠性(master當機情況) | 服務可用性(master當機情況) | 其他特點 | 備注 |
---|---|---|---|---|---|
單Master | 結構簡單,擴容友善,機器要求低 | 同步刷盤消息一條都不會丢 | 整體可用,未被消費的消息無法取得,影響實時性 | 性能最高 | |
多Master | 異步有毫秒級丢失,同步雙寫不丢失 | 差評,主備不能自動切換,且備機隻能讀不能寫,會造成服務整體不可寫 | 不考慮,除非自己提供主從切換的方案 | ||
Master-Slave(異步複制) | 結構複雜,擴容友善 | 故障時會丢失消息 | 整體可用,實時性影響毫秒級别 | ||
該組服務隻能讀不能寫 | 性能很高 | 适合消息可靠性中等,實時性中等的要求 | |||
Master-Slave(同步雙寫) | 結構複雜,擴容友善 | 不丢消息 | 整體可用,不影響實時性,該組服務隻能讀不能寫 | 性能比異步低10%,是以實時性也并不比異步方式太高 | 适合消息可靠性略高,實時性中等、性能要求不高的需求 |
5 高可用演練場景
RocketMQ高可用演練場景
項目 | 發送消息 | 發送消息過程中 | 接收消費消息 |
---|---|---|---|
停用一個namesrv | 不影響通信 | 不影響通信 | 不影響通信 |
停用全部namesrv | 影響通信 | 不影響通信 | 影響通信,啟動任意的namesrv可恢複 |
停用單個master broker | 不影響通信 | 不影響通信 | 不影響通信 |
停用全部master broker | 影響通信 | 影響通信,無法恢複 | 影響通信 |
停用一個slave broker | 不影響通信 | 不影響通信 | 不影響通信 |
停用全部slave broker | 不影響通信 | 影響通信,數秒恢複 | 不影響通信,數秒恢複 |
下面的是我的公衆号二維碼,歡迎關注。文章轉載請注明出處www.leexide.com