學習筆記:RocketMQ集群部署

集群部署方式

單Master模式

只有一個 Master節點

優點:配置簡單,方便部署

缺點:這種方式風險較大,一旦Broker重啟或者宕機時,會導致整個服務不可用,不建議線上環境使用

多Master模式

一個集群無 Slave,全是 Master,例如 2 個 Master 或者 3 個 Master

優點:配置簡單,單個Master 宕機或重啟維護對應用無影響,在磁盤配置為RAID10 時,即使機器宕機不可恢復情況下,由與 RAID10磁盤非常可靠,消息也不會丟(異步刷盤丟失少量消息,同步刷盤一條不丟)。性能最高。多 Master 多 Slave 模式,異步複製

缺點:單臺機器宕機期間,這臺機器上未被消費的消息在機器恢復之前不可訂閱,消息實時性會受到受到影響

多Master多Slave模式(異步複製)---本文稍後以這種方式部署集群為例

每個 Master 配置一個 Slave,有多對Master-Slave, HA,採用異步複製方式,主備有短暫消息延遲,毫秒級。

優點:即使磁盤損壞,消息丟失的非常少,且消息實時性不會受影響,因為Master 宕機後,消費者仍然可以從 Slave消費,此過程對應用透明。不需要人工干預。性能同多 Master 模式幾乎一樣。

缺點: Master 宕機,磁盤損壞情況,會丟失少量消息。

多Master多Slave模式(同步雙寫)---文中會說明補充此集群配置,線上使用的話,推薦使用此模式集群

每個 Master 配置一個 Slave,有多對Master-Slave, HA採用同步雙寫方式,主備都寫成功,嚮應用返回成功。

優點:數據與服務都無單點, Master宕機情況下,消息無延遲,服務可用性與數據可用性都非常高

缺點:性能比異步複製模式略低,大約低 10%左右,發送單個消息的 RT會略高。目前主宕機後,備機不能自動切換為主機,後續會支持自動切換功能

Rocketmq雙主從異步複製集群部署(文中包含同步雙寫集群的配置說明)

一、預裝環境:

rhel 6.9(其實redhat & centos 6~7都是通用的)

jdk-1.8

git,maven(非必須)

二、集群結構:


學習筆記:RocketMQ集群部署

三、下載解壓

下載地址: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

四、創建存儲路徑

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和環境變量

兩臺服務器修改/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已經為我們配置了相應配置目錄

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 對外服務的監聽端口

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消息同步完成後,再返回發送成功的狀態。ASYNC即異步更新,master與slave有短暫消息延遲,毫秒級。本文在此使用了異步複製集群模式,線上環境推薦使用同步雙寫模式,即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 自動創建Topic

autoCreateTopicEnable=true

# 是否允許 Broker 自動創建訂閱組

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消息同步完成後,再返回發送成功的狀態。ASYNC即異步更新,master與slave有短暫消息延遲,毫秒級。本文在此使用了異步複製集群模式ASYNC_MASTER,線上環境推薦使用同步雙寫模式,即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

七、修改啟動腳本參數

繼續國際慣例,修改之前先備份,兩臺服務器相同操作

cd /opt/apps/rocketmq/bin

cp runbroker.sh runbroker.sh.default

調一下JVM,包括nameserver 和 broker。限於自己機器的配置,參數調小一下。但Rocketmq最少的堆是1g,否則無法啟動。兩臺機器執行相同的操作。

JAVA_OPT="${JAVA_OPT} -server -Xms16g -Xmx16g -Xmn8g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g"

八、服務啟動

要先啟動namerserver,再啟broker,兩臺機器執行相同的操作。

這裡為了未來方便運維,最好是寫好相應的服務啟動腳本,養成一個好習慣比擁有一個好記性更友愛不是麼~

① 啟動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

查看服務啟動後的機器狀態:

[@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


學習筆記:RocketMQ集群部署

部分開了天眼的童鞋可能看到上面jps時,有一個rocketmq-console-ng-1.0.0.jar,這裡就具體說一下rocketmq的管控臺,可以隨時觀測和修改rocketmq的狀態和一些配置

這個管控臺在GitHub上也有項目,GitHub地址:https://github.com/apache/rocketmq-externals,再次感謝國際開源組織gay站的無私貢獻,讓眾基可以做伸手黨,而且現在管控臺還能顯示簡體中文了~具體的介紹GitHub上有說,這裡限於篇幅就不多囉嗦了

步入正題,如何部署rocketmq管控臺

這裡還是福利一波吧,不用看GitHub如何編譯部署blablabla,筆者直接送上編譯好的jar包,綠色無毒請大家安心下載,如果鏈接有問題不能下載,可以發我郵件向我要([email protected])

鏈接: 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 重啟可能會導致正在發往這臺機器的的消息發送失敗,RocketMQ提供了一種優雅關閉Broker的方法,通過執行以下命令會清除Broker的寫權限,過40s後,所有客戶端都會更新Broker路由信息,此時再關閉Broker就不會發生髮送消息失敗的情況,因為所有消息都發往了其他 Broker。

# sh mqadmin wipeWritePerm -b brokerName -n namesrvAddr

Master 與Slave的關係

RocketMQ的開源版本,Master宕機,Slave不能切換為Master,這裡的Slave不可寫,但可讀,類似於 Mysql 主備方式。


分享到:


相關文章: