每個 Master 配置一個 Slave,有多對Master-Slave,HA采用同步雙寫方式,主備都寫成功,向應用返回成功。
優點:數據與服務都無單點,Master宕機情況下,消息無延遲,服務可用性與數據可用性都非常高。
缺點:性能比異步復制模式略低,大約低10%左右,發送單個消息的RT會略高。目前主宕機后,備機不能自動切換為主機,后續會支持自動切換功能。
### 先啟動 NameServer
### 在機器 A,啟動第一個 Master
### 在機器 B,啟動第二個 Master
### 在機器 C,啟動第一個 Slave
### 在機器 D,啟動第二個 Slave
以上 Broker 與 Slave 配對是通過指定相同的brokerName 參數來配對,Master的 BrokerId 必須是 0,Slave 的BrokerId 必須是大與 0 的數。
另外一個 Master 下面可以掛載多個 Slave,同一 Master 下的多個 Slave通過指定不同的 BrokerId來區分。
1. 服務器環境如下圖所示,四臺機器,IP位7為主節點,149是7的從節點。105是主節點,160是105的從節點
序號 IP 用戶名 角色 模式 1 192.168.1.7 root nameServer1,brokerServer1 Master1 2 192.168.1.105 root nameServer2,brokerServer2 Master2 3 192.168.1.149 root nameServer3,brokerServer3 Master1-slave1 4 192.168.1.160 root nameServer4,brokerServer4 Master2-slave1
?
2. Hosts添加信息
IP NAME 192.168.1.7 rocketmq-nameserver1 192.168.1.7 rocketmq-master1 192.168.1.105 rocketmq-nameserver2 192.168.1.105 rocketmq-master2 192.168.1.149 rocketmq-nameserver3 192.168.1.149 rocketmq-master1-slave1 192.168.1.160 rocketmq-nameserver4 192.168.1.160 rocketmq-master2-slave1
?
3.編輯hosts文件【4臺機器】
# vim /etc/hosts
?
4.上傳解壓【4臺機器】
# 上傳alibaba-rocketmq-3.2.6.tar.gz文件至/home/xm6f/dev # cd /home/xm6f/dev # tar -zxvf alibaba-rocketmq-3.2.6.tar.gz # mv alibaba-rocketmq rocketmq
?
5.創建存儲路徑【4臺機器】
# mkdir /home/xm6f/dev/rocketmq/store # mkdir /home/xm6f/dev/rocketmq/store/commitlog # mkdir /home/xm6f/dev/rocketmq/store/consumequeue # mkdir /home/xm6f/dev/rocketmq/store/index
6.RocketMQ配置文件【4臺機器】--該文件有點類似于Redis里面的redis.con
# sudo vim /home/xm6f/dev/rocketmq/conf/2m-2s-async/broker-a.properties ##192.168.1.7配置文件 # sudo vim /home/xm6f/dev/rocketmq/conf/2m-2s-async/broker-a-s.properties ##192.168.1.149配置文件 # sudo vim /home/xm6f/dev/rocketmq/conf/2m-2s-async/broker-b.properties ##192.168.1.105配置文件 # sudo vim /home/xm6f/dev/rocketmq/conf/2m-2s-async/broker-b-s.properties ##192.168.1.160配置文件
?
broker-a.properties文件
#所屬集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分號分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876;rocketmq-nameserver3:9876;rocketmq-nameserver4: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
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/home/xm6f/dev/rocketmq/store
#commitLog 存儲路徑
storePathCommitLog=/home/xm6f/dev/rocketmq/store/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/home/xm6f/dev/rocketmq/store/consumequeue
#消息索引存儲路徑
storePathIndex=/home/xm6f/dev/rocketmq/store/index
#checkpoint 文件存儲路徑
storeCheckpoint=/home/xm6f/dev/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/home/xm6f/dev/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 異步復制Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageThreadPoolNums=128
#拉消息線程池數量
#pullMessageThreadPoolNums=128
#強制指定本機IP,需要根據每臺機器進行修改。官方介紹可為空,系統默認自動識別,但多網卡時IP地址可能讀取錯誤
brokerIP1=192.168.1.7
?
broker-a-s.properties文件
#所屬集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分號分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876;rocketmq-nameserver3:9876;rocketmq-nameserver4: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
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/home/xm6f/dev/rocketmq/store
#commitLog 存儲路徑
storePathCommitLog=/home/xm6f/dev/rocketmq/store/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/home/xm6f/dev/rocketmq/store/consumequeue
#消息索引存儲路徑
storePathIndex=/home/xm6f/dev/rocketmq/store/index
#checkpoint 文件存儲路徑
storeCheckpoint=/home/xm6f/dev/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/home/xm6f/dev/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 異步復制Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SLAVE
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageThreadPoolNums=128
#拉消息線程池數量
#pullMessageThreadPoolNums=128
#強制指定本機IP,需要根據每臺機器進行修改。官方介紹可為空,系統默認自動識別,但多網卡時IP地址可能讀取錯誤
brokerIP1=192.168.1.149
?
broker-b.properties文件
#所屬集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分號分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876;rocketmq-nameserver3:9876;rocketmq-nameserver4: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
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/home/xm6f/dev/rocketmq/store
#commitLog 存儲路徑
storePathCommitLog=/home/xm6f/dev/rocketmq/store/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/home/xm6f/dev/rocketmq/store/consumequeue
#消息索引存儲路徑
storePathIndex=/home/xm6f/dev/rocketmq/store/index
#checkpoint 文件存儲路徑
storeCheckpoint=/home/xm6f/dev/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/home/xm6f/dev/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 異步復制Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageThreadPoolNums=128
#拉消息線程池數量
#pullMessageThreadPoolNums=128
#強制指定本機IP,需要根據每臺機器進行修改。官方介紹可為空,系統默認自動識別,但多網卡時IP地址可能讀取錯誤
brokerIP1=192.168.1.105
?
broker-b-s.properties文件
#所屬集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分號分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876;rocketmq-nameserver3:9876;rocketmq-nameserver4: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
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/home/xm6f/dev/rocketmq/store
#commitLog 存儲路徑
storePathCommitLog=/home/xm6f/dev/rocketmq/store/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/home/xm6f/dev/rocketmq/store/consumequeue
#消息索引存儲路徑
storePathIndex=/home/xm6f/dev/rocketmq/store/index
#checkpoint 文件存儲路徑
storeCheckpoint=/home/xm6f/dev/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/home/xm6f/dev/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 異步復制Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SLAVE
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageThreadPoolNums=128
#拉消息線程池數量
#pullMessageThreadPoolNums=128
#強制指定本機IP,需要根據每臺機器進行修改。官方介紹可為空,系統默認自動識別,但多網卡時IP地址可能讀取錯誤
brokerIP1=192.168.1.160
?
7. 修改啟動腳本參數【4臺機器】
# vim /home/xm6f/dev/rocketmq/bin/runbroker.sh JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m - XX:PermSize=128m -XX:MaxPermSize=320m" # vim /home/xm6f/dev/rocketmq/bin/runserver.sh JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m - XX:PermSize=128m -XX:MaxPermSize=320m"
注意:啟動腳本設置不合理,可能報如下異常:
Error occurred during initialization of VM
Too small new size specified
8.防火墻
默認啟動用使用3個端口9876,10911,10912
分別代表名稱服務端口,broker端口,broker ha端口。
ha端口haListenPort表示Master監聽Slave請求的端口,默認為服務端口+1
添加到/etc/sysconfig/iptables的filter表INPUT鏈中
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9876 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 10911 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 10912 -j ACCEPT
添加完成后重啟防火墻
service iptables restart
9.啟動NameServer【4臺機器】
# cd /home/xm6f/dev/rocketmq/bin # sudo nohup sh mqnamesrv &
?
10.啟動BrokerServer 【4臺機器】
注意配置文件需要根據實際配置/broker-X.properties
# cd /home/xm6f/dev/rocketmq/bin # 192.168.1.7 # sudo nohup sh mqbroker -c /home/xm6f/dev/rocketmq/conf/2m-2s-async/broker-a.properties >/dev/null 2>&1 & # 192.168.1.105 # sudo nohup sh mqbroker -c /home/xm6f/dev/rocketmq/conf/2m-2s-async/broker-b.properties >/dev/null 2>&1 & # 192.168.1.149 # sudo nohup sh mqbroker -c /home/xm6f/dev/rocketmq/conf/2m-2s-async/broker-a-s.properties >/dev/null 2>&1 & # 192.168.1.160 # sudo nohup sh mqbroker -c /home/xm6f/dev/rocketmq/conf/2m-2s-async/broker-b-s.properties >/dev/null 2>&1 &
說明:IP位7為主節點,149是7的從節點。105是主節點,160是105的從節點
輸入jps看到如上圖所示表示成功
停止服務broker:
# sh mqshutdown broker
?
11.在tomcat中部署rocketmq-console.war
修改rocketmq-console配置文件,找到/tomcat-8082/webapps/rocketmq-console/WEB-INF/classes/config.properties文件,添加如下:
rocketmq.namesrv.addr=192.168.1.7:9876;192.168.1.105:9876;192.168.1.149:9876;192.168.1.160:9876 throwDone=true
啟動tomcat,在瀏覽器輸入:http://192.168.1.105:8082/rocketmq-console/
多Master多Slave可以保證實時消費,比如說:我有一主一從,如果主機宕機,那么我從主機上獲得的數據如果在沒有從節點,那么這些消息將在主節點重啟之前將無法被消費,直到主節點啟動,如果這個主節點里面有從節點,從節點可以對外提供服務,并且從節點有從主節點同步過來的數據,那么還是可以將這些消息實時地消費掉。這點多Master方式無法做到。
當宕機的主節點起來之后,會和從節點進行數據的同步,不會重復消費剛剛消費過的數據。
12.數據清理
# cd /home/xm6f/devrocketmq/bin # sh mqshutdown broker # sh mqshutdown namesrv # --等待停止 # rm -rf /home/xm6f/devrocketmq/store # mkdir /home/xm6f/devrocketmq/store # mkdir /home/xm6f/devrocketmq/store/commitlog # mkdir /home/xm6f/devrocketmq/store/consumequeue # mkdir /home/xm6f/devrocketmq/store/index # --按照上面步驟重啟NameServer與BrokerServer
啟動時報錯:
注釋runserver.sh和runbroker.sh以下,并添加JAVA_HOME地址
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/home/xm6f/dev/jdk1.7.0_80 #[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/home/xm6f/dev/jdk1.7.0_80 #[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"export JAVA_HOME="/home/xm6f/dev/jdk1.7.0_80" export JAVA="$JAVA_HOME/bin/java" .....
?