優勢:
- 應用解耦:提高系統容錯性和可維護性
- 異步提速:提升用戶體驗和系統吞吐量
- 削峰填谷:提高系統穩定性
劣勢:
- 系統可用性降低
- 系統復雜度提高
- 消息一致性問題
RocketMq安裝部署
部署前准備
-
安裝Jdk
#1. 獲取jdk安裝包(進入 /opt目錄操作 cd /opt) wget https://github.com/frekele/oracle-java/releases/download/8u181-b13/jdk-8u181-linux-x64.tar.gz #2. 解壓縮jdk安裝包 tar -zxvf jdk-8u181-linux-x64.tar.gz #3. 設置環境變量 vi ~/.bash_profile export JAVA_HOME=/opt/jdk1.8.0_181 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin #4. 使環境變量生效 source ~/.bash_profile #5. 檢測並查看java版本 java -version
-
安裝Maven
#1. 獲取Maven安裝包(進入 /opt目錄操作 cd /opt) wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz #2. 解壓縮Maven壓縮包 tar -zxvf apache-maven-3.6.3-bin.tar.gz #3. 設置環境變量 vi ~/.bash_profile export PATH=$PATH:/opt/apache-maven-3.6.3/bin #4. 使環境變量生效 source ~/.bash_profile #5. 檢測並查看java版本 mvn -version
1. 單Master模式
這種方式風險較大,一旦Broker重啟或者宕機時,會導致整個服務不可用。不建議線上環境使用,可以用於本地測試。
#1. 獲取rocketmq 安裝包
wget https://codeload.github.com/apache/rocketmq/tar.gz/refs/tags/rocketmq-all-4.8.0
#2. 解壓縮rocketmq安裝包
tar -zxvf rocketmq-all-4.8.0
#3. 編譯rocketMq
cd rocketmq-all-4.8.0/
mvn -Prelease-all -DskipTests clean install -U
#4. 啟動rocketMq mqnamesrv
cd distribution/target/rocketmq-4.8.0/rocketmq-4.8.0
nohup sh bin/mqnamesrv &
# 查看日志
tail -f ~/logs/rocketmqlogs/namesrv.log
#5. 啟動broker
nohup sh bin/mqbroker -n localhost:9876 &
#查看日志
tail -f ~/logs/rocketmqlogs/broker.log
#6. 測試
export NAMESRV_ADDR=localhost:9876
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
-
問題解決(內存不足)
RocketMq默認啟動配置的java虛擬機參數內存占用較高,如果內存不夠需要修改配置
修改runserver.sh,runbroker.sh java啟動參數
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
-
Lock failed,MQ already started(修改參數再啟動的時候報錯)
查看java進程,關閉進程之后重新啟動程序
ps -ef | grep java kill -9 進程id
2. 多Master模式
一個集群無Slave,全是Master,例如2個Master或者3個Master,這種模式的優缺點如下:
- 優點:配置簡單,單個Master宕機或重啟維護對應用無影響,在磁盤配置為RAID10時,即使機器宕機不可恢復情況下,由於RAID10磁盤非常可靠,消息也不會丟(異步刷盤丟失少量消息,同步刷盤一條不丟),性能最高;
- 缺點:單台機器宕機期間,這台機器上未被消費的消息在機器恢復之前不可訂閱,消息實時性會受到影響。
1)啟動NameServer
NameServer需要先於Broker啟動,且如果在生產環境使用,為了保證高可用,建議一般規模的集群啟動3個NameServer,各節點的啟動命令相同,如下:
### 首先啟動Name Server
$ nohup sh mqnamesrv &
### 驗證Name Server 是否啟動成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
2)啟動Broker集群
### 在機器A,啟動第一個Master,例如NameServer的IP為:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-noslave/broker-a.properties &
### 在機器B,啟動第二個Master,例如NameServer的IP為:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-noslave/broker-b.properties &
...
如上啟動命令是在單個NameServer情況下使用的。對於多個NameServer的集群,Broker啟動命令中-n
后面的地址列表用分號隔開即可,例如 192.168.1.1:9876;192.161.2:9876
。
3. 多Master多Slave模式-異步復制
每個Master配置一個Slave,有多對Master-Slave,HA采用異步復制方式,主備有短暫消息延遲(毫秒級),這種模式的優缺點如下:
- 優點:即使磁盤損壞,消息丟失的非常少,且消息實時性不會受影響,同時Master宕機后,消費者仍然可以從Slave消費,而且此過程對應用透明,不需要人工干預,性能同多Master模式幾乎一樣;
- 缺點:Master宕機,磁盤損壞情況下會丟失少量消息。
1)啟動NameServer
### 首先啟動Name Server
$ nohup sh mqnamesrv &
### 驗證Name Server 是否啟動成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
2)啟動Broker集群
### 在機器A,啟動第一個Master,例如NameServer的IP為:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a.properties &
### 在機器B,啟動第二個Master,例如NameServer的IP為:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b.properties &
### 在機器C,啟動第一個Slave,例如NameServer的IP為:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a-s.properties &
### 在機器D,啟動第二個Slave,例如NameServer的IP為:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b-s.properties &
4. 多Master多Slave模式-同步雙寫
每個Master配置一個Slave,有多對Master-Slave,HA采用同步雙寫方式,即只有主備都寫成功,才向應用返回成功,這種模式的優缺點如下:
- 優點:數據與服務都無單點故障,Master宕機情況下,消息無延遲,服務可用性與數據可用性都非常高;
- 缺點:性能比異步復制模式略低(大約低10%左右),發送單個消息的RT會略高,且目前版本在主節點宕機后,備機不能自動切換為主機。
1)啟動NameServer
### 首先啟動Name Server
$ nohup sh mqnamesrv &
### 驗證Name Server 是否啟動成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
2)啟動Broker集群
### 在機器A,啟動第一個Master,例如NameServer的IP為:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a.properties &
### 在機器B,啟動第二個Master,例如NameServer的IP為:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b.properties &
### 在機器C,啟動第一個Slave,例如NameServer的IP為:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a-s.properties &
### 在機器D,啟動第二個Slave,例如NameServer的IP為:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b-s.properties &
以上Broker與Slave配對是通過指定相同的BrokerName參數來配對,Master的BrokerId必須是0,Slave的BrokerId必須是大於0的數。另外一個Master下面可以掛載多個Slave,同一Master下的多個Slave通過指定不同的BrokerId來區分。$ROCKETMQ_HOME指的RocketMQ安裝目錄,需要用戶自己設置此環境變量。
搭建圖形化界面
#1. 獲取安裝包
wget https://codeload.github.com/apache/rocketmq-externals/tar.gz/refs/tags/rocketmq-console-1.0.0
#2. 解壓縮
tar -zxvf rocketmq-console-1.0.0
#3. 編譯源碼
cd rocketmq-externals-rocketmq-console-1.0.0/rocketmq-console/
mvn clean package -Dmaven.test.skip=true
nohup java -jar \
-Drocketmq.config.namesrvAddr=192.168.106.133:9876 \
-Drocketmq.config.isVIPChannel=false \
target/rocketmq-console-ng-1.0.0.jar &
#4. 訪問
http://192.168.106.133:8080/#/