RocketMQ系列(二)環境搭建

RocketMQ的基本概念在上一篇中給大家介紹了,這一節將給大家介紹環境搭建。RocketMQ中最基礎的就是NameServer,我們先來看看它是怎麼搭建的。

NameServer

RocketMQ要求的環境是JDK8以上,我們先檢查一下環境,

[root@centOS-1 ~]# java -version
openjdk version "11.0.3" 2019-04-16 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.3+7-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.3+7-LTS, mixed mode, sharing)

我的這個機器並沒有刻意的安裝JDK,而是系統自帶的OpenJDK 11,這應該也是沒有問題的。然後我們從RocketMQ官網下載最新的安裝包,並且上傳到/opt目錄下,

[root@centOS-1 opt]# ll
-rw-r--r--.  1 root  root 13838456 6月   3 08:49 rocketmq-all-4.7.0-bin-release.zip

然後我們解壓這個zip包,

[root@centOS-1 opt]# unzip rocketmq-all-4.7.0-bin-release.zip

這裏使用的是unzip命令,如果你的機器里沒有這個命令,可以使用yum install安裝一個。解壓以後,進入到RocketMQ的主目錄,並且啟動一下NameServer。

[root@centOS-1 opt]# cd rocketmq-all-4.7.0-bin-release
[root@centOS-1 rocketmq-all-4.7.0-bin-release]# ./bin/mqnamesrv
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
Unrecognized VM option 'UseCMSCompactAtFullCollection'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

這裏出了一個錯誤Error: Could not create the Java Virtual Machine,這是由於RocketMQ的啟動文件都是按照JDK8配置的,而我們這裏使用的是OpenJDK11,有很多命令參數不支持導致的,如果小夥伴們使用的是JDK8,正常啟動是沒有問題的。

在這裏我們改一下RocketMQ的啟動文件,

[root@centOS-1 rocketmq-all-4.7.0-bin-release]# vim bin/runserver.sh 
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
#在CLASSPATH中添加RocketMQ的lib目錄
#export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
export CLASSPATH=.:${BASE_DIR}/lib/*:${BASE_DIR}/conf:${CLASSPATH}

修改的地方我們增加了註釋,在ClassPath里添加了lib目錄,然後在這個文件的末尾,註釋掉升級JDK后不支持的幾個參數,

JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
#JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8  -XX:-UseParNewGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log -XX:+PrintGCDetails"
#JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
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}"

好了,修改完以後,我們保存退出,再次啟動,這次我們在後台啟動NameServer,

[root@centOS-1 rocketmq-all-4.7.0-bin-release]# nohup ./bin/mqnamesrv &

[root@centOS-1 rocketmq-all-4.7.0-bin-release]# tail -500f ~/logs/rocketmqlogs/namesrv.log 

然後查看一下日誌,在日誌中看到main - The Name Server boot success. serializeType=JSON,說明NameServer啟動成功了。

單點的NameServer肯定是不能滿足我們的要求的,怎麼也要做個集群吧。NameServer是一個無狀態的服務,節點之間沒有任何數據往來,所以NameServer的集群搭建不需要任何的配置,只需要啟動多個NameServer服務就可以了,它不像Zookeeper集群搭建那樣,需要配置各個節點。在這裏我們就啟動3個NameServer節點吧,對應我們的3台機器,192.168.73.130,192.168.73.131,192.168.73.132

Broker

NameServer集群搭建完成,下面就搭建Broker了,Broker呢,我們要搭建一個兩主兩從結構的,主從之間異步備份,保存磁盤也是使用異步的方式。如果你對主從同步和保存磁盤的方式還不了解,看看上一節的內容吧。異步兩主兩從這種結構的配置,在RocketMQ中已經有例子了,我們先一下配置文件。

[root@centOS-1 rocketmq-all-4.7.0-bin-release]# vim conf/2m-2s-async/broker-a.properties 

這個配置文件是broker-a“主”的配置文件,

brokerClusterName=RocketMQ-Cluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

其中,

  • brokerClusterName是MQ集群的名稱,我們改為RocketMQ-Cluster。
  • brokerName是隊列的名字,配置為broker-a。
  • brokerId是隊列的id,0代表是“主”,其他正整數代表着“從”。
  • deleteWhen=04 代表着commitLog過期了,就會被刪除。
  • fileReservedTime是commitLog的過期時間,單位是小時,這裏配置的是48小時。
  • brokerRole,隊列的角色,ASYNC_MASTER是異步主。
  • flushDiskType,保存磁盤的方式,異步保存。

再看看broker-a的從配置,

brokerClusterName=RocketMQ-Cluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

其中,集群的名字一樣,隊列的名字一樣,只是brokerId和brokerRole不一樣,這裏的配置代表着它是隊列broker-a的“從”。broker-b的配置和broker-a是一樣的,只是brokerName不一樣而已,在這裏就不貼出來了。

兩主兩從的配置文件都已經配置好了,我們來規劃一下,我們的NameServer是3台192.168.73.130,192.168.73.131,192.168.73.132,broker按照如下部署:

  • broker-a(主):192.168.73.130
  • broker-a(從):192.168.73.131
  • broker-b(主):192.168.73.131
  • broker-b(從):192.168.73.130

接下來,我們啟動broker,在192.168.73.130上啟動 broker-a(主)和broker-b(從)。和NameServer一樣,我們需要修改一下啟動的腳本,否則也會報錯誤。我們修改的是runbroker.sh這個文件,修改的內容和前面是一樣的,這裏就不贅述了。在啟動文件中,內存大小配置的是8g,如果機器的內存不夠,可以適當減少一下內存。

這裏還要做個說明,由於我們在一台機器上啟動了兩個broker實例,監聽端口和日誌存儲的路徑都會有衝突。那麼我們在192.168.73.130的broker-b(從)的配置文件中,增加配置,如下:

brokerClusterName=RocketMQ-Cluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

listenPort=11911
storePathRootDir=~/store-b                       

broker-b(從)的端口改為11911,區別默認的10911;storePathRootDir改為~/store-b,區分默認的~/store

同樣在192.168.73.131的broker-a(從)也要做修改,如下:

brokerClusterName=RocketMQ-Cluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

listenPort=11911
storePathRootDir=~/store-a

然後,我們在192.168.73.130上啟動,如下,

nohup ./bin/mqbroker -c conf/2m-2s-async/broker-a.properties -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876' &

nohup ./bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876' &

  • -c 指定的是配置文件,分別指定的是broker-a(主)和broker-b(從)。
  • -n 指定的是NameServer的地址,指定了3個,用,隔開。

再在192.168.73.131上啟動,如下,

nohup ./bin/mqbroker -c conf/2m-2s-async/broker-b.properties -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876' &

nohup ./bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876' &

好,如果沒有出現錯誤,到這裏,集群就搭建成功了。這裏邊有個小坑,大家一定要注意,就是-n後面的地址一定要用”括起來,並且地址之間要用;,否則,我們在查看集群列表時,是看不到的。

mqadmin

集群已經搭建好了,我們可以查看一下集群的狀態,查看集群的狀態,我們可以使用mqadmin,命令如下:

./bin/mqadmin clusterlist -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876'
  • clusterlist 是查看集群的命令
  • -n 後面是NameServer的地址,注意這裏也要用”括起來,並且地址之間要用;隔開

執行結果如下:

#Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
RocketMQ-Cluster  broker-a                0     192.168.73.130:10911   V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 442039.47 -1.0000
RocketMQ-Cluster  broker-a                1     192.168.73.131:11911   V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 442039.47 0.2956
RocketMQ-Cluster  broker-b                0     192.168.73.131:10911   V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 442039.47 0.2956
RocketMQ-Cluster  broker-b                1     192.168.73.130:11911   V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 442039.47 -1.0000

我們可以看到在這個NameServer中心中,只有一個broker集群RocketMQ-Cluster,有兩個broker,broker-abroker-b,而且每一個broker都有主從,broker的ip我們也可以看到。

好了~ 到這裏RocketMQ的集群就搭建好了,有問題評論區留言哦~~

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

※回頭車貨運收費標準