(三)RocketMQ叢集部署實踐
全篇參照–《MyRocketMQ叢集部署實戰-雙master-雙slave-同步雙寫-非同步刷盤(7臺機器) - tantexian的部落格空間 - 開源中國社群》
本文是筆者在參考上文實踐過程中的理解和擴充
符號“【】”中內容、附註5,6以及FAQ中內容均筆者所注
一、基礎環境配置:
以下所有機器均為16G記憶體。【記憶體配置可修改,128M以上,筆者測試機器記憶體平均為4G】
二、叢集部署圖
(四NameServer、雙Mastere雙Slave、同步雙寫、非同步刷盤):
)
三、對centos7作業系統引數調優:
【該步驟未進行,為生產環境下的優化操作,官網寫到該步驟一個系統只可優化一次】
執行下述shell指令碼:
#!/bin/sh
# Execute Only Once
#當前程式執行環境使用者名稱
USERNAME=root
#需要修改IO模式磁碟碟符
DISKNAME=sda
echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
echo 'vm.min_free_kbytes=5000000' >> /etc/sysctl.conf
echo 'vm.drop_caches=1' >> /etc/sysctl.conf
echo 'vm.zone_reclaim_mode=0' >> /etc/sysctl.conf
echo 'vm.max_map_count=655360' >> /etc/sysctl.conf
echo 'vm.dirty_background_ratio=50' >> /etc/sysctl.conf
echo 'vm.dirty_ratio=50' >> /etc/sysctl.conf
echo 'vm.page-cluster=3' >> /etc/sysctl.conf
echo 'vm.dirty_writeback_centisecs=360000' >> /etc/sysctl.conf
echo 'vm.swappiness=10' >> /etc/sysctl.conf
cat /etc/sysctl.conf
sysctl -p
echo 'ulimit -n 655350' >> /etc/profile
echo "$USERNAME hard nofile 655350" >> /etc/security/limits.conf
#DISK=`df -k | sort -n -r -k 2 | awk -F/ 'NR==1 {gsub(/[0-9].*/,"",$3); print $3}'`
#[ "$DISK" = 'cciss' ] && DISK='cciss!c0d0'
echo 'deadline' > /sys/block/$DISKNAME/queue/scheduler
echo "---------------------------------------------------------------"
sysctl vm.overcommit_memory
sysctl vm.min_free_kbytes
sysctl vm.drop_caches
sysctl vm.zone_reclaim_mode
sysctl vm.max_map_count
sysctl vm.dirty_background_ratio
sysctl vm.dirty_ratio
sysctl vm.page-cluster
sysctl vm.dirty_writeback_centisecs
sysctl vm.swappiness
su - $USERNAME -c 'ulimit -n'
cat /sys/block/$DISKNAME/queue/scheduler
四、下載原始碼及編譯(maven、git):
1、安裝maven、git:
yum install -y maven git
2、下載原始碼:
git clone https://git.oschina.net/tantexian/MyRocketMQ.git
【先在一個機子上安裝git、maven來編譯原始碼,jdk需要安裝在7臺機子上,上一篇文章有安裝的解疑】
3、編譯原始碼:
cd MyRocketMQ/
sh install.sh
4、將編譯後的程式碼放置到自定義檔案目錄
(本次實驗中放置到/home目錄:)
PS:此處需要將編譯後的MyRocketMQ-bin檔案分別scp或者rsync同步到其他所有機器上去:
rsync -avzP /home/MyRocketMQ-bin/ root@10.128.31.104:/home/MyRocketMQ-bin/
rsync -avzP /home/MyRocketMQ-bin/ root@10.128.31.105:/home/MyRocketMQ-bin/
rsync -avzP /home/MyRocketMQ-bin/ root@10.128.31.106:/home/MyRocketMQ-bin/
rsync -avzP /home/MyRocketMQ-bin/ root@10.128.31.107:/home/MyRocketMQ-bin/
rsync -avzP /home/MyRocketMQ-bin/ root@10.128.31.108:/home/MyRocketMQ-bin/
rsync -avzP /home/MyRocketMQ-bin/ root@10.128.31.109:/home/MyRocketMQ-bin/
5、若不希望每次rsync輸入密碼驗證,可以配置互信ssh、scp、rsync登入傳輸(互通):
1、在主節點node103上生成祕鑰(輸入命令後一直回車即可):
ssh-keygen -t rsa
2、分別將node103加入到node104、node105、node106、node107、node108、node109的authorized_keys中
rsync -avzP /root/.ssh/id_rsa.pub root@10.128.31.104:/root/.ssh/authorized_keys
rsync -avzP /root/.ssh/id_rsa.pub root@10.128.31.105:/root/.ssh/authorized_keys
rsync -avzP /root/.ssh/id_rsa.pub root@10.128.31.106:/root/.ssh/authorized_keys
rsync -avzP /root/.ssh/id_rsa.pub root@10.128.31.107:/root/.ssh/authorized_keys
rsync -avzP /root/.ssh/id_rsa.pub root@10.128.31.108:/root/.ssh/authorized_keys
rsync -avzP /root/.ssh/id_rsa.pub root@10.128.31.109:/root/.ssh/authorized_key
注:這樣以後從node103往其他節點copy東西則不再需要輸入密碼驗證!!!
最好檢測其他所有node是否同步成功MyRocketMQ-bin:
【rsync比scp傳檔案要慢一些】
五、配置JDK、Rocketmq等環境引數:
1、安裝jdk(依次在所有機器配置執行):
雖然目前google已經嘗試使用openjdk代替oraclejdk:http://www.oschina.net/translate/openjdk-is-now-the-time)
還是建議使用oracle的jdk替換掉自帶的openjdk,若不想替換則無需下續步驟。
首先解除安裝自帶的openjdk:
【注:經測試openjdk也可使用,只要保證唯一jdk就行,否則會衝突】
rpm -e --nodeps java-1.7.0-openjdk-1.7.el7.x86_64 java-1.7.0-openjdk-headless-1.7.0.51-2.4.5.5.el7.x86_64
ps:如果rpm -e 下載不成功,可以嘗試使用yum remove命令解除安裝。
然後再去oracle網站下載對應的jdk安裝:
若下載的為rpm包:則使用rpm -ivh xxx 進行安裝即可!!!
2、配置jdk和Rocketmq環境變數:
vim /root/.bashrc #在該檔案新增一下內容
# Set RocketMQ Environment
ROCKETMQ_HOME=/home/MyRocketMQ-bin # 此處為上述步驟中的maven編譯後文件目錄程式碼
ROCKETMQ_CLASSPATH=$ROCKETMQ_HOME/lib # 此處為rocketmq執行所依賴的jar的classpath
ROCKETMQ_PATH=$ROCKETMQ_HOME/bin # 此處為rocketmq執行bin目錄,加入到可執行命令
export ROCKETMQ_HOME ROCKETMQ_CLASSPATH ROCKETMQ_PATH # 設定環境變數
# 此處根據具體nameser叢集設定環境變數
export NAMESRV_ADDR='10.128.31.103:9876;10.128.31.104:9876;10.128.31.105:9876;10.128.31.106:9876'
# Set Java Environment
JAVA_HOME=/usr/java/jdk1.7.0_79
JRE_HOME=/usr/java/jdk1.7.0_79/jre
PATH=.:$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$ROCKETMQ_PATH # 此處將ROCKETMQ_PATH
CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$ROCKETMQ_PATH
export JAVA_HOME JRE_HOME PATH CLASSPATH
- PS:編輯完成執行 source/root/.bashrc或者 . /root/.bashrc 使之生效
- 執行:chmod +x /home/MyRocketMQ-bin/bin/ *
- 上述命令將/home/MyRocketMQ-bin/bin/目錄下的命令加入到PATH,即linux能直接執行。
- 注意:同理需要將/root/.bashrc檔案使用rsync或者scp同步到其他所有節點上去!!!
【採用叢集模式時,啟動broker時,需要指定nameserver 地址集,即NAMESRV_ADDR
,包含每一個nameserver叢集地址。因為nameserver之間不會進行資訊同步,均通過broker定時彙報保持各節點資訊“同步”】
六、叢集啟動:
1、將所有hostname配置到hosts:
vim /etc/hosts
同步到所有機器!!!
先附上叢集部署規劃(更多詳細請自行參考前續叢集部署圖):
NameServer叢集:node103/node104/node105/node106
Master1/Slave1 : node103->node105
Master2/Slave2 : node104->node106
Producer/Consumer叢集:node107/node108/node109
2、先啟動NameServer叢集節點
(node103/node104/node105/node106分別執行以下命令):
nohup sh /home/MyRocketMQ-bin/bin/mqnamesrv &
3、再啟動Broker服務
【雙主雙備,修改相應的配置檔案引數】
node103:
cp /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-a.properties /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-master1.properties
vim /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-master1.properties
【同步複製方式下的主/備引數:SYNC_MASTER / SLAVE】
啟動node103 broker程序:
nohup sh /home/MyRocketMQ-bin/bin/mqbroker -c /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-master1.properties>bk.log
node104:
cp /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-a.properties /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-master2.properties
vim /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-master2.properties
啟動node104 broker程序:
nohup sh /home/MyRocketMQ-bin/bin/mqbroker -c /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-master2.properties>bk.log
node105:
cp /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-a.properties /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-slave1.properties
vim /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-slave1.properties
啟動node105 broker程序:
sh /home/MyRocketMQ-bin/bin/mqbroker -c /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-slave1.properties
node106:
cp /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-a.properties /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-slave2.properties
vim /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-slave2.properties
啟動node106 broker程序:
sh /home/MyRocketMQ-bin/bin/mqbroker -c /home/MyRocketMQ-bin/conf/2m-2s-sync/broker-slave2.properties
至此,NameServer/Broker叢集服務都已啟動
4、啟動Producer
node107 啟動生成者:
sh /home/MyRocketMQ-bin/bin/tools.sh com.alibaba.rocketmq.example.simple.Producer
5、啟動Consumer
node108 啟動消費者:
sh /home/MyRocketMQ-bin/bin/tools.sh com.alibaba.rocketmq.example.simple.PushConsumer
PS:啟動順序總結:
1. 先啟動nameser叢集所有節點
2. 啟動Broker所有的master節點
3. 啟動Broker所有slave節點
七、rocket-web控制檯配置搭建:
1、下載tomcat至centos7:
2、下載rocketmq-console專案,編譯回去war包
編譯之前需要修改config.properties檔案nameser為當前環境nameser叢集值:
3、將編譯完成的war拷貝到tomcat對應的webapps目錄下:
4、執行tomcat:
sh /home/apache-tomcat-8.5.0/bin/catalina.sh run
5、頁面訪問web控制檯:
【不方便編譯的話,直接下載war包copy到tomcat/webapps下,到自動生成的資料夾:rocketmq-console/WEB_INF/classes/config.properties 修改預設的127.0.0.1:9876 地址為你的nameserver地址,重啟tomcat服務,訪問http://tomcatIP地址:8080/rocketmq-console/cluster/list.do 就可以了】
以下為附加內容,作為參考:
附1、叢集操作命令彙總及自定義簡化命令:
1、啟動NameServer:
sh /home/MyRocketMQ-bin/bin/mqnamesrv
2、啟動Broker
如果將上述所有的配置檔案name統一修改為:2m2s-sync-borker.properties
則可以使用一下命令啟動各節點Broker:
sh /home/MyRocketMQ-bin/bin/mqbroker -c /home/MyRocketMQ-bin/conf/2m-2s-sync/2m2s-sync-borker.properties
3、停止NameServer及Broker命令:
ps aux | grep NamesrvStartup | grep -v grep | awk '{print $2}' | xargs kill -9
ps aux | grep BrokerStartup | grep -v grep | awk '{print $2}' | xargs kill -9
4、自定義Alias命令(首先建立檔案目錄:mkdir /var/log/rocketmq):
alias stna='nohup sh /home/MyRocketMQ-bin/bin/mqnamesrv > /var/log/rocketmq/mqnamesrv.log &'
alias stbr='nohup sh /home/MyRocketMQ-bin/bin/mqbroker -c /home/MyRocketMQ-bin/conf/2m-2s-sync/2m2s-sync-borker.properties > /var/log/rocketmq/broker.log &'
alias killna="ps aux | grep NamesrvStartup | grep -v grep | awk '{print $2}' | xargs kill -9"
alias stpr='sh /home/MyRocketMQ-bin/bin/tools.sh com.alibaba.rocketmq.example.simple.Producer'
alias stco='sh /home/MyRocketMQ-bin/bin/tools.sh com.alibaba.rocketmq.example.simple.PushConsumer'
alias killbr="ps aux | grep BrokerStartup | grep -v grep | awk '{print $2}' | xargs kill -9"
5、新增到.bashrc中:
vim /root/.bashrc
6、使用簡短命令操作:
附2:Broker相關配置引數:
附3:NameserStartup殭屍程序解決辦法:
假若需要kill 掉程序,不能使用jps檢視程序來kill 否則會出現殭屍程序:
如果出現殭屍程序則需要使用ps -ahp 21514來查詢殭屍程序的父程序,接著再kill掉。
【RocketMQ提供了“溫柔”關閉namesrv、broker服務的命令:mqshutdown】
附4:獲取當前broker全域性配置:
mqbroker -m( mqbroker -p列印全部)
附5:RocketMQ中Readme
附6:rocket-console控制檯展示
【下圖為筆者測試截圖,具體資訊與上文資訊不符請見諒】
查詢指定topic的produceGroupName:
查詢Topic情況
查詢消費者組
查詢某條訊息資訊
FAQ
1、啟動Nameserver或broker服務提示記憶體不足
現象描述:
“VM warning: INFO: OS::commit_memory(0x00000006c0000000, 2147483648, 0) faild; error=’Cannot allocate memory’ (errno=12)”
解決方案:修改/RocketMQ/devnev/bin/
下的服務啟動指令碼 runserver.sh
、runbroker.sh
中對於記憶體的限制,改成如下示例:
JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn128m -XX:PermSize=128m -XX:MaxPermSize=128m"
2、tomcat配置和啟動問題
tomcat啟動:進入安裝目錄
- bin/startup.sh #啟動tomcat
- bin/shutdown.sh #停止tomcat
或者直接輸入tomcat命令啟動(筆者yum安裝的tomcat7.04)
tomcat start(stop)
tomcat啟動後,仍無法訪問的問題可以參考幾點:
- 埠監聽未新增
- 埠被防火牆阻攔,關閉防火牆
- 如果是用yum安裝的tomcat,能夠正常啟動,但是無法訪問ip:8080。經筆者測試,是由於yum安裝的tomcat缺少ROOT等檔案,無法訪問ip:8080成功,但是將rocket-console部署到webapps中,是可以正常訪問到的。
3、如何自定義Producer、Consume內容進行訊息收發測試?
問題描述:如何自定義Producer、Consumer的程式碼執行,比如修改Producer的topic,傳送條數,Consumer的Group name等資訊
解讀:目前Producer、Consumer的啟動是通過tool.sh進行啟動,其呼叫的是已經封裝好的jar包,所以無法直接修改Producer的程式碼進行測試。
解決辦法:可通過編寫demo專案,匯入RocketMQ的依賴包,執行測試程式Producer、Consumer進行測試,具體方案參看Myeclipse中搭建RocketMQ測試專案