1. 程式人生 > >RocketMQ系列(二)環境搭建

RocketMQ系列(二)環境搭建

RocketMQ的基本概念在上一篇中給大家介紹了,這一節將給大家介紹環境搭建。RocketMQ中最基礎的就是NameServer,我們先來看看它是怎麼搭建的。 ## NameServer RocketMQ要求的環境是JDK8以上,我們先檢查一下環境, ```shell [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`目錄下, ```shell [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包, ```shell [root@centOS-1 opt]# unzip rocketmq-all-4.7.0-bin-release.zip ``` 這裡使用的是unzip命令,如果你的機器裡沒有這個命令,可以使用`yum install`安裝一個。解壓以後,進入到RocketMQ的主目錄,並且啟動一下NameServer。 ```shell [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的啟動檔案, ```shell [root@centOS-1 rocketmq-all-4.7.0-bin-release]# vim bin/runserver.sh ``` ```shell 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後不支援的幾個引數, ```shell 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, ```shell [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中已經有例子了,我們先一下配置檔案。 ```shell [root@centOS-1 rocketmq-all-4.7.0-bin-release]# vim conf/2m-2s-async/broker-a.properties ``` 這個配置檔案是`broker-a`“主”的配置檔案, ```shell 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的從配置, ```shell 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(從)的配置檔案中,增加配置,如下: ```shell 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(從)也要做修改,如下: ```shell 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`上啟動,如下, ```shell 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`上啟動,如下, ```shell 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,命令如下: ```shell ./bin/mqadmin clusterlist -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876' ``` * clusterlist 是檢視叢集的命令 * -n 後面是NameServer的地址,**注意這裡也要用''括起來,並且地址之間要用;隔開** 執行結果如下: ```shell #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-a`和`broker-b`,而且每一個broker都有主從,broker的ip我們也可以看到。 好了~ 到這裡RocketMQ的叢集就搭建好了,有問題評論區留