【環境搭建】RocketMQ叢集搭建

xbhog發表於2022-12-24

前置條件及效果圖

img

條件:

兩臺伺服器,個人是兩臺騰訊雲伺服器(其中嫖的朋友一個);

版本:

  1. rocketmq-version:4.4.0
  2. rocketmq-console(mq控制檯)
  3. Java:1.8
  4. maven:3.6.3

叢集模式選擇:

  1. 單master
  • 這種方式風險較大,一旦Broker重啟或者當機時,會導致整個服務不可用。不建議線上環境使用,可以用於本地測試。
  1. 多master
  • 優點:配置簡單,單個Master當機或重啟維護對應用無影響,在磁碟配置為RAID10時,即使機器當機不可恢復情況下,由於RAID10磁碟非常可靠,訊息也不會丟(非同步刷盤丟失少量訊息,同步刷盤一條不丟),效能最高;
  • 缺點:單臺機器當機期間,這臺機器上未被消費的訊息在機器恢復之前不可訂閱,訊息實時性會受到影響。
  1. 多master和多slave(同步)-----本次搭建的模式
  • 優點:資料與服務都無單點故障,Master當機情況下,訊息無延遲,服務可用性與資料可用性都非常高;
  • 缺點:效能比非同步複製模式略低(大約低10%左右),傳送單個訊息的RT會略高,且目前版本在主節點當機後,備機不能自動切換為主機。
  1. 多master和多slave(非同步)
  • 優點:即使磁碟損壞,訊息丟失的非常少,且訊息實時性不會受影響,同時Master當機後,消費者仍然可以從Slave消費,而且此過程對應用透明,不需要人工干預,效能同多Master模式幾乎一樣;
  • 缺點:Master當機,磁碟損壞情況下會丟失少量訊息。

下載地址:

rocketMq下載地址:https://rocketmq.apache.org/download

搭建過程

序號 IP 角色 架構模式
1 xxxx.xxx.246 nameserver、brokerserver Master1、Slave2
2 xxx.xxx..174 nameserver、brokerserver Master2、Slave1

配置Nameserver

NameServer是一個幾乎無狀態節點,可叢集部署,節點之間無任何資訊同步。

作用:管理Broker;舉例:各個郵局的管理機構

vim /etc/hosts
# nameserver
xxx.xxx.xxx.174 rocketmq-nameserver1
xxx.xxx.xxx.246 rocketmq-nameserver2

重啟下網路卡使得配置生效:

# 檢視網路卡名字
systemctl list-unit-files | grep -i network
# 根據名字重啟
systemctl restart network

關閉防火牆,開放埠號:在騰訊雲中我是開放了所有埠。

# 關閉防火牆
systemctl stop firewalld.service 
# 檢視防火牆的狀態
firewall-cmd --state 
# 禁止firewall開機啟動
systemctl disable firewalld.service

配置環境變數

Java環境配置和maven的配置:https://www.cnblogs.com/xbhog/p/15213838.html

rocketMQ的配置:將下載的包上傳至伺服器,獲得其對應路徑,進行配置

vim /etc/profile

#set rocketmq 在profile檔案的末尾加入如下命令
ROCKETMQ_HOME=/usr/local/rocketmq/rocketmq-all-4.4.0-bin-release
PATH=$PATH:$ROCKETMQ_HOME/bin
export ROCKETMQ_HOME PATH

配置生效:

source /etc/profile

配置主從節點(xxx.xxx.xxx.246伺服器)

保證一主一從:

xxx.xxx.xxx.246伺服器修改的配置檔案:broker-b.properties,broker-a-s.properties

xxx.xxx.xxx.174伺服器修改的配置檔案:broker-a.properties,broker-b-s.properties

建立所需要的儲存路徑:

主節點的檔案建立:

mkdir -p /home/ubuntu/rocketmq/store
mkdir /home/ubuntu/rocketmq/store/commitlog
mkdir /home/ubuntu/rocketmq/store/consumequeue
mkdir /home/ubuntu/rocketmq/store/index

從節點的檔案建立:

mkdir -p /home/ubuntu/rocketmq/store-s
mkdir /home/ubuntu/rocketmq/store-s/commitlog
mkdir /home/ubuntu/rocketmq/store-s/consumequeue
mkdir /home/ubuntu/rocketmq/store-s/index

注意的是,主節點和從節點使用的檔案不能一樣,否則啟動不了。

進入路徑:/rocketmq-all-4.4.0-bin-release/conf/2m-2s-sync(同步配置檔案)

img

主配置檔案:broker-b.properties

下面的配置的時候只需要修改以下幾點:

  1. brokerIP1:(配置伺服器的外網地址)非常重要,否則啟動以後,在mq-console會出現內網地址
  2. namesrvAddr:配置兩臺伺服器的外網地址加埠號
  3. brokerRole=SYNC_MASTER(主節點)
  4. storePathRootDir
  5. commitLog 儲存路徑
  6. storePathConsumeQueue 消費佇列儲存路徑儲存路徑
  7. storePathIndex 訊息索引儲存路徑
  8. storeCheckpoint 檔案儲存路徑
  9. abort 檔案儲存路徑
#所屬叢集名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置檔案填寫的不一樣
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#非常重要,否則啟動以後,在mq-console會出現內網地址
brokerIP1=xxx.xxx.xxx.246
#nameServer地址,分號分割
namesrvAddr=xxx.xxx.xxx.246:9876;xxx.xxx.xxx.174:9876
#在傳送訊息時,自動建立伺服器不存在的topic,預設建立的佇列數
defaultTopicQueueNums=4
#是否允許 Broker 自動建立Topic,建議線下開啟,線上關閉
autoCreateTopicEnable=true
#是否允許 Broker 自動建立訂閱組,建議線下開啟,線上關閉
autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽埠
listenPort=10911
#刪除檔案時間點,預設凌晨 4點
deleteWhen=04
#檔案保留時間,預設 48 小時
fileReservedTime=120
#commitLog每個檔案的大小預設1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個檔案預設存30W條,根據業務情況調整
mapedFileSizeConsumeQueue=300000
#檢測物理檔案磁碟空間
diskMaxUsedSpaceRatio=88
#儲存路徑
storePathRootDir=/home/ubuntu/rocketmq/store
#commitLog 儲存路徑
storePathCommitLog=/home/ubuntu/rocketmq/store/commitlog
#消費佇列儲存路徑儲存路徑
storePathConsumeQueue=/home/ubuntu/rocketmq/store/consumequeue
#訊息索引儲存路徑
storePathIndex=/home/ubuntu/rocketmq/store/index
#checkpoint 檔案儲存路徑
storeCheckpoint=/home/ubuntu/rocketmq/store/checkpoint
#abort 檔案儲存路徑
abortFile=/home/ubuntu/rocketmq/store/abort
#限制的訊息大小
maxMessageSize=65536
brokerRole=SYNC_MASTER
#刷盤方式
#- ASYNC_FLUSH 非同步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=SYNC_FLUSH

從配置檔案:broker-a-s.properties

下面的配置的時候只需要修改以下幾點:

  1. brokerIP1:(配置伺服器的外網地址)非常重要,否則啟動以後,在mq-console會出現內網地址
  2. namesrvAddr:配置兩臺伺服器的外網地址加埠號
  3. brokerRole=SLAVE(從節點)
  4. storePathRootDir
  5. commitLog 儲存路徑
  6. storePathConsumeQueue 消費佇列儲存路徑儲存路徑
  7. storePathIndex 訊息索引儲存路徑
  8. storeCheckpoint 檔案儲存路徑
  9. abort 檔案儲存路徑
#所屬叢集名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置檔案填寫的不一樣
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
brokerIP1=xxx.xxx.xxx.246
#nameServer地址,分號分割
namesrvAddr=xxx.xxx.xxx.246:9876;xxx.xxx.xxx.174:9876
#在傳送訊息時,自動建立伺服器不存在的topic,預設建立的佇列數
defaultTopicQueueNums=4
#是否允許 Broker 自動建立Topic,建議線下開啟,線上關閉
autoCreateTopicEnable=true
#是否允許 Broker 自動建立訂閱組,建議線下開啟,線上關閉
autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽埠
listenPort=11011
#刪除檔案時間點,預設凌晨 4點
deleteWhen=04
#檔案保留時間,預設 48 小時
fileReservedTime=120
#commitLog每個檔案的大小預設1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個檔案預設存30W條,根據業務情況調整
mapedFileSizeConsumeQueue=300000
#檢測物理檔案磁碟空間
diskMaxUsedSpaceRatio=88
#儲存路徑
storePathRootDir=/home/ubuntu/rocketmq/store-s
#commitLog 儲存路徑
storePathCommitLog=/home/ubuntu/rocketmq/store-s/commitlog
#消費佇列儲存路徑儲存路徑
storePathConsumeQueue=/home/ubuntu/rocketmq/store-s/consumequeue
#訊息索引儲存路徑
storePathIndex=/home/ubuntu/rocketmq/store-s/index
#checkpoint 檔案儲存路徑
storeCheckpoint=/home/ubuntu/rocketmq/store-s/checkpoint
#abort 檔案儲存路徑
abortFile=/home/ubuntu/rocketmq/store-s/abort
#限制的訊息大小
maxMessageSize=65536
#- SLAVE
brokerRole=SLAVE
#刷盤方式
#- ASYNC_FLUSH 非同步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH

啟動服務

在xxx.xxx.xxx.246伺服器上執行啟動操作:

首先需要修改啟動指令碼檔案(runbroker):

cd rocketmq-all-4.4.0-bin-release/bin
vim runbroker.sh
# 替換原來的資訊:原來大小是G
#===========================================================================================
# JVM Configuration
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"

同理修改啟動指令碼(runserver)

cd rocketmq-all-4.4.0-bin-release/bin
vim runserver.sh
# 替換原來的資訊:原來大小是G
#===========================================================================================
# JVM Configuration
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

啟動nameserve:

cd rocketmq-all-4.4.0-bin-release/bin

nohup sh mqnamesrv &

啟動broker,並設定啟動日誌的存放地址(啟動前需要建立日誌路徑):

nohup sh mqbroker -c ./conf/2m-2s-sync/broker-b.properties >./broker-b.log &
nohup sh mqbroker -c ./conf/2m-2s-sync/broker-a-s.properties >./broker-a-s.log &

檢視啟動效果(啟動成功):

root@VM-4-11-ubuntu:/home/ubuntu/rocketmq-all-4.4.0-bin-release# jps
796522 NamesrvStartup
2081303 BrokerStartup
2080501 BrokerStartup

伺服器(xxx.xxx.xxx.174)相關操作如上。

客戶端搭建請求叢集

叢集監控平臺搭建

RocketMQ有一個對其擴充套件的開源專案incubator-rocketmq-externals,這個專案中有一個子模組叫rocketmq-console,這個便是管理控制檯專案了,先將incubator-rocketmq-externals拉到本地,因為我們需要自己對rocketmq-console進行編譯打包執行。

git clone https://github.com/apache/rocketmq-externals
cd rocketmq-console
mvn clean package -Dmaven.test.skip=true

打包前需要在rocketmq-console中配置下namesrv叢集地址,

cd \rocketmq-console\src\main\resources

# 編輯application.properties
server.contextPath=
server.port=8080

### SSL setting
#server.ssl.key-store=classpath:rmqcngkeystore.jks
#server.ssl.key-store-password=rocketmq
#server.ssl.keyStoreType=PKCS12
#server.ssl.keyAlias=rmqcngkey

#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr  NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
rocketmq.config.namesrvAddr=xxx.xxx.xxxx.174:9876;xxx.xxx.xxx.246:9876
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true
#set the message track trace topic if you don't want use the default one
rocketmq.config.msgTrackTopicName=
rocketmq.config.ticketKey=ticket

#Must create userInfo file: ${rocketmq.config.dataPath}/users.properties if the login is required
rocketmq.config.loginRequired=false

生成jar包,上傳伺服器,

啟動:nohup java -jar rocketmq-console-ng-1.0.1.jar >./rockermq-console.log &

img

請求地址為:http://xx.xxx.xxx.246:8080/#/cluster

客戶端請求

pom.xml配置

<properties>
    <java.version>1.8</java.version>
    <rocketmq-spring-boot-starter-version>2.0.3</rocketmq-spring-boot-starter-version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--rocket-->
    <dependency>
        <groupId>org.apache.rocketmq</groupId>
        <artifactId>rocketmq-client</artifactId>
        <version>4.9.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.rocketmq</groupId>
        <artifactId>rocketmq-spring-boot-starter</artifactId>
        <version>${rocketmq-spring-boot-starter-version}</version>
    </dependency>
</dependencies>
# application.properties
rocketmq.name-server=xxx.xxx.xxx.174:9876;xxx.xxx.xxx.246:9876
rocketmq.producer.group=my-group

img

結果:Receive message:hello springboot rocketmq

相關文章