RocketMQ 使用及常见问题

前言

 

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

  1. cp /home/stacy/images/image*.jpg /home/stacy/archive
  2. scp /home/stacy/images/image*.jpg stacy@myhost.com:/home/stacy/archive
  3. scp stacy@myhost.com:/home/stacy/archive/image*.jpg /home/stacy/downloads
  4. scp user@myhost.com:/home/user/dir1/file.txt user@myhost.com:/home/user/dir2
  5. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. RocketMQ的架构是怎样的? RocketMQ的架构主要包括Producer、Broker、Consumer三个组件,其中Producer负责消息的生产,Broker负责消息的存储和转发,Consumer负责消息的消费。 2. 如何保证消息的可靠性? RocketMQ采用了多种方式保证消息的可靠性,比如消息的持久化存储、消息的冗余备份、消息的重试机制、消息的顺序保证等。 3. RocketMQ的消息模型有哪些? RocketMQ的消息模型主要分为点对点模型和发布订阅模型两种。点对点模型中一个消息只能被一个消费者消费,发布订阅模型中一个消息可以被多个消费者消费。 4. RocketMQ的消息存储方式是怎样的? RocketMQ的消息存储方式采用了基于文件的存储方式,将消息存储在磁盘上,同时采用了内存映射的方式提高读写效率。 5. RocketMQ的消息发送流程是怎样的? RocketMQ的消息发送流程主要包括消息的生产、消息的发送、消息的存储和消息的消费四个步骤。其中消息的生产和消费由应用程序完成,消息的发送和存储由RocketMQ的Broker完成。 6. 如何保证消息的顺序性? RocketMQ可以通过设置消息的顺序关键字和消息的队列选择策略来保证消息的顺序性,保证同一个顺序关键字的消息只会被同一个消费者消费,从而保证消息的顺序性。 7. 如何保证消息的高可用性? RocketMQ可以通过Broker的冗余备份、Master-Slave模式、自动故障转移等方式保证消息的高可用性,从而保证系统的稳定性和可靠性。 8. RocketMQ的消息堆积如何处理? RocketMQ可以通过设置消息的存储时间、消息的过期时间、消息的重试机制等方式避免消息的堆积问题,从而保证系统的正常运行。同时也可以通过监控系统对消息的堆积情况进行实时监控和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值