27 部署一個小規(guī)模的 RocketMQ 集群,為壓測做好準(zhǔn)備

部署一個小規(guī)模的 RocketMQ 集群,為壓測做好準(zhǔn)備
1、小猛的第一個實戰(zhàn)任務(wù):部署一個小規(guī)模的RocketMQ集群
既然已經(jīng)完成了RocketMQ生產(chǎn)架構(gòu)的設(shè)計了,接著就得一步一步完成真正的生產(chǎn)集群的部署了,明哥這個時候給小猛布置了第一個實戰(zhàn)任務(wù),就是先分配幾臺機器給小猛,讓他完成一個小規(guī)模的RocketMQ集群的部署。
這個小規(guī)模的RocketMQ集群部署好了之后,還需要對這個集群進(jìn)行壓測,看一看在公司的機器配置下,可以抗下多高的QPS。
小猛接下了這個任務(wù),同時又看了看他之前設(shè)計出來的最終生產(chǎn)部署架構(gòu)圖,他知道這個圖僅僅是一個邏輯架構(gòu)圖,不是物理部署架構(gòu)圖,但是物理部署架構(gòu)圖得參照這個邏輯架構(gòu)圖才能部署出來。
? ? ? ? ? ?

? ? ? ? ? ??
2、公司給小猛分配的第一批機器
小猛先看了看公司給他分配的第一批機器的各項配置,然后迅速基于這批機器制定了RocketMQ集群部署的規(guī)劃。
NameServer:3臺機器,每臺機器都是8核CPU + 16G內(nèi)存 + 500G磁盤 + 千兆網(wǎng)卡
Broker:6臺機器,每臺機器都是24核CPU(兩顆x86_64 cpu,每顆cpu是12核) + 48G內(nèi)存 + 1TB磁盤 + 千兆網(wǎng)卡
生產(chǎn)者:2臺機器,每臺機器都是4核CPU + 8G內(nèi)存 + 500GB磁盤 + 千兆網(wǎng)卡
消費者:2臺機器,每臺機器都是4核CPU + 8G內(nèi)存 + 500GB磁盤 + 千兆網(wǎng)卡
NameServer是核心的路由服務(wù),所以給8核16G的較高配置的機器,但是他一般就是承載Broker注冊和心跳、系統(tǒng)的路由表拉取等請求,負(fù)載其實很低,因此不需要特別高的機器配置,部署三臺也可以實現(xiàn)高可用的效果了。
Broker是最負(fù)載最高的,未來要承載高并發(fā)寫入和海量數(shù)據(jù)存儲,所以把最高配置的機器都會留給他,這里用3臺機器組成一個“單Master + 雙Slave”的集群。
生產(chǎn)者和消費者機器都是臨時用來測試的,而且一般他們都是業(yè)務(wù)系統(tǒng),只會部署在標(biāo)準(zhǔn)的4核8G的機器配置下。
所有機器都是千兆網(wǎng)卡,足夠他們使用了。
小猛看著自己手頭的機器,點點頭,可以開始部署了。
3、選擇一臺機器快速部署RocketMQ嘗試一下
首先,小猛的第一步不是一下子就把整個集群部署好,而是先找一臺機器準(zhǔn)備在上面先快速部署一個RocketMQ嘗試一下。
在機器上部署RocketMQ之前,先安裝一下JDK,同時要在環(huán)境變量中設(shè)置Java_HOME,這個小猛很熟練就搞定了。(畫外音,如果有不會的同學(xué),可以自己查閱資料)
接著在一臺機器上執(zhí)行了下面的命令來構(gòu)建Dledger:
git clone?https://github.com/openmessaging/openmessaging-storage-dledger.git
cd openmessaging-storage-dledger
mvn clean install -DskipTests
接著小猛在機器上個執(zhí)行了下面的命令來構(gòu)建RocketMQ:
git clone https://github.com/apache/rocketmq.git
cd rocketmq
git checkout -b store_with_dledger origin/store_with_dledger
mvn -Prelease-all -DskipTests clean install -U
接著進(jìn)入一個目錄中:
cd distribution/target/apache-rocketmq
在這個目錄中,需要編輯三個文件,一個是bin/runserver.sh,一個是bin/runbroker.sh,另外一個是bin/tools.sh
在里面找到如下三行,然后將第二行和第三行都刪了,同時將第一行的值修改為你自己的JDK的主目錄
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"
注:如果要查看你的JDK裝哪兒了,可以用命令:/usr/libexec/java_home -V,修改為你的Java主目錄即可
接著執(zhí)行下面的命令進(jìn)行快速RocketMQ集群啟動:
sh bin/dledger/fast-try.sh start
這個命令會在當(dāng)前這臺機器上啟動一個NameServer和三個Broker,三個Broker其中一個是Master,另外兩個是Slave,瞬間就可以組成一個最小可用的RocketMQ集群。
接著使用下面的命令檢查一下RocketMQ集群的狀態(tài):
sh bin/mqadmin clusterList -n 127.0.0.1:9876
此時你需要等待一會兒,這個命令執(zhí)行的過程會有點緩慢,大概可能幾秒到幾十秒過后,你會看到三行記錄,說是一個RaftCluster,Broker名稱叫做RaftNode00,然后BID是0、1、2,也有可能是0、1、3
這就說明的RocketMQ集群啟動成功了,BID為0的就是Master,BID大于0的就都是Slave,其實在這里也可以叫做Leader和Follower
接著就可以嘗試一下Slave是如何自動切換為Master的了。
我們看到三臺機器的地址分別為:
192.168.31.153:30921
192.168.31.153:30911
192.168.31.153:30931
我們發(fā)現(xiàn)30921端口的Broker的BID是0,說明他是Master
此時我們可以用命令(lsof -i:30921)找出來占用30921端口的進(jìn)程PID,接著就用kill -9的命令給他殺了,比如我這里占用30921端口的進(jìn)程PID是4344,那么就執(zhí)行命令:kill -9 4344
接著等待個10s,再次執(zhí)行命令查看集群狀態(tài):
sh bin/mqadmin clusterList -n 127.0.0.1:9876
此時就會發(fā)現(xiàn)作為Leader的BID為0的節(jié)點,變成另外一個Broker了,這就是說Slave切換為Master了。
4、完成正式三臺NameServer的部署
其實RocketMQ集群部署并不難,主要就是在幾臺機器上做好相應(yīng)的配置,然后執(zhí)行一些命令啟動NameServer和Broker就可以了。
首先是在三臺NameServer的機器上,大家就按照上面的步驟安裝好Java,構(gòu)建好Dledger和RocketMQ,然后編輯對應(yīng)的文件,設(shè)置好JAVA_HOME就可以了。
此時可以執(zhí)行如下的一行命令就可以啟動NameServer:
nohup sh mqnamesrv &
這個NameServer監(jiān)聽的接口默認(rèn)就是9876,所以如果你在三臺機器上都啟動了NameServer,那么他們的端口都是9876,此時我們就成功的啟動了三個NameServer了
5、完成一組Broker集群的部署
接著需要啟動一個Master Broker和兩個Slave Broker,這個啟動也很簡單,分別在上述三臺為Broker準(zhǔn)備的高配置機器上,安裝好Java,構(gòu)建好Dledger和RocketMQ,然后編輯好對應(yīng)的文件。
接著就可以執(zhí)行如下的命令:
nohup sh bin/mqbroker -c conf/dledger/broker-n0.conf &
這里要給大家說一下,第一個Broker的配置文件是broker-n0.conf,第二個broker的配置文件可以是broker-n1.conf,第三個broker的配置文件可以是broker-n2.conf。
對于這個配置文件里的東西要給大家說明一下,自己要做對應(yīng)的修改。
我們用broker-n0.conf舉例子,然后在每個配置項上加入注釋,告訴大家應(yīng)該如何修改每臺機器的配置:
# 這個是集群的名稱,你整個broker集群都可以用這個名稱
brokerClusterName = RaftCluster
# 這是Broker的名稱,比如你有一個Master和兩個Slave,那么他們的Broker名稱必須是一樣的,因為他們?nèi)齻€是一個分組,如果你有另外一組Master和兩個Slave,你可以給他們起個別的名字,比如說RaftNode01
brokerName=RaftNode00
# 這個就是你的Broker監(jiān)聽的端口號,如果每臺機器上就部署一個Broker,可以考慮就用這個端口號,不用修改
listenPort=30911
# 這里是配置NameServer的地址,如果你有很多個NameServer的話,可以在這里寫入多個NameServer的地址
namesrvAddr=127.0.0.1:9876
# 下面兩個目錄是存放Broker數(shù)據(jù)的地方,你可以換成別的目錄,類似于是/usr/local/rocketmq/node00之類的
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
# 這個是非常關(guān)鍵的一個配置,就是是否啟用DLeger技術(shù),這個必須是true
enableDLegerCommitLog=true
# 這個一般建議和Broker名字保持一致,一個Master加兩個Slave會組成一個Group
dLegerGroup=RaftNode00
# 這個很關(guān)鍵,對于每一組Broker,你得保證他們的這個配置是一樣的,在這里要寫出來一個組里有哪幾個Broker,比如在這里假設(shè)有三臺機器部署了Broker,要讓他們作為一個組,那么在這里就得寫入他們?nèi)齻€的ip地址和監(jiān)聽的端口號
dLegerPeers=n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913
# 這個是代表了一個Broker在組里的id,一般就是n0、n1、n2之類的,這個你得跟上面的dLegerPeers中的n0、n1、n2相匹配
dLegerSelfId=n0
# 這個是發(fā)送消息的線程數(shù)量,一般建議你配置成跟你的CPU核數(shù)一樣,比如我們的機器假設(shè)是24核的,那么這里就修改成24核
sendMessageThreadPoolNums=24
上面說完了這個配置文件在各個Broker上應(yīng)該如何修改,其實你結(jié)合之前學(xué)習(xí)過的Broker的工作原理,就應(yīng)該理解這些配置的含義了。
其實最關(guān)鍵的是,你的Broker是分為多組的,每一組是三個Broker,一個Master和兩個Slave。
對每一組Broker,他們的Broker名稱、Group名稱都是一樣的,然后你得給他們配置好一樣的dLegerPeers(里面是組內(nèi)三臺Broker的地址)
然后他們得配置好對應(yīng)的NameServer的地址,最后還有就是每個Broker有自己的ID,在組內(nèi)是唯一的就可以了,比如說不同的組里都有一個ID為n0的broker,這個是可以的。
所以按照這個思路就可以輕松的配置好一組Broker,在三臺機器上分別用命令啟動Broker即可。啟動完成過后,可以跟NameServer進(jìn)行通信,檢查Broker集群的狀態(tài),就是如下命令:
sh bin/mqadmin clusterList -n 127.0.0.1:9876。
6、編寫最基本的生產(chǎn)者和消費者代碼準(zhǔn)備壓測
接著就可以編寫最基本的生產(chǎn)者和消費者代碼,準(zhǔn)備執(zhí)行壓測了。
可以新建兩個工程,一個是生產(chǎn)者,一個是消費者,兩個工程都需要加入下面的依賴:

然后生產(chǎn)者的示例代碼如下,大家現(xiàn)在不需要知道里面的含義,只要知道他可以發(fā)送消息即可,基本的代碼說明都寫在下面的注釋里了
簡單來說,就是只要一運行,就立馬不停的在while死循環(huán)里去發(fā)送消息,根據(jù)需要可以設(shè)置為多個線程:

接著是示例用的消費者代碼,如下所示,關(guān)鍵的注釋都寫在里面了,消費者就是不停的去獲取消息然后打印出來即可:

小猛忙活了幾天總算弄完了一個小集群,由三個NameServer、三個Broker以及四個業(yè)務(wù)系統(tǒng)機器組成,他試了一下,Broker都正常運行,請求NameServer可以看到集群信息,而且測試了一下,能夠正常的發(fā)送消息和接收消息。
一切萬事俱備,只欠東風(fēng),接下來就要調(diào)整Broker的OS內(nèi)核參數(shù)、JVM參數(shù)然后重新啟動Broker,接著就可以啟動生產(chǎn)者和消費者去發(fā)送消息和獲取消息,然后去觀察RocketMQ能承載的QPS,CPU、IO、磁盤、網(wǎng)絡(luò)等負(fù)載。
End
專欄版權(quán)歸公眾號儒猿技術(shù)窩所有
未經(jīng)許可不得傳播,如有侵權(quán)將追究法律責(zé)任