一、RocketMQ安装(单机)
1、RocketMQ下载 :Apache 官方下载网址:https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.3.0/rocketmq-all-4.3.0-source-release.zip
或者GitHub 官方下载网址:https://github.com/apache/rocketmq
2、将下载RocketMQ上传至linux
rz
3、将上传的RocketMQ解压
unzip rocketmq-all-4.3.0-source-release.zip
4、编译部署
①在解压后生成的RocketMQ文件夹下:cd rocketmq-all-4.3.0/,
②使用 Maven 来编译整个项目 mvn -Prelease-all -DskipTests clean install -U
大约5分钟后出现如下内容表示部署成功
[INFO] Reactor Summary:
[INFO]
[INFO] Apache RocketMQ 4.3.0 4.3.0 ........................ SUCCESS [02:48 min]
[INFO] rocketmq-logging 4.3.0 ............................. SUCCESS [ 17.417 s]
[INFO] rocketmq-remoting 4.3.0 ............................ SUCCESS [ 11.507 s]
[INFO] rocketmq-common 4.3.0 .............................. SUCCESS [ 8.931 s]
[INFO] rocketmq-client 4.3.0 .............................. SUCCESS [ 14.016 s]
[INFO] rocketmq-store 4.3.0 ............................... SUCCESS [ 8.584 s]
[INFO] rocketmq-srvutil 4.3.0 ............................. SUCCESS [ 2.288 s]
[INFO] rocketmq-filter 4.3.0 .............................. SUCCESS [ 2.438 s]
[INFO] rocketmq-broker 4.3.0 .............................. SUCCESS [ 7.253 s]
[INFO] rocketmq-tools 4.3.0 ............................... SUCCESS [ 3.480 s]
[INFO] rocketmq-namesrv 4.3.0 ............................. SUCCESS [ 1.642 s]
[INFO] rocketmq-logappender 4.3.0 ......................... SUCCESS [ 2.533 s]
[INFO] rocketmq-openmessaging 4.3.0 ....................... SUCCESS [ 3.220 s]
[INFO] rocketmq-example 4.3.0 ............................. SUCCESS [ 1.757 s]
[INFO] rocketmq-test 4.3.0 ................................ SUCCESS [ 5.503 s]
[INFO] rocketmq-distribution 4.3.0 4.3.0 .................. SUCCESS [ 51.228 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 05:13 min
[INFO] Finished at: 2018-08-10T01:14:58+08:00
[INFO] ------------------------------------------------------------------------
[root@localhost rocketmq-all-4.3.0]#
5、启动nameserver
①进入目录: /usr/rocketmq/rocketmq-all-4.3.0/distribution/target/apache-rocketmq
②执行 nohup sh bin/mqnamesrv &
③执行 tail -f ~/logs/rocketmqlogs/namesrv.log,出现以下内容表示nameserver启动成功
[root@localhost apache-rocketmq]# pwd
/usr/local/rocketmq-all-4.3.0/distribution/target/apache-rocketmq
[root@localhost apache-rocketmq]# nohup sh bin/mqnamesrv &
[1] 5865
[root@localhost apache-rocketmq]# nohup: 忽略输入并把输出追加到"nohup.out"
tail -f ~/logs/rocketmqlogs/namesrv.log
2018-08-10 01:29:12 INFO main - tls.client.keyPath = null
2018-08-10 01:29:12 INFO main - tls.client.keyPassword = null
2018-08-10 01:29:12 INFO main - tls.client.certPath = null
2018-08-10 01:29:12 INFO main - tls.client.authServer = false
2018-08-10 01:29:12 INFO main - tls.client.trustCertPath = null
2018-08-10 01:29:13 INFO main - Using OpenSSL provider
2018-08-10 01:29:14 INFO main - SSLContext created for server
2018-08-10 01:29:14 INFO NettyEventExecutor - NettyEventExecutor service started
2018-08-10 01:29:14 INFO main - The Name Server boot success. serializeType=JSON
2018-08-10 01:29:14 INFO FileWatchService - FileWatchService service started
6、启动broker
①同样进入 RocketMQ 安装目录下的 /usr/rocketmq/rocketmq-all-4.3.0/distribution/target/apache-rocketmq 目录
②执行nohup sh bin/mqbroker -n localhost:9876 autoCreateTopicEnable=true &
③执行tail -f ~/logs/rocketmqlogs/broker.log
如果看到 "The broker[%s, xxx.xx.xx.xx:10911] boot success..." ,则表示启动成功
如果看到Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000005c0000000, 8589934592, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 8589934592 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/rocketmq-all-4.3.0/distribution/target/apache-rocketmq/hs_err_pid7209.log
说明内存不足,解决办法:
①打开目录rocketmq-all-4.3.0/distribution/target/apache-rocketmq/bin找到nameserver和broker的 runbroker.sh 和 runserver.sh
②runserver.sh 文件中 修改 JVM 配置下的第一行,将原来 4g 调小一点
#===========================================================================================
# JVM Configuration
#===========================================================================================
#JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -
。。。。
$JAVA ${JAVA_OPT} $@
③runbroker.sh 文件中 修改 JVM 配置下的第一行,将原来 8g 调小一点
#===========================================================================================
# JVM Configuration
#===========================================================================================
#JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 - XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8"
。。。。。
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
④然后再次启动 broker 时就成功了,broker 注册到了 nameserver 上了(localhost:9876
注意,如果出现出现connect to 172.17.42.1:10911 failed异常处理方案:
1、目录rocketmq-all-4.3.0/distribution/conf/broker.conf中添加nameserver=127.0.0.1:9876(该地址固定的)
添加brokerip1=192.168.80.4(rocketmq安装服务器地址)
2、启动broker:nohup sh mqbroker -n localhost:9876 -c ../conf/broker.conf &
7、关闭broker和nameserver
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
8、rocketmq查看指令
目录:cd distribution/target/apache-rocketmq/bin
首先进入 RocketMQ 工程,进入/RocketMQ/bin 在该目录下有个 mqadmin 脚本 .
查看帮助: 在 mqadmin 下可以查看有哪些命令
a: 查看具体命令的使用 : sh mqadmin
b: sh mqadmin help 命令名称
例如,查看 updateTopic 的使用
sh mqadmin help updateTopic
2. 关闭nameserver和所有的broker:
进入到bin下:
sh mqshutdown namesrv
sh mqshutdown broker
3. 查看所有消费组group:
sh mqadmin consumerProgress -n 192.168.1.23:9876
4. 查看指定消费组下的所有topic数据堆积情况:
sh mqadmin consumerProgress -n 192.168.1.23:9876 -g warning-group
5. 查看所有topic :
sh mqadmin topicList -n 192.168.1.23:9876
6. 查看topic信息列表详情统计
sh mqadmin topicstatus -n 192.168.1.23:9876 -t topicWarning
7. 新增topic
sh mqadmin updateTopic –n 192.168.1.23:9876 –c DefaultCluster –t topicWarning
8. 删除topic
sh mqadmin deleteTopic –n 192.168.1.23:9876 –c DefaultCluster –t topicWarning
9、查询集群消息
sh mqadmin clusterList -n 192.168.1.23:9876
二、RocketMQ可视化界面安装
1、下载文件 https://github.com/apache/rocketmq-externals ,上传到linxu
2、解压 unzip rocketmq-externals-master.zip 解压文件
3、修改配置文件;(usr/local/rocketmq-externals-master/目录下)
find -name application.properties 可以查看到两个文件都在rocketmq-console文件目录下
vim application.properties
rocketmq.config.namesrvAddr=linux服务器ip:9876(ip1:port;ip2:port)
server.port=8081 --(这里端口号为访问这个可视化界面的端口号)
4、编译 usr/local/rocketmq-externals-master/rocketmq-console/目录下
执行mvn clean package -Dmaven.test.skip=true
编译成功后,在rocketmq-console目录下会生成一个目录:target目录,该目录下有启动rocketmq界面的jar文件
6、本地浏览器执行 http://192.168.80.4:8081/#/topic 便可以了
二、基于docker安装rocketmq
1、 拉取rocketmq镜像
docker pull rocketmqinc/rocketmq
2、 拉取rocketmq-console镜像
docker pull styletang/rocketmq-console-ng
3、 启动nameserver
docker run -d -p 9876:9876 -v `pwd`/data/namesrv/logs:/root/logs -v `pwd`/data/namesrv/store:/root/store --name rmqnamesrv rocketmqinc/rocketmq sh mqnamesrv
4、 启动broker
docker run -d -p 10911:10911 -p 10909:10909 -v `pwd`/data/broker/logs:/root/logs -v `pwd`/data/broker/store:/root/store --name rmqbroker --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" rocketmqinc/rocketmq sh mqbroker -c ../conf/broker.conf
由于启动broker时rocketmq默认指定为内网地址,会导致外网无法连接到broker,报出如下错误信息: connect to xxx.xx.xx.xx:10911 failed
解决方案:
①docker exec -it xxxxx bash --xxx是指broker对应的containerid(通过docker ps查看对应containerid)
②cd ../conf
③vi broker.conf
④增加brokerIP1 = xxx.xxx.xxx.xxx --这里的ip地址指定为外网地址(即服务器地址)
⑤重启broker容器
5、 启动rocketmq-console
docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr=xxx.xxx.xxx.xxx:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 8080:8080 -t styletang/rocketmq-console-ng
--- xxx.xxx.xxx.xxx 为服务器地址
三、模块
1.OPS
这里很容易看清楚,双击标签可以修改NameSer
的IP+Port
。这里我测试过修改端口,发现重新发送一样的消息,还是能消费。
其实也能理解,因为NameSer
改变了,也只是使得Broker
不能从本地获取最新的路由信息。但是本地还是缓存了路由信息,所以一样的Topic
还是能获取到路由信息,可以获取到路由信息还是能发送到Brokder
。
所以这里我的测试是一次失败的对照测试,但是这个模块平时需求不大,就过了。
2.Dashboard
此图表较简单,其实是指所有Brokder
处理消息的数量。比如从上图可以看出来,我只有一个Brokder
,并且此Brokder
处理了6条消息。
此图标可以筛选出某个Topic
下5分钟的消息数量。但是可以切换时间,所以就相当于可以查看某个Topic
下的消息数量趋势。
这条趋势曲线有时候貌似不准确,测试过几次有一次在那个时间点并没有变化。
3.Cluster
这里有点坑,Cluster
翻译过来叫集群。这里并不是指消费模式中的集群消费,而是指Brokder
的集群部署
但是我这里并没有使用Broker
的集群部署,所以只有一条数据。如果有多个broker
那这里应该有多行数据。
每一行中各项代表的意思如下
- Broker ---
Broker
的名字 - Address --- 地址
- Today Produce Count --- 今天发送的消息数量
- Today Consume Count ---- 今天消费的消息数量
4.Topic
Topic
算是重点之一。
这里的ADD/UPDATE
是有作用的,可以在这里添加一个Topic
,经过测试,感觉在这里意义不大。这里涉及到**消息的发送消费与Topic
、Broker
**的关系,下篇文章分析。
每一行的Topic
分成如下几个操作按钮
点击第一个[status]按钮。显示如下界面。可以从中获取的信息比较多。该消息队列的Topic
、BrokerName
、queueId
。
这里涉及到发送消息的原理。简单来说
通过一个Topic可以获取到对应的路由信息,路由信息里面维护了消息队列集合,而我们发送消息其实就是通过消息队列发送
消息队列集合是个集合,所以也是有集合的属性。其中每一项就是消息队列,就是如下图的每一行,每一行在集合中的位置就是queueId
点击第二项是保存在NameSer
的路由信息。
这里可能要注意下。保存在NameServer
的路由信息和本地缓存的不一样,本地缓存的属性内容更丰富更多。看看源码吧!
保存在NameSer
的路由对象
public class TopicRouteData extends RemotingSerializable { private String orderTopicConf; private List<QueueData> queueDatas; private List<BrokerData> brokerDatas; private HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable; } 复制代码
发现没,其中包含的属性和如上图片类似。
queueDatas
和brokerDatas
,其中queueDatas
包含消息队列的基本情况,读/写的最大数目,brokerDatas
包含Broker
的位置信息。
再看看本地的真正路由信息,如上对象是它的属性。
public class TopicPublishInfo {
private boolean orderTopic = false; private boolean haveTopicRouterInfo = false; private List<MessageQueue> messageQueueList = new ArrayList<MessageQueue>(); private volatile ThreadLocalIndex sendWhichQueue = new ThreadLocalIndex(); private TopicRouteData topicRouteData; } 复制代码
这下很明白了。
第三项[Consumer Manage],看名字也知道啥意思,该Topic
的消费管理。
第四项[Topic Config],修改Topic
的属性,没啥作用,本来代码也可以控制。
第五项[Send Message],向该Topic
发送消息。可以测试玩玩,将Consumer
配置好,然后运行,不通过代码发送,在这里发送消息,Consumer
也能接受到。
5.Consumer
没太看懂这每一行代表啥意思。估计是一个Consumer
对象。后面几个按钮点击后,可以看看该Consumer
的具体配置信息,好像没啥东西。
6.Message
该模块很重要,信息量也很多。
比较容易理解,根据如上三项对Message
分组查询。一般第一项根据Topic
查询比较多。因为据说根据key
去查询有坑。建议id
和Topic
,id
因为唯一最简单。
这是该Topic
下的所有消息,不管是否消费都在内。
Message ID 、Tag 、Key都是消息比较重要的属性。点击右方的按钮,可以看到该消息更加具体的情况。
注意点都用箭头标出来了,其他可能比较容易理解,无非就那几个属性。最后的TrackType
很重要,对于排查问题。该属性的值有好几个,现在看到的几个总结如下
- CONSUMED 代表该消息已经被消费
- NOT_CONSUME_YET 还没被消费
- UNKNOW_EXCEPTION 报错了,可以看日志,一般报错内容会紧跟其后,具体很容易排查出来
- NOT_ONLINE 代表该
Consumer
并没有运行