Apache RocketMQ 集群搭建(兩主兩從)
Apache RocketMQ 系列:
Apache RocketMQ之JMS基本概念及使用:http://www.reibang.com/p/d2e3fd77c4f4
Apache RocketMQ 基礎(chǔ)概念及架構(gòu)解析:http://www.reibang.com/p/95ab928960b3
Apache RocketMQ 的基礎(chǔ)特性介紹:http://www.reibang.com/p/570680b32590
Apache RocketMQ 集群搭建(兩主兩從):http://www.reibang.com/p/b090138cf52c
Apache RocketMQ 刷盤策略與復(fù)制策略: http://www.reibang.com/p/d66b381428bb
RocketMQ 架構(gòu)圖
消息中間件和RPC最大區(qū)別:Broker Cluster存儲
NameServer: 提供輕量級的服務(wù)發(fā)現(xiàn)和路由奄容。 每個 NameServer 記錄完整的路由信息,提供等效的讀寫服務(wù),并支持快速存儲擴(kuò)展伤为。
Broker: 通過提供輕量級的 Topic 和 Queue 機(jī)制來處理消息存儲,同時支持推(push)和拉(pull)模式以及主從結(jié)構(gòu)的容錯機(jī)制。
Producer:生產(chǎn)者筷黔,產(chǎn)生消息的實(shí)例笼裳,擁有相同 Producer Group 的 Producer 組成一個集群。
Consumer:消費(fèi)者眠寿,接收消息進(jìn)行消費(fèi)的實(shí)例,擁有相同 Consumer Group 的
Consumer 組成一個集群焦蘑。
從 Broker 開始盯拱,Broker Master1 和 Broker Slave1 是主從結(jié)構(gòu),它們之間會進(jìn)行數(shù)據(jù)同步,即 Date Sync狡逢。同時每個 Broker 與
NameServer 集群中的所有節(jié)點(diǎn)建立長連接宁舰,定時注冊 Topic 信息到所有NameServer 中。
Producer 與 NameServer 集群中的其中一個節(jié)點(diǎn)(隨機(jī)選擇)建立長連接奢浑,定期從 NameServer 獲取 Topic 路由信息蛮艰,并向提供 Topic 服務(wù)的 Broker Master 建立長連接,且定時向 Broker 發(fā)送心跳雀彼。
Producer 只能將消息發(fā)送到 Broker master壤蚜,但是 Consumer 則不一樣,它同時和提供 Topic 服務(wù)的 Master 和 Slave
建立長連接徊哑,既可以從 Broker Master 訂閱消息袜刷,也可以從 Broker Slave 訂閱消息。
RocketMQ 集群部署模式
單 master 模式:
優(yōu)點(diǎn):除了配置簡單沒什么優(yōu)點(diǎn)莺丑,適合個人學(xué)習(xí)使用著蟹。
缺點(diǎn):不可靠,該機(jī)器重啟或宕機(jī)梢莽,將導(dǎo)致整個服務(wù)不可用萧豆。
多 master 模式:
多個 master 節(jié)點(diǎn)組成集群,單個 master 節(jié)點(diǎn)宕機(jī)或者重啟對應(yīng)用沒有影響昏名。
優(yōu)點(diǎn):所有模式中性能最高
缺點(diǎn):單個 master 節(jié)點(diǎn)宕機(jī)期間涮雷,未被消費(fèi)的消息在節(jié)點(diǎn)恢復(fù)之前不可用,消息的實(shí)時性就受到影響葡粒。
注意:使用同步刷盤可以保證消息不丟失份殿,同時 Topic 相對應(yīng)的 queue 應(yīng)該分布在集群中各個節(jié)點(diǎn),而不是只在某各節(jié)點(diǎn)上嗽交,否則卿嘲,該節(jié)點(diǎn)宕機(jī)會對訂閱該 topic 的應(yīng)用造成影響。
多 master 多 slave 異步復(fù)制模式:
在多 master 模式的基礎(chǔ)上夫壁,每個 master 節(jié)點(diǎn)都有至少一個對應(yīng)的 slave拾枣。master
節(jié)點(diǎn)可讀可寫,但是 slave 只能讀不能寫盒让,類似于 mysql 的主備模式梅肤。
優(yōu)點(diǎn): 在 master 宕機(jī)時,消費(fèi)者可以從 slave讀取消息邑茄,消息的實(shí)時性不會受影響姨蝴,性能幾乎和多 master 一樣。
缺點(diǎn):使用異步復(fù)制的同步方式有可能會有消息丟失的問題肺缕。
多 master 多 slave 同步雙寫模式:
同多 master 多 slave 異步復(fù)制模式類似左医,區(qū)別在于 master 和 slave 之間的數(shù)據(jù)同步方式授帕。
優(yōu)點(diǎn):同步雙寫的同步模式能保證數(shù)據(jù)不丟失。
缺點(diǎn):發(fā)送單個消息 RT 會略長浮梢,性能相比異步復(fù)制低10%左右跛十。
刷盤策略:同步刷盤和異步刷盤(指的是節(jié)點(diǎn)自身數(shù)據(jù)是同步還是異步存儲)
同步方式:同步雙寫和異步復(fù)制(指的一組 master 和 slave 之間數(shù)據(jù)的同步)
注意:要保證數(shù)據(jù)可靠,需采用同步刷盤和同步雙寫的方式秕硝,但性能會較其他方式低芥映。
開始集群搭建:2M-2S-SYNC(兩主兩從同步寫)
軟件依賴:
環(huán)境介紹:
IP | 部署服務(wù) | 角色 |
---|---|---|
192.168.5.100 | NameServer | -- |
192.168.5.101 | NameServer | -- |
192.168.5.100 | broker-a | master |
192.168.5.100 | broker-b-s | slave |
192.168.5.101 | broker-b | master |
192.168.5.101 | broker-a-s | slave |
環(huán)境變量配置:
#設(shè)置jdk環(huán)境變量
export JAVA_HOME=/usr/local/java/jdk1.8.0_191 #jdk安裝目錄
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
#設(shè)置 rocketmq 環(huán)境變量
export ROCKETMQ_HOME=/usr/local/rocketmq/rocketmq-4.2
export PATH=$PATH::$ROCKETMQ_HOME/bin
防火墻設(shè)置:
如果是開發(fā)環(huán)境 # service iptables stop 直接關(guān)閉防火墻
若是生產(chǎn)環(huán)境就需要配置防火墻,增加端口規(guī)則远豺,默認(rèn)nameserver端口是9876奈偏,筆者直接就關(guān)閉防火墻服務(wù)。
注:另一臺機(jī)器也是如此操作憋飞!
解壓完成后創(chuàng)建目錄:
mkdir /usr/local/rocketmq/rocketmq-4.2/data/store 存儲路徑
mkdir /usr/local/rocketmq/rocketmq-4.2/data/store/commitlog commitLog 存儲路徑
mkdir /usr/local/rocketmq/rocketmq-4.2/data/store/consumequeue 消費(fèi)隊(duì)列存儲路徑存儲路徑
mkdir /usr/local/rocketmq/rocketmq-4.2/data/store/index 消息索引存儲路徑
[root@node-100 store]# pwd
/usr/local/rocketmq/rocketmq-4.2/data/store
[root@node-100 store]# ls
checkpoint commitlog config consumequeue index lock slave
[root@node-100 store]#
修改配置文件:
[root@node-100 2m-2s-sync]# pwd
/usr/local/rocketmq/rocketmq-4.2/conf/2m-2s-sync
[root@node-100 2m-2s-sync]# ls
broker-a.properties broker-a-s.properties broker-b.properties broker-b-s.properties nohup.out
[root@node-100 2m-2s-sync]# vim broker-a.properties
192.168.5.100機(jī)器配置如下:
broker-a.properties:
#所屬集群名稱霎苗,如果多個master,那么每個master配置的名稱應(yīng)該一致榛做,要不然識別不了
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
#在發(fā)送消息時检眯,自動創(chuàng)建服務(wù)器不存在的topic,默認(rèn)創(chuàng)建的隊(duì)列數(shù)
defaultTopicQueueNums=4
#是否允許broker自動創(chuàng)建topic昆淡,建議線下開啟锰瘸,線上關(guān)閉
autoCreateTopicEnable=true
#是否允許broker自動創(chuàng)建訂閱組,建議線下開始昂灵,線上關(guān)閉
autoCreateSubscriptionGroup=true
#broker對外服務(wù)的監(jiān)聽端口避凝,
#同一臺機(jī)器部署多個broker,端口號要不同眨补,且端口號之間要相距大些
listenPort=10911
#刪除文件的時間節(jié)點(diǎn)管削,默認(rèn)凌晨4點(diǎn)
deleteWhen=04
#文件保留時間,默認(rèn)48小時
fileReservedTime=120
#commitLog每個文件的大小撑螺,默認(rèn)大小1g
mapedFileSizeCommitLog=1073741824
#consumeQueue每個文件默認(rèn)存30w條含思,根據(jù)自身業(yè)務(wù)進(jìn)行調(diào)整
mapedFileSizeConsumeQueue=300000
destroyMapedFileInterval=120000
redeleteHangedFileInterval=120000
#檢查物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#store存儲路徑,master與slave目錄要不同
storePathRootDir=/usr/local/rocketmq/rocketmq-4.2/data/store
#commitLog存儲路徑
storePathCommitLog=/usr/local/rocketmq/rocketmq-4.2/data/store/commitlog
#限制的消息大小
maxMessageSize=65536
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000
checkTransactionMessageEnable=false
#發(fā)消息線程池?cái)?shù)
sendMessageThreadPoolNums=128
#拉去消息線程池?cái)?shù)
pullMessageThreadPoolNums=128
#broker角色:
#ASYSC_MASTER 異步復(fù)制master
#SYSC_MASTER 同步復(fù)制master
#SLAVE 從
brokerRole=SYSC_MASTER
#刷盤方式
#ASYNC_FLUSH 異步刷盤
#SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
broker-b-s.properties:
brokerClusterName=rocketmq-cluster
brokerName=broker-b
#0 -> master ,>0 -> slave
brokerId=1
namesrvAddr=192.168.5.100:9876;192.168.5.101:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=10950
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
destroyMapedFileInterval=120000
redeleteHangedFileInterval=120000
diskMaxUsedSpaceRatio=88
storePathRootDir=/usr/local/rocketmq/rocketmq-4.2/data/store/slave
storePathCommitLog=/usr/local/rocketmq/rocketmq-4.2/data/store/slave/commitlog
maxMessageSize=65536
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000
checkTransactionMessageEnable=false
sendMessageThreadPoolNums=128
pullMessageThreadPoolNums=128
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
192.168.5.101機(jī)器配置如下:
broker-a-s.properties:
brokerClusterName=rocketmq-cluster
brokerName=broker-a
brokerId=1
namesrvAddr=192.168.5.100:9876;192.168.5.101:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=10950
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
destroyMapedFileInterval=120000
redeleteHangedFileInterval=120000
diskMaxUsedSpaceRatio=88
storePathRootDir=/usr/local/rocketmq/rocketmq-4.2/data/store/slave
storePathCommitLog=/usr/local/rocketmq/rocketmq-4.2/data/store/slave/commitlog
maxMessageSize=65536
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000
checkTransactionMessageEnable=false
sendMessageThreadPoolNums=128
pullMessageThreadPoolNums=128
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
broker-b.properties:
brokerClusterName=rocketmq-cluster
brokerName=broker-b
brokerId=0
namesrvAddr=192.168.5.100:9876;192.168.5.101:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=10911
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
destroyMapedFileInterval=120000
redeleteHangedFileInterval=120000
diskMaxUsedSpaceRatio=88
storePathRootDir=/usr/local/rocketmq/rocketmq-4.2/data/store
storePathCommitLog=/usr/local/rocketmq/rocketmq-4.2/data/store/commitlog
maxMessageSize=65536
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000
checkTransactionMessageEnable=false
sendMessageThreadPoolNums=128
pullMessageThreadPoolNums=128
brokerRole=SYSC_MASTER
flushDiskType=ASYNC_FLUSH
修改日志配置文件:
#創(chuàng)建日志目錄
mkdir -p /usr/local/rocketmq/rocketmq-4.2/logs
#替換*.xml文件中的{user.home}為自己指定的目錄
cd /usr/local/rocketmq/rocketmq-4.2/conf && sed -i 's#${user.home}#/root/svr/rocketmq#g'
*.xml
改參數(shù):
runbroker.sh,runserver.sh啟動參數(shù)默認(rèn)對jvm的堆內(nèi)存設(shè)置比較大(不改啟動不起來)甘晤,如果是虛擬機(jī)非線上環(huán)境需要改下參數(shù)含潘,大小可以根據(jù)自己機(jī)器來決定。
[root@node-100 bin]# pwd
/usr/local/rocketmq/rocketmq-4.2/bin
[root@node-100 bin]# ls
cachedog.sh mqadmin.cmd mqbroker.numanode0 mqbroker.xml mqnamesrv mqshutdown.cmd play.sh runbroker.sh startfsrv.sh
cleancache.sh mqadmin.xml mqbroker.numanode1 mqfiltersrv mqnamesrv.cmd nohup.out README.md runserver.cmd tools.cmd
cleancache.v1.sh mqbroker mqbroker.numanode2 mqfiltersrv.cmd mqnamesrv.xml os.sh runbroker runserver.sh tools.sh
mqadmin mqbroker.cmd mqbroker.numanode3 mqfiltersrv.xml mqshutdown play.cmd runbroker.cmd setcache.sh
[root@node-100 bin]#
runbroker.sh:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=15g"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
runserver.sh:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"
JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
注意:兩次機(jī)器都要設(shè)置线婚!
如果還是出現(xiàn)內(nèi)存問題遏弱,可嘗試修改下面幾個文件:
[root@node-100 bin]# pwd
/usr/local/rocketmq/rocketmq-4.2/bin
[root@node-100 bin]# ls *.xml
mqadmin.xml mqbroker.xml mqfiltersrv.xml mqnamesrv.xml
[root@node-100 bin]#
將這幾個文件中下面參數(shù)給刪掉:
-XX:PermSize 設(shè)置持久代(perm gen)初始值 物理內(nèi)存的1/64
-XX:MaxPermSize 設(shè)置持久代最大值 物理內(nèi)存的1/4
開始啟動:
先啟動namesrv(兩臺都要啟動):
[root@node-100 bin]# cd /usr/local/rocketmq/rocketmq-4.2/bin
[root@node-100 bin]# nohup sh mqnamesrv &
[1] 2601
[root@node-100 bin]# nohup: 忽略輸入并把輸出追加到"nohup.out"
[root@node-100 bin]# jps
2604 NamesrvStartup
2621 Jps
[root@node-100 bin]#
因?yàn)閞ocketmq是java開發(fā)的,所以通過jps命令查看namesrv有沒有啟動塞弊,當(dāng)然通過日志文件也可以漱逸,namesrv正常啟動之后缀踪,后續(xù)再分別啟動Broker。
啟動BrokerServer(兩臺都要啟動):
192.168.5.100:
broker-a.properties:
[root@node-100 bin]# nohup sh mqbroker -c /usr/local/rocketmq/rocketmq-4.2/conf/2m-2s-sync/broker-a.properties &
[2] 2646
[root@node-100 bin]# nohup: 忽略輸入并把輸出追加到"nohup.out"
[root@node-100 bin]# jps
2681 Jps
2650 BrokerStartup
2604 NamesrvStartup
[root@node-100 bin]#
broker-b-s.properties:
[root@node-100 bin]# nohup sh mqbroker -c /usr/local/rocketmq/rocketmq-4.2/conf/2m-2s-sync/broker-b-s.properties &
[3] 2729
[root@node-100 bin]# nohup: 忽略輸入并把輸出追加到"nohup.out"
[root@node-100 bin]#
[root@node-100 bin]# jps
2789 Jps
2650 BrokerStartup
2604 NamesrvStartup
2733 BrokerStartup
[root@node-100 bin]#
192.168.5.101:
broker-b.properties:
[root@node-101 bin]# nohup sh mqbroker -c /usr/local/rocketmq/rocketmq-4.2/conf/2m-2s-sync/broker-b.properties &
[2] 7621
[root@node-101 bin]# nohup: 忽略輸入并把輸出追加到"nohup.out"
[root@node-101 bin]#
[root@node-101 bin]# jps
7570 NamesrvStartup
7667 Jps
7625 BrokerStartup
[root@node-101 bin]#
broker-a-s.properties:
[root@node-101 bin]# nohup sh mqbroker -c /usr/local/rocketmq/rocketmq-4.2/conf/2m-2s-sync/broker-a-s.properties &
[3] 7701
[root@node-101 bin]# nohup: 忽略輸入并把輸出追加到"nohup.out"
[root@node-101 bin]# jps
7570 NamesrvStartup
7625 BrokerStartup
7705 BrokerStartup
7774 Jps
[root@node-101 bin]#
啟動完成虹脯,查看集群信息:
[root@node-100 bin]# sh mqadmin clusterlist -n 192.168.5.100: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
rocketmq-cluster broker-a 0 192.168.5.100:10911 V4_2_0_SNAPSHOT 0.00(0,0ms) 0.00(0,0ms) 0 429538.48 0.2738
rocketmq-cluster broker-a 1 192.168.5.101:10950 V4_2_0_SNAPSHOT 0.00(0,0ms) 0.00(0,0ms) 0 429538.48 0.2734
rocketmq-cluster broker-b 0 192.168.5.101:10911 V4_2_0_SNAPSHOT 0.00(0,0ms) 0.00(0,0ms) 0 429538.48 0.2734
rocketmq-cluster broker-b 1 192.168.5.100:10950 V4_2_0_SNAPSHOT 0.00(0,0ms) 0.00(0,0ms) 0 429538.48 0.2738
[root@node-100 bin]#
啟動成功驴娃!
測試:
可以啟動RocketMQ的監(jiān)控查看:
監(jiān)控源碼下載地址:
https://github.com/apache/rocketmq-externals.git
配置namesrv
rocketmq.config.namesrvAddr=192.168.5.100:9876
或者:
export NAMESRV_ADDR=192.168.5.100:9876;192.168.5.101:9876
#測試發(fā)送端
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
#測試消費(fèi)端
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
停止命令:
[root@node-101 bin]# sh mqshutdown broker
The mqbroker(7625
7705) is running...
Send shutdown request to mqbroker(7625
7705) OK
[root@node-101 bin]# sh mqshutdown namesrv
The mqnamesrv(7570) is running...
Send shutdown request to mqnamesrv(7570) OK
[3]+ 退出 143 nohup sh mqbroker -c /usr/local/rocketmq/rocketmq-4.2/conf/2m-2s-sync/broker-a-s.properties
[2]+ 退出 143 nohup sh mqbroker -c /usr/local/rocketmq/rocketmq-4.2/conf/2m-2s-sync/broker-b.properties
[root@node-101 bin]#