四臺(tái)服務(wù)器
nameIP服務(wù)?配置
rocketmq-a
192.168.33.11broker-a,namesrv,consolecpu:2,內(nèi)存:2G
rocketmq-a-s
192.168.33.12broker-a-s,namesrv,console
cpu:2,內(nèi)存:2G
rocketmq-b
192.168.33.13
broker-b,namesrv,console
cpu:2,內(nèi)存:2G
rocketmq-b-s
192.168.33.14
broker-b-s,namesrv,console
cpu:2,內(nèi)存:2G
運(yùn)行初始化腳本
搭建java-1.8環(huán)境,略
RocketMQ部署類型
單個(gè)Master
? ??單機(jī)模式, 即只有一個(gè)Broker, 如果Broker宕機(jī)了, 會(huì)導(dǎo)致RocketMQ服務(wù)不可用, 不推薦使用.
多Master模式
? ??組成一個(gè)集群, 集群每個(gè)節(jié)點(diǎn)都是Master節(jié)點(diǎn), 配置簡(jiǎn)單, 性能也是最高, 某節(jié)點(diǎn)宕機(jī)重啟不會(huì)影響RocketMQ服務(wù), 缺點(diǎn)就是如果某個(gè)節(jié)點(diǎn)宕機(jī)了, 會(huì)導(dǎo)致該節(jié)點(diǎn)未被消費(fèi)的消息在在節(jié)點(diǎn)恢復(fù)前不可訂閱.
多Master多Slave模式,異步復(fù)制
? ??每個(gè)Master配置一個(gè)Slave, 多對(duì)Master-Slave, Master與Slave消息采用異步復(fù)制方式, 主從消息一致會(huì)有毫秒級(jí)的延遲. 優(yōu)點(diǎn)是彌補(bǔ)了多Master模式下節(jié)點(diǎn)宕機(jī)后在恢復(fù)前不可訂閱的問題, 在Master宕機(jī)后, 消費(fèi)者還可以從Slave節(jié)點(diǎn)進(jìn)行消費(fèi), 缺點(diǎn)就是如果Master宕機(jī), 磁盤損壞的情況下, 如果沒有即使將消息復(fù)制到Slave, 會(huì)導(dǎo)致有少量消息丟失.
多Master多Slave模式,同步雙寫
? ??每個(gè)Master配置一個(gè)Slave,有多對(duì)Master-Slave,HA采用同步雙寫方式,主備都寫成功,向應(yīng)用返回成功。數(shù)據(jù)與服務(wù)都無單點(diǎn),Master宕機(jī)情況下,消息無延遲,服務(wù)可用性與數(shù)據(jù)可用性都非常高。缺點(diǎn)就是性能比異步復(fù)制模式略低,大約低10%左右,發(fā)送單個(gè)消息的RT會(huì)略高。
由于項(xiàng)目對(duì)于安全性要求較高,所以選擇多Master多Slave模式,同步雙寫模式
首先編譯源碼包
rocketmq-a節(jié)點(diǎn)
```
mkdir/data/
cd/data
#maven環(huán)境
wgethttp://mirrors.hust.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tarxvfapache-maven-3.6.3-bin.tar.gz-C/data
cat>>/etc/profile<<EOF
exportMAVEN_HOME=/data/maven
exportPATH=\$PATH:\$MAVEN_HOME/bin
EOF
source/etc/profile
mvn--version
?
#rocketmqlogs路徑在這里寫死了,需要改源碼:user.home改為/data,根據(jù)自己需要? ? ? ? ? 未能解決
#vim /data/rocketmq-release-4.5.2/client/src/main/java/org/apache/rocketmq/client/log/ClientLogger.java
#String clientLogRoot = System.getProperty(CLIENT_LOG_ROOT, System.getProperty("/data") + "/logs/rocketmqlogs")
?
#編譯
wgethttps://codeload.github.com/apache/rocketmq/zip/release-4.5.2
unziprocketmq-release-4.5.2.zip
cdrocketmq-release-4.5.2
mvn-Prelease-all-DskipTestscleaninstall-U
#編譯完成后文件路徑:./distribution/target/rocketmq-4.5.2.tar.gz
#分發(fā)文件
scp./distribution/target/rocketmq-4.5.2.tar.gz192.168.33.12:/data
scp./distribution/target/rocketmq-4.5.2.tar.gz192.168.33.13:/data
scp./distribution/target/rocketmq-4.5.2.tar.gz192.168.33.14:/data
mv./distribution/target/rocketmq-4.5.2.tar.gz/data
```
配置broker,namesrv
rocketmq-a節(jié)點(diǎn)
```
useradd-s/sbin/nologinrocketmq
?
tarxvfrocketmq-4.5.2.tar.gz
ln-srocketmq-4.5.2rocketmq
mkdir-pv/data/rocketmq/store/{commitlog,consumequeue,index}
#配置namesrv
cd/data/rocketmq/conf
vimnamesrv.properties#默認(rèn)沒有這個(gè)文件,新建一個(gè)
listenPort=5432
#配置broker
cd/data/rocketmq/conf/2m-2s-sync
vimbroker-a.properties
#集群名字,識(shí)別標(biāo)識(shí),必須統(tǒng)一
brokerClusterName=Ty-rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣? 例如:在a.properties 文件中寫 broker-a? 在b.properties 文件中寫 broker-b
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,這里nameserver是單臺(tái),如果nameserver是多臺(tái)集群的話,就用分號(hào)分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.33.11:5432;192.168.33.12:5432;192.168.33.13:5432;192.168.33.14:5432#默認(rèn)9876,修改只為驗(yàn)證配置文件
#在發(fā)送消息時(shí),自動(dòng)創(chuàng)建服務(wù)器不存在的topic,默認(rèn)創(chuàng)建的隊(duì)列數(shù)。由于是4個(gè)broker節(jié)點(diǎn),所以設(shè)置為4
defaultTopicQueueNums=4
#是否允許 Broker 自動(dòng)創(chuàng)建Topic,建議線下開啟,線上關(guān)閉
autoCreateTopicEnable=true
#是否允許 Broker 自動(dòng)創(chuàng)建訂閱組,建議線下開啟,線上關(guān)閉
autoCreateSubscriptionGroup=true
#Broker 對(duì)外服務(wù)的監(jiān)聽端口
listenPort=10911
#刪除文件時(shí)間點(diǎn),默認(rèn)凌晨 4點(diǎn)
deleteWhen=04
#文件保留時(shí)間,默認(rèn) 48 小時(shí)
fileReservedTime=120
#commitLog每個(gè)文件的大小默認(rèn)1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個(gè)文件默認(rèn)存30W條,根據(jù)業(yè)務(wù)情況調(diào)整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測(cè)物理文件磁盤空間
diskMaxUsedSpaceRatio=80
#存儲(chǔ)路徑
storePathRootDir=/data/rocketmq/store
#commitLog 存儲(chǔ)路徑
storePathCommitLog=/data/rocketmq/store/commitlog
#消費(fèi)隊(duì)列存儲(chǔ)路徑存儲(chǔ)路徑
storePathConsumeQueue=/data/rocketmq/store/consumequeue
#消息索引存儲(chǔ)路徑
storePathIndex=/data/rocketmq/store/index
#checkpoint 文件存儲(chǔ)路徑
storeCheckpoint=/data/rocketmq/store/checkpoint
#abort 文件存儲(chǔ)路徑
abortFile=/data/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#Broker 的角色
#- ASYNC_MASTER 異步復(fù)制Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發(fā)消息線程池?cái)?shù)量
#sendMessageThreadPoolNums=128
#拉消息線程池?cái)?shù)量
#pullMessageThreadPoolNums=128
?
?
?
#編寫service文件
vim/usr/lib/systemd/system/rocketmq.service
[Unit]
After=network-online.target
?
[Service]
#配置文件的名字,根據(jù)每個(gè)服務(wù)器的角色更改
ExecStart=/data/rocketmq/bin/mqbroker-c/data/rocketmq/conf/2m-2s-sync/broker-a.properties
StandardOutput=journal
StandardError=inherit
LimitNOFILE=65536
TimeoutStopSec=0
KillSignal=SIGTERM
SendSIGKILL=no
SuccessExitStatus=0
Restart=always
User=rocketmq
Group=rocketmq
WorkingDirectory=/data/rocketmq/
?
[Install]
WantedBy=multi-user.target
?
scp/usr/lib/systemd/system/rocketmq.service192.168.33.12:/usr/lib/systemd/system/
scp/usr/lib/systemd/system/rocketmq.service192.168.33.13:/usr/lib/systemd/system/
scp/usr/lib/systemd/system/rocketmq.service192.168.33.14:/usr/lib/systemd/system/
?
#修改日志目錄,默認(rèn)在用戶家目錄下
sed-i's#${user.home}#/data#g'/data/rocketmq/conf/*.xml
```
?
rocketqm-a-s節(jié)點(diǎn)
```
cd/data
useradd-s/sbin/nologinrocketmq
tarxvfrocketmq-4.5.2.tar.gz
ln-srocketmq-4.5.2rocketmq
mkdir-pv/data/rocketmq/store/{commitlog,consumequeue,index}
#配置namesrv,不配置沒所謂
cd/data/rocketmq/conf
vimnamesrv.properties#默認(rèn)沒有這個(gè)文件,新建一個(gè)
listenPort=5432
#配置broker
cd/data/rocketmq/conf/2m-2s-sync
vimbroker-a-s.properties#僅三個(gè)地方不一樣
brokerName=broker-a#名稱需要和主節(jié)點(diǎn)保持一致?
brokerId=1#ID=0為master,大于0為slave
brokerRole=SLAVE#配置為從
?
vim/usr/lib/systemd/system/rocketmq.service
ExecStart=/data/rocketmq/bin/mqbroker-c/data/rocketmq/conf/2m-2s-sync/broker-a-s.properties#修改配置文件為a-s
sed-i's#${user.home}#/data#g'/data/rocketmq/conf/*.xml
```
rocketqm-b節(jié)點(diǎn)
```
cd/data
tarxvfrocketmq-4.5.2.tar.gz
ln-srocketmq-4.5.2rocketmq
mkdir-pv/data/rocketmq/store/{commitlog,consumequeue,index}
#配置namesrv
cd/data/rocketmq/conf
vimnamesrv.properties#默認(rèn)沒有這個(gè)文件,新建一個(gè)
listenPort=5432
#配置broker
cd/data/rocketmq/conf/2m-2s-sync
vimbroker-b.properties#僅三個(gè)地方不一樣
brokerName=broker-b#名稱需要和主節(jié)點(diǎn)保持一致?
brokerId=0#ID=0為master,大于0為slave
brokerRole=SYNC_MASTER#配置為主
?
vim/usr/lib/systemd/system/rocketmq.service
ExecStart=/data/rocketmq/bin/mqbroker-c/data/rocketmq/conf/2m-2s-sync/broker-b.properties#修改配置文件為a-s
?
sed-i's#${user.home}#/data#g'/data/rocketmq/conf/*.xml? #日志路徑
```
rocketqm-b-s節(jié)點(diǎn)
```
cd/data
tarxvfrocketmq-4.5.2.tar.gz
ln-srocketmq-4.5.2rocketmq
mkdir-pv/data/rocketmq/store/{commitlog,consumequeue,index}
#配置namesrv
cd/data/rocketmq/conf
vimnamesrv.properties#默認(rèn)沒有這個(gè)文件,新建一個(gè)
listenPort=5432
#配置broker
cd/data/rocketmq/conf/2m-2s-sync
vimbroker-b-s.properties#僅三個(gè)地方不一樣
brokerName=broker-b#名稱需要和主節(jié)點(diǎn)保持一致?
brokerId=1#ID=0為master,大于0為slave
brokerRole=SLAVE#配置為從
?
vim/usr/lib/systemd/system/rocketmq.service
ExecStart=/bin/sh-c'/data/rocketmq/bin/mqbroker -c /data/rocketmq/conf/2m-2s-sync/broker-b-s.properties'#修改配置文件為a-s
?
sed-i's#${user.home}#/data/rocketmq#g'/data/rocketmq/conf/*.xml
```
四臺(tái)服務(wù)器首先啟動(dòng)namesrv
rocketmq-a
```
vim/usr/lib/systemd/system/namesrv.service
[Unit]
After=network-online.target
?
[Service]
ExecStart=/data/rocketmq/bin/mqnamesrv
StandardOutput=journal
StandardError=inherit
LimitNOFILE=65536
TimeoutStopSec=0
KillSignal=SIGTERM
SendSIGKILL=no
SuccessExitStatus=0
Restart=always
User=rocketmq
Group=rocketmq
WorkingDirectory=/data/rocketmq/
?
[Install]
WantedBy=multi-user.target
?
systemctlenablenamesrv.service&&systemctlstartnamesrv.service
?
scp/usr/lib/systemd/system/namesrv.service192.168.33.12:/usr/lib/systemd/system/
scp/usr/lib/systemd/system/namesrv.service192.168.33.13:/usr/lib/systemd/system/
scp/usr/lib/systemd/system/namesrv.service192.168.33.14:/usr/lib/systemd/system/
```
其他幾臺(tái)服務(wù)器啟動(dòng)namesrv.service
```
systemctl enable? namesrv.service
systemctlstartnamesrv.service
```
所有節(jié)點(diǎn),修改broker內(nèi)存使用
根據(jù)環(huán)境決定,這是本機(jī)測(cè)試內(nèi)存較小使用的數(shù)值
```
vim/data/rocketmq/bin/runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"
```
所有節(jié)點(diǎn)啟動(dòng)rocketmq.service
``
systemctlenablerocketmq&&systemctlstartrocketmq
```
rocketMq監(jiān)控平臺(tái)rocketmq-console高可用部署
rocketmq-a節(jié)點(diǎn)
高可用設(shè)想,在所有節(jié)點(diǎn)上部署rocketmq-console,使用F5進(jìn)行調(diào)度實(shí)現(xiàn)高可用
```
cd/data
wgethttps://github.com/apache/rocketmq-externals/archive/rocketmq-console-1.0.0.tar.gz
tarxvfrocketmq-console-1.0.0.tar.gz
vim/data/rocketmq-externals-rocketmq-console-1.0.0/rocketmq-console/src/main/resources/application.properties
server.contextPath=
server.port=8080#監(jiān)聽端口
#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=192.168.33.11:5432;192.168.33.12:5432;192.168.33.13:5432;192.168.33.14:5432#namesrv的地址ip:port;
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=#Rocket如果開啟了VIP通道,VIP通道端口為10911-2=10909。若Rocket服務(wù)器未啟動(dòng)端口10909,則報(bào)connect to <:10909> failed。
#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
?
#修改日志路徑
vim/data/rocketmq-externals-rocketmq-console-1.0.0/rocketmq-console/src/main/resources/logback.xml
<file>/data/logs/consolelogs/rocketmq-console.log</file>
<fileNamePattern>/data/logs/consolelogs/rocketmq-console-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
?
cd/data/rocketmq-externals-rocketmq-console-1.0.0/rocketmq-console
mvncleanpackage-Dmaven.test.skip=true
#編譯好的包:/data/rocketmq-externals-rocketmq-console-1.0.0/rocketmq-console/target/rocketmq-console-ng-1.0.0.jar
?
?
?
vim/usr/lib/systemd/system/rocketmq-console.service
[Unit]
After=network-online.target
?
[Service]
ExecStart=java-jar/data/rocketmq-externals-rocketmq-console-1.0.0/rocketmq-console/target/rocketmq-console-ng-1.0.0.jar
StandardOutput=journal
StandardError=inherit
LimitNOFILE=65536
TimeoutStopSec=0
KillSignal=SIGTERM
SendSIGKILL=no
SuccessExitStatus=0
Restart=always
User=rocketmq
Group=rocketmq
WorkingDirectory=/data//rocketmq-console/
?
[Install]
WantedBy=multi-user.target
?
systemctlenablerocketmq-console.service
systemctlstartrocketmq-console.service
```