rocketmq详解(全)
NameServer
NameServer可以部署多个,相互之间独立,其他角色同时向多个NameServer机器上报状态信息,从而达到热备份的目的。
NameServer本身是无状态的,也就是说NameServer中的Broker、Topic等状态信息不会持久存储,都是由各个角色定时上报并
存储到内存中的(NameServer支持配置参数的持久化,一般用不到)。
心跳机制
单个Broker跟所有Namesrv保持心跳请求,心跳间隔为30秒,心跳请求中包括当前Broker所有的Topic信息。Namesrv会反查Broer的心跳信息, 如果某个Broker在2分钟之内都没有心跳,则认为该Broker下线,调整Topic跟Broker的对应关系。但此时Namesrv不会主动通知Producer、Consumer有Broker宕机。
Consumer跟Broker是长连接,会每隔30秒发心跳信息到Broker。Broker端每10秒检查一次当前存活的Consumer,若发现某个Consumer 2分钟内没有心跳, 就断开与该Consumer的连接,并且向该消费组的其他实例发送通知,触发该消费者集群的负载均衡(rebalance)。
生产者每30秒从Namesrv获取Topic跟Broker的映射关系,更新到本地内存中。再跟Topic涉及的所有Broker建立长连接,每隔30秒发一次心跳。
在Broker端也会每10秒扫描一次当前注册的Producer,如果发现某个Producer超过2分钟都没有发心跳,则断开连接。
- Namesrv压力不会太大,平时主要开销是在维持心跳和提供Topic-Broker的关系数据。但有一点需要注意,Broker向Namesrv发心跳时,
会带上当前自己所负责的所有Topic信息,如果Topic个数太多(万级别),会导致一次心跳中,就Topic的数据就几十M,网络情况差的话,
网络传输失败,心跳失败,导致Namesrv误认为Broker心跳失败。
Linux 搭建单机版RocketMq
0、安装jvm
oracle jvm下载
Linux 安装配置JDK
rocketmq是基于JVM运行的,所以要有java 环境 java -version 查看,没有则需要安装,并配置JAVA_HOME环境变量。
1、目录结构
下载rocketmq:http://rocketmq.apache.org/
/bin 启动脚本,包括shell脚本和cmd脚本 /conf 实例配置文件,包括broker配置文件、logback配置文件等 /lib 依赖jar包,包括netty、commons-lang、FastJSON等
2、内存修改
1)修改runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn512m -XX:metaspaceSize=128m -XX:MaxmetaspaceSize=320m"
2)修改runbroker.sh配置
[root@localhost bin]# vim runbroker.sh JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"
3)修改tools.sh配置
[root@localhost bin]# vim tools.sh JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=128m"
内存修改: Rocketmq默认的虚拟机内存较大,启动broker如果因为内存不足失败,需要编辑如下两个配置文件,去修改JVM内存大小 vi runbroker.sh //Broker设置: D:RocketMQbinrunbroker.cmd vi runserver.sh //NameServer设置: D:RocketMQbinrunserver.cmd #编辑runbroker.sh和runserver.sh修改默认JVM大小 #参考设置 JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -xx:metaspaceSize=128m xx:MaxmetaspaceSize=320m" 端口: 开启端口:10911 10912 10909 9876 启动位置 bin目录
3、启动
(1)NameServer启动( 默认4g)
位置 RocketMQ目录下的bin目录 本地部署(linux) nohup sh mqnamesrv & 启动NameServer tail -f ~/logs/rocketmqlogs/namesrv.log 查看日志 外网部署 nohup sh mqnamesrv -n "192.168.33.100:9876" & 启动NameServer tail -f ~/logs/rocketmqlogs/namesrv.log 查看日志
(2)brocker启动
位置 RocketMQ目录下的bin目录 本地部署(linux) nohup sh mqbroker -n localhost:9876 & 启动Broker tail -f ~/logs/rocketmqlogs/broker.log 查看启动日志 外网部署 echo 'brokerIP1=192.168.33.100' > ../conf/broker.properties nohup sh mqbroker -n localhost:9876 -c ../conf/broker.properties autoCreateTopicEnable=true & tail -f ~/logs/rocketmqlogs/broker.log 查看启动日志
修改broker.conf
官网的这个启动命令特别坑,启动时broker会通过私有ip启动,会导致客户端无法远程连接,所以启动之前我们需要修改一下配置文件,主要是改broker.conf文件
再次通过启动命令:
nohup sh bin/mqbroker -n localhost:9876 autoCreateTopicEnable=true -c conf/broker.conf &
(3)测试
//发送 export NAMESRV ADDR=localhost:9876 bin/tools.sh org.apache.rocketmq.example.quickstart.Producer //接收 bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
含义 在发送或接收消息之前,开发者需要通知客户端name servers 的位置。RocketMQ提供多种实现方式。为了简单起见,下方展示环境变量NAMESRV_ADDR的用法 发送消息(bin目录下) 设置环境变量:export NAMESRV_ADDR=localhost:9876 使用安装包的Demo发送消息: sh tools.sh org.apache.rocketmq.example.quickstart.Producer 接收消息 (bin目录下) 设置环境变量:export NAMESRV_ADDR=localhost:9876 接受消息:sh tools.sh org.apache.rocketmq.example.quickstart.Consumer jps查看进程号
(4)关闭RocketMQ
位置 RocketMQ的bin目录 命令 sh mqshutdown namesrv 关闭NameServer sh mqshutdown broker 关闭Broker
4、管理工具
使用方式 进入RocketMQ安装位置,在bin目录下执行./mqadmin {admin} {args} 命令介绍 updateTopic[创建Topic] 类路径[com.alibaba.rocketmq.tools.command.topic.UpdateTopicSubCommand] 参数 是否必填 说明 -b 如果-c为空,则必填 broker 地址,表示topic 建在该broker -c 如果-b为空,则必填 cluster 名称,表示topic 建在该集群(集群可通过clusterList 查询) -h 否 打印帮助 -n 是 nameserve 服务地址列表,格式ip:port;ip:port;... -r 否 可读队列数(默认为8) -w 否 可写队列数(默认为8) 注意事项 几乎所有命令都需要配置-n 表示NameServer地址,格式为ip:port; 几乎所有命令都可以通过-h获取帮助; 如果既有Broker地址(-b)配置项又有clusterName(-c)配置项,则优先以Broker地址执行 命令;如果不配置Broker地址,则对集群中所有主机执行命令
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)