前言
本文档是针对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