集群部署方式
單Master模式
只有一個 Master節點
優點:配置簡單,方便部署
缺點:這種方式風險較大,一旦Broker重啟或者宕機時,會導致整個服務不可用,不建議線上環境使用
多Master模式
一個集群無 Slave,全是 Master,例如 2 個 Master 或者 3 個 Master
優點:配置簡單,單個Master 宕機或重啟維護對應用無影響,在磁盤配置為RAID10 時,即使機器宕機不可恢復情況下,由與 RAID10磁盤非常可靠,消息也不會丟(異步刷盤丟失少量消息,同步刷盤一條不丟)。性能最高。多 Master 多 Slave 模式,異步複製
缺點:單臺機器宕機期間,這臺機器上未被消費的消息在機器恢復之前不可訂閱,消息實時性會受到受到影響
多Master多Slave模式(異步複製)---本文稍後以這種方式部署集群為例
每個 Master 配置一個 Slave,有多對Master-Slave, HA,採用異步複製方式,主備有短暫消息延遲,毫秒級。
優點:即使磁盤損壞,消息丟失的非常少,且消息實時性不會受影響,因為Master 宕機後,消費者仍然可以從 Slave消費,此過程對應用透明。不需要人工干預。性能同多 Master 模式幾乎一樣。
缺點: Master 宕機,磁盤損壞情況,會丟失少量消息。
多Master多Slave模式(同步雙寫)---文中會說明補充此集群配置,線上使用的話,推薦使用此模式集群
每個 Master 配置一個 Slave,有多對Master-Slave, HA採用同步雙寫方式,主備都寫成功,嚮應用返回成功。
優點:數據與服務都無單點, Master宕機情況下,消息無延遲,服務可用性與數據可用性都非常高
缺點:性能比異步複製模式略低,大約低 10%左右,發送單個消息的 RT會略高。目前主宕機後,備機不能自動切換為主機,後續會支持自動切換功能
Rocketmq雙主從異步複製集群部署(文中包含同步雙寫集群的配置說明)
一、預裝環境:
rhel 6.9(其實redhat & centos 6~7都是通用的)
jdk-1.8
git,maven(非必須)
二、集群結構:
三、下載解壓
下載地址:http://mirror.bit.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip
mkdir -p /opt/apps_install/rocketmq-4.2.0
cd /opt/apps_install/rocketmq-4.2.0
unzip rocketmq-all-4.2.0-bin-release.zip
ln -s /opt/apps_install/rocketmq-4.2.0 /opt/apps/rocketmq
四、創建存儲路徑
10.16.13.90(rocketmq-nameserver-1):
mkdir -p /data/rocketmq/store/{rootdir-a-m,commitlog-a-m,rootdir-b-s,commitlog-b-s}
10.16.13.91(rocketmq-nameserver-2):
mkdir -p /data/rocketmq/store/{rootdir-b-m,commitlog-b-m,rootdir-a-s,commitlog-a-s}
五、配置hosts和環境變量
兩臺服務器修改/etc/hosts,加入下面兩行
10.16.13.90 rocketmq-nameserver-1
10.16.13.91 rocketmq-nameserver-2
修改/etc/profile,加入
export ROCKETMQ_HOME=/opt/apps/rocketmq
export PATH=$ROCKETMQ_HOME/bin:$PATH
source /etc/profile
六、修改配置文件
國際慣例,修改之前先備份~以防意外
cd /opt/apps/rocketmq;cp -r conf/ conf.default/
因為本文采用雙主雙從異步複製,默認的rocketmq已經為我們配置了相應配置目錄
cd /opt/apps/rocketmq/conf/2m-2s-async
10.16.13.90 rocketmq-nameserver-1 角色:broker-a-master & broker-b-slave
vim broker-a.properties
#所屬集群名字
brokerClusterName=sns-rocket-mq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=rocketmq-nameserver-1
#brokerId 0 表示 Master,>0 表示 Slave
brokerId=0
# Broker 對外服務的監聽端口
listenPort=10911
#nameServer地址,分號分割
namesrvAddr=rocketmq-nameserver-1:9876;rocketmq-nameserver-2:9876
# 刪除文件時間點,默認凌晨 4點
deleteWhen=04
#文件保留時間,默認 48 小時
fileReservedTime=72
#Broker role有3種:SYNC MASTER、ASYNC MASTER、SLAVE。關鍵詞SYNC和ASYNC表示Master和Slave之間同步消息的機制,SYNC即同步更新,指當Slave和Master消息同步完成後,再返回發送成功的狀態。ASYNC即異步更新,master與slave有短暫消息延遲,毫秒級。本文在此使用了異步複製集群模式,線上環境推薦使用同步雙寫模式,即SYNC_MASTER
brokerRole=ASYNC_MASTER
# 刷盤方式 ASYNC_FLUSH 異步刷盤
flushDiskType=ASYNC_FLUSH
#存儲路徑
storePathRootDir=/data/rocketmq/store/rootdir-a-m
storePathCommitLog=/data/rocketmq/store/commitlog-a-m
# 是否允許 Broker 自動創建Topic
autoCreateTopicEnable=true
# 是否允許 Broker 自動創建訂閱組
autoCreateSubscriptionGroup=true
vim broker-b-s.properties
brokerClusterName=sns-rocket-mq-cluster
brokerName=rocketmq-nameserver-2
listenPort=10921
namesrvAddr=rocketmq-nameserver-1:9876;rocketmq-nameserver-2:9876
brokerId=1
deleteWhen=04
fileReservedTime=72
brokerRole=SLAVE
storePathRootDir=/data/rocketmq/store/rootdir-b-s
storePathCommitLog=/data/rocketmq/store/commitlog-b-s
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
flushDiskType=ASYNC_FLUSH
10.16.13.91 rocketmq-nameserver-2 角色:broker-b-master & broker-a-slave
vim broker-b.properties
brokerClusterName=sns-rocket-mq-cluster
brokerName=rocketmq-nameserver-2
brokerIP1=10.16.13.91
brokerId=0
listenPort=10911
namesrvAddr=rocketmq-nameserver-1:9876;rocketmq-nameserver-2:9876
deleteWhen=04
fileReservedTime=72
## Broker role有3種:SYNC MASTER、ASYNC MASTER、SLAVE。關鍵詞SYNC和ASYNC表示Master和Slave之間同步消息的機制,SYNC即同步更新,指當Slave和Master消息同步完成後,再返回發送成功的狀態。ASYNC即異步更新,master與slave有短暫消息延遲,毫秒級。本文在此使用了異步複製集群模式ASYNC_MASTER,線上環境推薦使用同步雙寫模式,即SYNC_MASTER。
brokerRole=ASYNC_MASTER
storePathRootDir=/data/rocketmq/store/rootdir-b-m
storePathCommitLog=/data/rocketmq/store/commitlog-b-m
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
flushDiskType=ASYNC_FLUSH
vim broker-a-s.properties
brokerClusterName=sns-rocket-mq-cluster
brokerName=rocketmq-nameserver-1
listenPort=10921
namesrvAddr=rocketmq-nameserver-1:9876;rocketmq-nameserver-2:9876
brokerId=1
deleteWhen=04
fileReservedTime=72
brokerRole=SLAVE
storePathRootDir=/data/rocketmq/store/rootdir-a-s
storePathCommitLog=/data/rocketmq/store/commitlog-a-s
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
flushDiskType=ASYNC_FLUSH
修改日誌配置文件(兩臺一樣)
mkdir -p /opt/apps/rocketmq/logs
cd /opt/apps/rocketmq/conf
sed -i 's#${user.home}#/opt/apps/rocketmq#g' *.xml
七、修改啟動腳本參數
繼續國際慣例,修改之前先備份,兩臺服務器相同操作
cd /opt/apps/rocketmq/bin
cp runbroker.sh runbroker.sh.default
調一下JVM,包括nameserver 和 broker。限於自己機器的配置,參數調小一下。但Rocketmq最少的堆是1g,否則無法啟動。兩臺機器執行相同的操作。
JAVA_OPT="${JAVA_OPT} -server -Xms16g -Xmx16g -Xmn8g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g"
八、服務啟動
要先啟動namerserver,再啟broker,兩臺機器執行相同的操作。
這裡為了未來方便運維,最好是寫好相應的服務啟動腳本,養成一個好習慣比擁有一個好記性更友愛不是麼~
① 啟動nameserver,兩臺機器操作相同
mkdir -p /opt/scripts/rocketmq
cd /opt/scripts/rocketmq
vim start_rocketmq_nameserver.sh
#!/bin/bash
source /etc/profile
nohup sh /opt/apps/rocketmq/bin/mqnamesrv > /data/rocketmq/store/mqnamesrv.log 2>&1 &
② 啟動broker。當然兩臺機器不一樣,這裡一個一個來
10.16.13.90 rocketmq-nameserver-1
vim start_broker_a_master.sh
#!/bin/bash
nohup sh /opt/apps/rocketmq/bin/mqbroker -c /opt/apps/rocketmq/conf/2m-2s-async/broker-a.properties > /data/rocketmq/store/broker-a-m.log 2>&1 &
vim start_broker_b_slave.sh
#!/bin/bash
nohup sh /opt/apps/rocketmq/bin/mqbroker -c /opt/apps/rocketmq/conf/2m-2s-async/broker-b-s.properties > /data/rocketmq/store/broker-b-s.log 2>&1 &
10.16.13.91 rocketmq-nameserver-2
vim start_broker_b_master.sh
#!/bin/bash
nohup sh /opt/apps/rocketmq/bin/mqbroker -c /opt/apps/rocketmq/conf/2m-2s-async/broker-b.properties > /data/rocketmq/store/broker-b-m.log 2>&1 &
vim start_broker_a_slave.sh
#!/bin/bash
nohup sh /opt/apps/rocketmq/bin/mqbroker -c /opt/apps/rocketmq/conf/2m-2s-async/broker-a-s.properties > /data/rocketmq/store/broker-a-s.log 2>&1 &
這裡再囉嗦一遍,先啟動nameserver,再啟動broker,兩臺機器的啟動順序:啟動nameserver---啟動broker master---啟動broker slave,done
都啟動完畢之後可以jps看一下
[@bx_13_90 /opt/scripts/rocketmq]# jps
60161 BrokerStartup
147505 Jps
59300 NamesrvStartup
60760 rocketmq-console-ng-1.0.0.jar
124248 BrokerStartup
查看服務啟動後的機器狀態:
[@bx_13_90 /opt/scripts/rocketmq]# mqadmin clusterList --namesrvAddr=10.16.13.90:9876
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
#Cluster Name #Broker Name #BID #Addr #Version #InTPS(LOAD) #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
sns-rocket-mq-cluster rocketmq-nameserver-1 0 10.16.13.90:10911 V4_2_0_SNAPSHOT 0.00(0,0ms) 0.00(0,0ms) 0 425360.18 0.0000
sns-rocket-mq-cluster rocketmq-nameserver-1 1 10.16.13.91:10921 V4_2_0_SNAPSHOT 0.00(0,0ms) 0.00(0,0ms) 0 425360.18 0.0000
sns-rocket-mq-cluster rocketmq-nameserver-2 0 10.16.13.91:10911 V4_2_0_SNAPSHOT 0.00(0,0ms) 0.00(0,0ms) 0 425360.18 0.0000
sns-rocket-mq-cluster rocketmq-nameserver-2 1 10.16.13.90:10921 V4_2_0_SNAPSHOT 0.00(0,0ms) 0.00(0,0ms) 0 425360.18 0.0000
九、服務關閉
關閉nameserver:
/opt/apps/rocketmq/bin/mqshutdown namesrv
關閉broker:
/opt/apps/rocketmq/bin/mqshutdown broker
十、部署rocketmq-console
部分開了天眼的童鞋可能看到上面jps時,有一個rocketmq-console-ng-1.0.0.jar,這裡就具體說一下rocketmq的管控臺,可以隨時觀測和修改rocketmq的狀態和一些配置
這個管控臺在GitHub上也有項目,GitHub地址:https://github.com/apache/rocketmq-externals,再次感謝國際開源組織gay站的無私貢獻,讓眾基可以做伸手黨,而且現在管控臺還能顯示簡體中文了~具體的介紹GitHub上有說,這裡限於篇幅就不多囉嗦了
步入正題,如何部署rocketmq管控臺
這裡還是福利一波吧,不用看GitHub如何編譯部署blablabla,筆者直接送上編譯好的jar包,綠色無毒請大家安心下載,如果鏈接有問題不能下載,可以發我郵件向我要([email protected])
鏈接: https://pan.baidu.com/s/1Y4fzVc2r30jtIVpvYZocWA 密碼: vj2y
mkdir -p /opt/apps_install/rocketmq-console/
把下載好的jar包放在這裡
啟動腳本start.sh
#!/bin/bash
nohup java -jar ./rocketmq-console-ng-1.0.0.jar --server.port=8080 --rocketmq.config.namesrvAddr=10.16.13.90:9876;10.16.13.91:9876 &
訪問ip:8080即可
Tips:
Broker 重啟對客戶端的影響
Broker 重啟可能會導致正在發往這臺機器的的消息發送失敗,RocketMQ提供了一種優雅關閉Broker的方法,通過執行以下命令會清除Broker的寫權限,過40s後,所有客戶端都會更新Broker路由信息,此時再關閉Broker就不會發生髮送消息失敗的情況,因為所有消息都發往了其他 Broker。
# sh mqadmin wipeWritePerm -b brokerName -n namesrvAddr
Master 與Slave的關係
RocketMQ的開源版本,Master宕機,Slave不能切換為Master,這裡的Slave不可寫,但可讀,類似於 Mysql 主備方式。
閱讀更多 wendellFang 的文章
關鍵字: Hat Enterprise Git