rocketmq高可用集群部署(RocketMQ-on-DLedger Group)
rocketmq部署架構
rocketmq部署架構非常多,都是為了解決一些問題,越來越高可用,越來越復雜。
-
單master模式
這種方式風險較大,一旦Broker重啟或者宕機時,會導致整個服務不可用。不建議線上環境使用,可以用於本地測試。
-
多master
一個集群無Slave,全是Master,例如2個Master或者3個Master
- 優點:配置簡單,單個Master宕機或重啟維護對應用無影響,在磁盤配置為RAID10時,即使機器宕機不可恢復情況下,由於RAID10磁盤非常可靠,消息也不會丟(異步刷盤丟失少量消息,同步刷盤一條不丟),性能最高;
- 缺點:單台機器宕機期間,這台機器上未被消費的消息在機器恢復之前不可訂閱,消息實時性會受到影響。
-
多master異步復制slave
每個Master配置一個Slave,有多對Master-Slave,HA采用異步復制方式,主備有短暫消息延遲(毫秒級),這種模式的優缺點如下:
- 優點:即使磁盤損壞,消息丟失的非常少,且消息實時性不會受影響,同時Master宕機后,消費者仍然可以從Slave消費,而且此過程對應用透明,不需要人工干預,性能同多Master模式幾乎一樣;
- 缺點:Master宕機,磁盤損壞情況下會丟失少量消息。
-
多master同步復制slave。
每個Master配置一個Slave,有多對Master-Slave,HA采用同步雙寫方式,即只有主備都寫成功,才向應用返回成功,這種模式的優缺點如下:
- 優點:數據與服務都無單點故障,Master宕機情況下,消息無延遲,服務可用性與數據可用性都非常高;
- 缺點:性能比異步復制模式略低(大約低10%左右),發送單個消息的RT會略高,且目前版本在主節點宕機后,備機不能自動切換為主機。
-
RocketMQ-on-DLedger Group(可自動主從容災)
之前的幾種方式,能解決數據冗余備份,一定高可用問題。但是master故障后,多master多slave架構能提供繼續想slave消費數據。但是生產數據呢?這會導致生產服務中斷不可用。所以又出現了RocketMQ-on-DLedger Group架構。可自主容災。引入了DLedger工具。
rocketmq架構:
部署架構
部署架構:RocketMQ-on-DLedger Group
服務器數量3台。
部署操作步驟
-
官網下載rocketmq二進制包
-
解壓並安裝
cd /opt wget http://192.168.0.155:9999/rocketmq-all-4.9.1-bin-release.zip unzip rocketmq-all-4.9.1-bin-release.zip mkdir /data/rocketmq-4.9.1-raftcluster
-
3台主機分別配置nameserver
修改bin目錄下的文件:runserver.sh,將jvm調整至1G。(由於我服務器資源內存有限)
-
3台主機分別啟動nameserver
cd ./bin #切換到bin目錄 nohup sh mqnamesrv > ./nameserver.log 2>&1 &
每台nameserver是不需要互相通信,NameServer之間數據不同步。和hdfs的nameserver不是一樣的概念。
通過命令
netstat -tunlp | grep 9876
檢查端口9876是否存在 -
編輯broker的配置文件
第一台主機node0的配置(192.168.0.218):
vim ./conf/dledger/broker-n0.conf
內容如下:
brokerClusterName = RaftCluster #集群名 brokerName=RaftNode00 #broker組名,建議和dLegerGroup名一致 listenPort=30911 namesrvAddr=192.168.0.218:9876;192.168.0.89:9876;192.168.0.77:9876 storePathRootDir=/data/rocketmq-4.9.1-raftcluster/rmqstore/node00 storePathCommitLog=/data/rocketmq-4.9.1-raftcluster/rmqstore/node00/commitlog enableDLegerCommitLog=true dLegerGroup=RaftNode00 #dleger組名 dLegerPeers=n0-192.168.0.218:40911;n1-192.168.0.89:40911;n2-192.168.0.77:40911 #注意配置格式 ## must be unique dLegerSelfId=n0 #每個dleger組下面的實例ip,保證唯一 sendMessageThreadPoolNums=4 #發送線程數,建議和服務器cpu一致
第二台主機node1的配置(192.168.0.89):
vim ./conf/dledger/broker-n1.conf
內容如下:
brokerClusterName = RaftCluster #集群名 brokerName=RaftNode00 #broker組名,建議和dLegerGroup名一致 listenPort=30911 namesrvAddr=192.168.0.218:9876;192.168.0.89:9876;192.168.0.77:9876 storePathRootDir=/data/rocketmq-4.9.1-raftcluster/rmqstore/node01 storePathCommitLog=/data/rocketmq-4.9.1-raftcluster/rmqstore/node01/commitlog enableDLegerCommitLog=true dLegerGroup=RaftNode00 #dleger組名 dLegerPeers=n0-192.168.0.218:40911;n1-192.168.0.89:40911;n2-192.168.0.77:40911 #注意配置格式 ## must be unique dLegerSelfId=n1 #每個dleger組下面的實例ip,保證唯一 sendMessageThreadPoolNums=4
第三台主機node2的配置(192.168.0.77):
vim ./conf/dledger/broker-n2.conf
內容如下:
brokerClusterName = RaftCluster brokerName=RaftNode00 listenPort=30911 namesrvAddr=192.168.0.218:9876;192.168.0.89:9876;192.168.0.77:9876 storePathRootDir=/data/rocketmq-4.9.1-raftcluster/rmqstore/node02 storePathCommitLog=/data/rocketmq-4.9.1-raftcluster/rmqstore/node02/commitlog enableDLegerCommitLog=true dLegerGroup=RaftNode00 dLegerPeers=n0-192.168.0.218:40911;n1-192.168.0.89:40911;n2-192.168.0.77:40911 #注意配置格式 ## must be unique dLegerSelfId=n2 sendMessageThreadPoolNums=4
-
修改3台broker的jvm大小,默認是8G
在
./bin
目錄下,由於我服務器沒有8G內存,需修改jvm大小。vim runbroker.sh
-
每台實例啟動broker實例進程
cd /data/rocketmq-4.9.1-raftcluster/rocketmq-all-4.9.1-bin-release/bin #安裝路徑 #在第一台服務器上啟動broker nohup ./mqbroker -c ../conf/dledger/broker-n0.conf > ./broker.log 2>&1 & #在第二台服務器上啟動broker nohup ./mqbroker -c ../conf/dledger/broker-n1.conf > ./broker.log 2>&1 & #在第三台服務器上啟動broker nohup ./mqbroker -c ../conf/dledger/broker-n2.conf > ./broker.log 2>&1 &
驗證:
查看輸出日志或者用
netstat -tunlp | grep 30911
命令查看端口是否啟動 -
用命令行查看dleger集群的狀態
sh bin/mqadmin clusterList -n 127.0.0.1:9876
-
安裝rocketmq-console的web管理頁面(rocketmq-dashboard)
備注:新版本
rocketmq-console
已經改名叫rocketmq-dashboard
。rocketmq-dashboard下載地址為:https://github.com/apache/rocketmq-dashboard
unzip rocketmq-dashboard-master.zip cd rocketmq-dashboard-master mvn clean package -Dmaven.test.skip=true #打包如果失敗,可以多嘗試幾次 #構建成功后,jar包在target目錄里面 #啟動rocketmq-dashboardd的jar包 java -jar rocketmq-dashboard-1.0.1-SNAPSHOT.jar --rocketmq.config.namesrvAddr="192.168.0.218:9876;192.168.0.89:9876;192.168.0.77:9876" --server.port=8080
訪問服務器的192.168.0.218:8080端口,能看到集群信息,如下:
- RocketMQ-on-DLedger Group集群部署完成。
其他
-
rocketmq的默認日志文件在啟動用戶的家目錄下的logs里面。
如需變更需要修改以下3個文件
- 本教程部署的RocketMQ-on-DLedger Group。只有一個分片,如果服務器數量充足,可以部署多分片。部署方式參考前面的操作步驟。只是部署更多的服務器,修改配置而已。