前言
本文檔是針對RocketMQ使用及常見問題的說明。
一.獲取項目、安裝包及文檔
1. alibaba/RocketMQ
https://github.com/alibaba/RocketMQ?????????????????????????????
2. Download the latest release package
https://github.com/alibaba/RocketMQ/releases
3. Get the latest document & Who using RocketMQ
https://github.com/alibaba/RocketMQ/issues/1
二.Linux常用命令
1.切換用戶
1)su – root
2)普通用戶登錄,切換為root用戶。
3)帶杠表示表示切換到當前用戶目錄~
2.查詢已安裝的jdk
1)rpm -qa|grep jdk
2)rpm -qa 查詢所有rpm包。q是查詢,a是all。豎杠是管道操作符,就是把查詢結果作為輸入給grep命令。grep jdk是正則匹配帶jdk的結果。
3. 卸載jdk
1)rpm -e --nodeps jdk1.8.0_25-1.8.0_25-fcs.x86_64
2)使用 rpm -e --nodeps <包的名字> 不檢查依賴,直接刪除rpm包
3)erase |?don't verify package dependencies
4. Linux服務器之間復制文件或目錄
1)?scp
Secure copy, similar in function to rcp, copies files between two different networked machines, but does so using authentication, and with a security level similar to ssh.
- cp /home/stacy/images/image*.jpg /home/stacy/archive
- scp /home/stacy/images/image*.jpg stacy@myhost.com:/home/stacy/archive
- scp stacy@myhost.com:/home/stacy/archive/image*.jpg /home/stacy/downloads
- scp user@myhost.com:/home/user/dir1/file.txt user@myhost.com:/home/user/dir2
- scp someuser@alpha.com:/somedir/somefile.txt someuser@beta.com:/anotherdir
2)move or?rename?files
mv /old /new
5.安裝jdk
1)rpm -i jdk-7u71-linux-x64.rpm
2)執行命令前需進入到文件所在目錄
Install/Upgrade/Erase options:
-i, --install ? ? ? ? ? ? ? ? ? ?install package(s)
6.安裝rocketmq
1)tar xzvf [some.tar.gz]
x, --extract, --get
Extract files from an archive.
-z, --gzip, --gunzip
This option tells tar to read or write archives through gzip, allowing tar to directly operate on several kinds of compressed archives transparently. This option should be used, for example, when operating on files with the extension .tar.gz.
-v, --verbose?
Operate verbosely.
-f, --file=ARCHIVE?
Use archive file (or device) ARCHIVE.
7.創建文件夾
1)mkdir myfile
8.刪除文件夾
1)rm –rf [dir]
2)參數解釋
-f或–force? 強制刪除文件或目錄。?
-r或-R或–recursive? 遞歸處理,將指定目錄下的所有文件及子目錄一并處理。
-v或–verbose? 顯示指令執行過程。?
3)rm? -rf /[dir]/*
9.配置環境變量
1)vi + /etc/profile
2)向文件里面追加以下內容
JAVA_HOME=/usr/java/jdk1.7.0_71
JRE_HOME=/usr/java/jdk1.7.0_71/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
ROCKETMQ_HOME=/app/alibaba-rocketmq
?
export JAVA_HOME JRE_HOME PATH CLASSPATH ROCKETMQ_HOME
3)使修改立即生效
source /etc/profile
4)查看環境變量值
echo $PATH
5)添加權限寫權限
chmod 644 /etc/profile
chmod -R 777 apache-tomcat-server
6)備注
vi filename 打開或新建文件,并將光標置于第一行首
vi +n filename 打開文件,并將光標置于第n行首
vi + filename 打開文件,并將光標置于最后一行首
vi 命令打開文件,i 進入編輯模式 esc進入命令模式
:q! 強制退出不保存
:wq! 強制保存并退出。
profile中export的作用:export命令將使系統在創建每一個新的shell時,定義這個變量的一個拷貝。執行腳本時是在一個子shell環境運行的,腳本執行完后該子shell自動退出;一個shell中的系統環境變量會被復制到子shell中(用export定義的變量);一個shell中的系統環境變量只對該shell或者它的子shell有效,該shell結束時變量消(并不能返回到父shell中)。不用export定義的變量只對該shell有效,對子shell也是無效的。
10.查看tomcat日志
1)tail -f catalina.out
2)追蹤日志,動態顯示
3)
tail -f /app/apache-tomcat-server/apache-tomcat-8.0.15-8001/logs/catalina.out
Ctrl + c?
11.查看tomcat進程
1)ps -ef |grep tomcat
2)grep 會把列頭過濾掉,請注意。
?
UID | PID | PPID | C | STIME | TTY | TIME | CMD |
用戶ID | 進程ID | 父進程ID | CPU占用率 | 開始時間 | 開始此進程的TTY | 次進程運行的總時間 | 命令名 |
12.查看文件夾大小和文件大小和磁盤剩余空間
1)du -h --max-depth=1???? 一級目錄大小
2) du -h --max-depth=1 *error.log
2)du -h????????????????? 目錄大小
3)ll -h
4)df -hl
5) ?df -hl /root??? 查看/root 目錄已使用和可用情況
必要參數:
-a 全部文件系統列表
-h 方便閱讀方式顯示
-H 等于“-h”,但是計算式,1K=1000,而不是1K=1024
-i 顯示inode信息
-k 區塊為1024字節
-l 只顯示本地文件系統
-m 區塊為1048576字節
--no-sync 忽略 sync 命令
-P 輸出格式為POSIX
--sync 在取得磁盤信息前,先執行sync命令
-T 文件系統類型
13.殺死進程
1)kill -9 [PID]
14.linux定時任務
1)crontab -e????????????????? 編輯任務
2)service crond status????????? 查看服務狀態
3)
http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html
4)示例
# every hour delete rocketmq logs
* */1 * * * find /root/logs/rocketmqlogs/otherdays/* -exec rm -rf {} \;
三.Broker集群部署
1.系統優化
1)sh $ROCKETMQ_HOME/bin/os.sh
2)在sh命令前加nohup ,執行命令的結果會輸出拼接到hohup.out 文件,more hohup.out查看文件內容。否則信息輸出到控制臺。在命令結尾加$ 是把作業放在后臺執行。
2.啟動name service
1)sh mqnamesrv &
2)需要進入到bin目錄,或者使用全路徑
3)當The Name Server boot success.之后,再次啟動name service 會報地址已經被占用。
3.Broker 集群部署[多Master多Slave模式,異步復制]
1)進入$ROCKETMQ_HOME/conf/2m-2s-async/ 修改properties配置文件
2)配置文件
broker-a.properties
broker-a-s.properties
broker-b.properties
broker-b-s.properties
3)啟動broker
### 在機器 A,啟動第一個 Master
sh mqbroker -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a.properties &
?
### 在機器 B,啟動第一個 Slave
sh mqbroker -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a-s.properties &
?
### 在機器 C,啟動第二個 Master
sh mqbroker -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b.properties &
?
### 在機器 D,啟動第二個 Slave
sh mqbroker -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b-s.properties &
4)《開發指導》文檔中,詳細記錄了各個參數,都可以設到properties文件里。
5)啟動時可以 -n 指定多個namesrv。例如 sh mqbroker –n "10.128.2.22:9876;10.128.2.23:9876" -c$ROCKETMQ_HOME/conf/2m-2s-async/broker-b.properties &
6)注意路徑sync 和async 不要馬虎。推薦namesrv也配置到properties文件中。
7)如果一臺機器想啟動多個broker ,需要修改監聽端口(默認為10911),否則報地址已經被占用。
8)如果Name Server 未啟動或者不能連接到服務器,指定該name service 的producer發消息,會報:No route info of this topic。
9)啟動第一個broker 不需要指定listenPort ,默認占用10911和10912端口,所以一臺機器啟動兩個broker 時,第二個broker端口應該設置10913,10914 。
listenPort=10913
haListenPort=10914
10)特別注意!!
haListenPort 在《指導》中沒有說明。
11)查看系統端口占用情況
netstat -apn|grep 1091
12)詳細參數設置需要自行查閱《RocketMQ Developer Guide.pdf》文檔。
13)RocketMQ 控制臺:
進入 RocketMQ/bin
sh mqadmin
查看哪些命令
sh mqadmin help [命令名]
顯示幫助信息
例如執行查看23 server的集群消息
sh mqadmin clusterList -n 10.128.2.23:9876
14)刪除topic
sh mqadmin clusterList -n 172.16.50.238:9876
sh mqadmin deleteTopic -c DefaultCluster -n 172.16.50.238:9876 -t USERLOGIN
4.關閉
sh mqshutdown namesrv
sh mqshutdown broker
5.退出
1)exit
2)使用xshell啟動服務后,退出時需要用命令exit? 。 如果直接點關閉程序按鈕關閉終端,會導致剛才的進程被關閉。特別注意!!。
四.驗證broker機制
1.方案 master-slave
1)單機啟動a、a-s
2)DefaultPushConsumer 設置為單線程
3)consumer 打斷點
4)producer 發送10條消息
5)consumer消費一條消息后kill 掉master
6)結果:producer不能繼續發送消息,no route info; consumer 可以繼續消費剩余的9條信息。
五.項目運行遭遇的問題
1.磁盤空間不夠
1)
com.alibaba.rocketmq.client.exception.MQBrokerException: CODE: 14? DESC: service not available now, maybe disk full, CL:? 0.87 CQ:? 0.87 INDEX:? 0.87, maybe your broker machine memory too small.
2)位于$HOME/logs/rocketmqlogs/
下的日志文件,占用太多空間。
3)解決問題:修改源碼中日志文件位置,參考《RocketMQ自定義文件路徑.docx》
2.tomcat服務器掛掉了
1)
20-Apr-2015 00:39:07.158 SEVERE [http-nio-8002-Acceptor-0] org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed
java.io.IOException: Too many open files
??? at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
??? at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:241)
??? at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:688)
??? at java.lang.Thread.run(Thread.java:745)
2)需要修改tomcat啟動參數
3.掛掉了
1)
24-Apr-2015 10:10:48.529 SEVERE [http-nio-8002-ClientPoller-0] org.apache.tomcat.util.net.NioEndpoint$Poller.run
java.lang.OutOfMemoryError: unable to create new native thread
??? at java.lang.Thread.start0(Native Method)
??? at java.lang.Thread.start(Thread.java:714)
??? at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:950)
??? at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1368)
??? at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:161)
??? at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:141)
??? at org.apache.tomcat.util.net.NioEndpoint.processSocket(NioEndpoint.java:627)
??? at org.apache.tomcat.util.net.NioEndpoint$Poller.processKey(NioEndpoint.java:1129)
??? at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:1087)
??? at java.lang.Thread.run(Thread.java:745)
2) producer 發消息改為單例模式,由spring管理。
4. DefaultMQProducer 構造失敗,構造參數為空
1)
com.alibaba.rocketmq.client.exception.MQClientException: The producer service state not OK, START_FAILED
See https://github.com/alibaba/RocketMQ/issues/43 for further details.
??? at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.makeSureStateOK(DefaultMQProducerImpl.java:445)
??? at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:517)
??? at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1059)
??? at com.alibaba.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:122)
??? at com.alibaba.rocketmq.example.quickstart.Producer.main(Producer.java:53)
2) Spring單例模式的DefaultMQProducer在linux服務器時不好用,發消息失敗
The producer service state not OK
原因:參數未取到,出現new DefaultMQProducer(null) 拋異常導致start未調用
解決辦法:優化邏輯,保證成功啟動
?
5.rocketmq storeerror.log
2015-04-25 23:00:10 WARN WriteSocketService - findMapedFileByOffset offset not matched, request Offset: 2687768, index: -2, mapedFileSize: 1073741824, mapedFiles count: 2, StackTrace:
??? java.lang.Thread.getStackTrace(Thread.java:1589)
??? com.alibaba.rocketmq.common.UtilAll.currentStackTrace(UtilAll.java:63)
??? com.alibaba.rocketmq.store.MapedFileQueue.findMapedFileByOffset(MapedFileQueue.java:467)
??? com.alibaba.rocketmq.store.CommitLog.getData(CommitLog.java:156)
??? com.alibaba.rocketmq.store.CommitLog.getData(CommitLog.java:150)
??? com.alibaba.rocketmq.store.DefaultMessageStore.getCommitLogData(DefaultMessageStore.java:818)
??? com.alibaba.rocketmq.store.ha.HAConnection$WriteSocketService.run(HAConnection.java:334)
??? java.lang.Thread.run(Thread.java:745)
6.
2015-04-25 22:57:57 WARN DispatchMessageService - [BUG]logic queue order maybe wrong, expectLogicOffset: 13047200 currentLogicOffset: 13048100 Topic: MMSI_TOPIC QID: 0 Diff: -900
7.磁盤空間不足,commitlog
1)警告信息 CommitLog.java
2015-04-25 22:57:54 INFO StoreScheduledThread1 - physic disk maybe full soon, so reclaim space, 0.8434144530368926
2015-04-25 22:57:54 INFO StoreScheduledThread1 - begin to delete before 48 hours file. timeup: false spacefull: true manualDeleteFileSeveralTimes: 0 cleanAtOnce: false
2015-04-25 22:57:54 WARN StoreScheduledThread1 - disk space will be full soon, but delete file failed.
2015-04-25 22:57:55 INFO StoreScheduledThread1 - logics disk maybe full soon, so reclaim space, 0.8434167783461006
2015-04-25 22:57:55 INFO StoreScheduledThread1 - begin to delete before 48 hours file. timeup: false spacefull: true manualDeleteFileSeveralTimes: 0 cleanAtOnce: false
2015-04-25 22:57:55 WARN StoreScheduledThread1 - disk space will be full soon, but delete file failed.
2)/**
???? * 清理邏輯文件服務
???? */
class CleanConsumeQueueService
/**
???? * 清理物理文件服務
???? */
class CleanCommitLogService
// 磁盤空間警戒水位,超過,則停止接收新消息(出于保護自身目的)
??????? private final double DiskSpaceWarningLevelRatio = Double.parseDouble(System.getProperty(
??????????? "rocketmq.broker.diskSpaceWarningLevelRatio", "0.90"));
3) df -hl /app
df -hl /root
4) du -hl /app
du -hl /root