前置條件及效果圖
條件:
兩臺伺服器,個人是兩臺騰訊雲伺服器(其中嫖的朋友一個);
版本:
- rocketmq-version:4.4.0
- rocketmq-console(mq控制檯)
- Java:1.8
- maven:3.6.3
叢集模式選擇:
- 單master
- 這種方式風險較大,一旦Broker重啟或者當機時,會導致整個服務不可用。不建議線上環境使用,可以用於本地測試。
- 多master
- 優點:配置簡單,單個Master當機或重啟維護對應用無影響,在磁碟配置為RAID10時,即使機器當機不可恢復情況下,由於RAID10磁碟非常可靠,訊息也不會丟(非同步刷盤丟失少量訊息,同步刷盤一條不丟),效能最高;
- 缺點:單臺機器當機期間,這臺機器上未被消費的訊息在機器恢復之前不可訂閱,訊息實時性會受到影響。
- 多master和多slave(同步)-----本次搭建的模式
- 優點:資料與服務都無單點故障,Master當機情況下,訊息無延遲,服務可用性與資料可用性都非常高;
- 缺點:效能比非同步複製模式略低(大約低10%左右),傳送單個訊息的RT會略高,且目前版本在主節點當機後,備機不能自動切換為主機。
- 多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(同步配置檔案)
主配置檔案:broker-b.properties
下面的配置的時候只需要修改以下幾點:
- brokerIP1:(配置伺服器的外網地址)非常重要,否則啟動以後,在mq-console會出現內網地址
- namesrvAddr:配置兩臺伺服器的外網地址加埠號
- brokerRole=SYNC_MASTER(主節點)
- storePathRootDir
- commitLog 儲存路徑
- storePathConsumeQueue 消費佇列儲存路徑儲存路徑
- storePathIndex 訊息索引儲存路徑
- storeCheckpoint 檔案儲存路徑
- 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
下面的配置的時候只需要修改以下幾點:
- brokerIP1:(配置伺服器的外網地址)非常重要,否則啟動以後,在mq-console會出現內網地址
- namesrvAddr:配置兩臺伺服器的外網地址加埠號
- brokerRole=SLAVE(從節點)
- storePathRootDir
- commitLog 儲存路徑
- storePathConsumeQueue 消費佇列儲存路徑儲存路徑
- storePathIndex 訊息索引儲存路徑
- storeCheckpoint 檔案儲存路徑
- 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 &
請求地址為: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
結果:Receive message:hello springboot rocketmq