天天看點

RocketMQ叢集部署方式總結

1 RocketMQ網絡部署圖

RocketMQ網絡部署圖如下圖所示:

RocketMQ叢集部署方式總結

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、異步複制和同步雙寫總結

RocketMQ叢集部署方式總結

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

RocketMQ叢集部署方式總結