集群支持:
RocketMQ天生對集群的支持非常友好
單Master:
優點:除了配置簡單沒什么優點
缺點:不可靠,該機器重啟或宕機,將導致整個服務不可用
多Master:
優點:配置簡單,性能最高
缺點:可能會有少量消息丟失(配置相關),單台機器重啟或宕機期間,該機器下未被消費的消息在機器恢復前不可訂閱,影響消息實時性
多Master多Slave異步模式:
每個Master配一個Slave,有多對Master-Slave,集群采用異步復制方式,主備有短暫消息延遲,毫秒級
優點:性能同多Master幾乎一樣,實時性高,主備間切換對應用透明,不需人工干預
缺點:Master宕機或磁盤損壞時會有少量消息丟失
多Master多Slave同步模式:
每個Master配一個Slave,有多對Master-Slave,集群采用同步雙寫方式,主備都寫成功,向應用返回成功
優點:服務可用性與數據可用性非常高
缺點:性能比異步集群略低,當前版本主宕備不能自動切換為主。
需要注意的是,在RocketMQ里面,1台機器只能要么是Master,要么是Slave。這個在初始的機器配置里面,就定死了。不會像kafka那樣存在master動態選舉的功能。其中Master的broker id = 0,Slave的broker id > 0。有點類似於mysql的主從概念,master掛了以后,slave仍然可以提供讀服務,但是由於有多主的存在,當一個master掛了以后,可以寫到其他的master上。
集群搭建:2M-2S-SYNC(兩主兩從同步寫)
環境准備:rocket-4.4.0 ,JDK1.8 ,同時定好4個節點的端口,我這里主節點為默認10911,從節點設置成 10950,另外nameserver都是默認9876端口,這些都好了之后一定記得將這些端口全部開放。我這里兩台節點分別是192.168.1.101,192.168.1.102.
記得修改兩台機器上的 runbroker.sh 與 runserver.sh 的虛擬機參數。
設置好節點的數據存儲路徑:
mkdir /mysoft/rocketmq/data mkdir /mysoft/rocketmq/data/store 存儲路徑 mkdir /mysoft/rocketmq/data/store/commitlog //commitLog 存儲路徑 mkdir /mysoft/rocketmq/data/store/consumequeue //消費隊列存儲路徑存儲路徑 mkdir /mysoft/rocketmq/data/store/index //消息索引存儲路徑
這里需要配置4個配置文件,我們就在原來配置上進行一些簡單的增加及修改,分別是:
- 192.168.1.101上的 ${ROCKETMQ-HOME}/conf/2m-2s-sync/broker-a.properties,${ROCKETMQ-HOME}/conf/2m-2s-sync/broker-b-s.properties
- 192.168.1.102上的 ${ROCKETMQ-HOME}/conf/2m-2s-sync/broker-b.properties,${ROCKETMQ-HOME}/conf/2m-2s-sync/broker-a-s.properties.
修改日志文件(兩台機器):
mkdir -p /mysoft/rocketmq/logs cd /mysoft/rocketmq/conf && sed -i 's#${user.home}#/mysoft/rocketmq#g' *.xml
192.168.1.101:${ROCKETMQ-HOME}/conf/2m-2s-sync/broker-a.properties:
brokerClusterName=DefaultCluster brokerName=broker-a brokerId=0 deleteWhen=04 fileReservedTime=48 brokerRole=SYNC_MASTER flushDiskType=ASYNC_FLUSH namesrvAddr=192.168.1.101:9876;192.168.1.102:9876 #store存儲路徑,master與slave目錄要不同 storePathRootDir=/mysoft/rocketmq/data/store #commitLog存儲路徑 storePathCommitLog=/mysoft/rocketmq/data/store/commitlog brokerIP1=192.168.1.101
#很重要 slave通信用
brokerIP2=192.168.1.101
${ROCKETMQ-HOME}/conf/2m-2s-sync/broker-b-s.properties:
brokerClusterName=DefaultCluster brokerName=broker-b brokerId=1 brokerIP1=192.168.1.101 deleteWhen=04 listenPort=10950 fileReservedTime=48 brokerRole=SLAVE flushDiskType=ASYNC_FLUSH namesrvAddr=192.168.1.101:9876;192.168.1.102:9876 storePathRootDir=/mysoft/rocketmq/data/store/slave storePathCommitLog=/mysoft/rocketmq/data/store/slave/commitlog
192.168.1.102上的 ${ROCKETMQ-HOME}/conf/2m-2s-sync/broker-b.properties:
brokerClusterName=DefaultCluster brokerName=broker-b brokerId=0 brokerIP1=192.168.1.102 deleteWhen=04 fileReservedTime=48 namesrvAddr=192.168.1.101:9876;192.168.1.102:9876 storePathRootDir=/mysoft/rocketmq/data/store storePathCommitLog=/mysoft/rocketmq/data/store/commitlog brokerRole=SYNC_MASTER flushDiskType=ASYNC_FLUSH
brokerIP2=192.168.1.102
${ROCKETMQ-HOME}/conf/2m-2s-sync/broker-a-s.properties:
brokerClusterName=DefaultCluster brokerName=broker-a listenPort=10950 brokerId=1 deleteWhen=04 fileReservedTime=48 brokerIP1=192.168.1.102 brokerRole=SLAVE namesrvAddr=192.168.1.101:9876;192.168.1.102:9876 storePathRootDir=/mysoft/rocketmq/data/store/slave storePathCommitLog=/mysoft/rocketmq/data/store/slave/commitlog flushDiskType=ASYNC_FLUSH
具體的配置可以參考一下這個文件去根據自身業務需求進行設置:
//所屬集群名稱,如果多個master,那么每個master配置的名稱應該一致,要不然識別不了 brokerClusterName=rocketmq-cluster //broker名稱 brokerName=broker-a //0 表示master,>0 表示slave brokerId=0 //nameServer地址,分號隔開 namesrvAddr=192.168.5.100:9876;192.168.5.101:9876 //在發送消息時,自動創建服務器不存在的topic,默認創建的隊列數 defaultTopicQueueNums=4 //是否允許broker自動創建topic,建議線下開啟,線上關閉 autoCreateTopicEnable=true //是否允許broker自動創建訂閱組,建議線下開始,線上關閉 autoCreateSubscriptionGroup=true //broker對外服務的監聽端口, //同一台機器部署多個broker,端口號要不同,且端口號之間要相距大些 listenPort=10911 //刪除文件的時間節點,默認凌晨4點 deleteWhen=04 //文件保留時間,默認48小時 fileReservedTime=48 //commitLog每個文件的大小,默認大小1g mapedFileSizeCommitLog=1073741824 //consumeQueue每個文件默認存30w條,根據自身業務進行調整 mapedFileSizeConsumeQueue=300000 destroyMapedFileInterval=120000 redeleteHangedFileInterval=120000 //檢查物理文件磁盤空間 diskMaxUsedSpaceRatio=88 //store存儲路徑,master與slave目錄要不同 storePathRootDir=/mysoft/rocketmq/data/store //commitLog存儲路徑 storePathCommitLog=/mysoft/rocketmq/data/store/commitlog //限制的消息大小 maxMessageSize=65536 flushCommitLogLeastPages=4 flushConsumeQueueLeastPages=2 flushCommitLogThoroughInterval=10000 flushConsumeQueueThoroughInterval=60000 checkTransactionMessageEnable=false //發消息線程池數 sendMessageThreadPoolNums=128 //拉去消息線程池數 pullMessageThreadPoolNums=128 //broker角色: //ASYSC_MASTER 異步復制master //SYSC_MASTER 同步復制master //SLAVE 從 brokerRole=SYSC_MASTER ///刷盤方式 //ASYNC_FLUSH 異步刷盤 //SYNC_FLUSH 同步刷盤 flushDiskType=ASYNC_FLUSH
先啟動兩台的 namesrv 。記得查看日志信息,確保兩台都啟動了 。然后啟動broker。
//192.168.1.101 nohup sh mqbroker -c ../conf/2m-2s-sync/broker-a.properties & nohup sh mqbroker -c ../conf/2m-2s-sync/broker-b-s.properties & //192.168.1.102 nohup sh mqbroker -c ../conf/2m-2s-sync/broker-b.properties & nohup sh mqbroker -c ../conf/2m-2s-sync/broker-a-s.properties &
啟動后一定去看一下日志,出現以下信息應該就是啟動成功了:
也可以通過命令查看:sh mqadmin clusterlist -n 192.168.1.101:9876
至此集群啟動完成,客戶端再鏈接的時候通過設置 namesrv 如下去鏈接,其他一致:
consumer.setNamesrvAddr("192.168.1.101:9876;192.168.1.102:9876");