NameServer 名字服务 实际作就是就一个注册中心 NameServer 作用 在系统中肯定是做命名服务,服务治理方面的工作,功能应该是和zookeeper差不多 早期的版本中,使用的是 Zookeeper producer、consumer 发送消息会去 NameServer 去拉取路由信息 图片 NameServer 维护 Broker 1.维护 Broker 信息 broker 启动后,会连接到 NameServer 3.无状态性 NameServer本身的高可用是通过部署多台NameServer来实现,但彼此之间不通讯,也就是NameServer服务器之间在某一个时刻的数据并不完全相同,但这对消息发送并不会造成任何影响 ,这也是NameServer设计的一个亮点 特点: 互相独立,彼此没有通信关系,单台nameserver挂掉,不影响其他nameserver,即使全部挂掉,也不影响业务系统使用,这点类似于dubbo的zookeeper NameServer。
上图是之前讨论确定的系统架构(后续内容会按照这个架构来叙述),其中: NameServer做Broker的服务发现,即客户端可以通过NameServer拿到Broker的信息 Broker汇报数据到NameServer NameServer的模块划分 在进行NameServer的模块划分讨论前,先整理一下NameServer的功能: 做Broker的服务发现 提供元数据(Topic、Group等) 也可以作为Console 可以认为NameServer是一个无状态的节点。 NameServer可以非常方便的做集群部署,高可用之类的,只需要Broker将数据汇报到多个NameServer即可(RocketMQ就是这种架构)。 基于以上的约定(NameServer尽量简单,没有持久化等),对NameServer的模块划分如下。 1.
和Consumer,下面我们先依次简单说明下这四个核心组件: NameServer:NameServer充当路由信息的提供者。 本文重点介绍的就是NameServer,我们下面一起来看下NameServer是如何启动以及如何进行路由管理的。 路由注册:Broker服务器在启动的时候会想NameServer集群中所有的NameServer发送心跳信号进行注册,并会每隔30秒向nameserver发送心跳,告诉NameServer自己活着。 高可用:NameServer通过部署多台NameServer服务器来保证自身的高可用,同时多个NameServer服务器之间不进行通信,这样路由信息发生变化时,各个NameServer服务器之间数据可能不是完全相同的 这个也正是NameServer追求简单高效的目的所在。 三、 启动流程 在整理了解了NameServer的架构设计之后,我们先来看下NameServer到底是如何启动的呢?
Nameserver 启动 nameserver 指定输出日志位置,未指定则目志在当前目录下: nohup sh mqnamesrv > ~/logs/rocketmqlogs/namesrv.log 最简单的命令: nohup sh mqnamesrv & 内存不足处理: nameserver 内存不足时修改 runserver.sh,测试管用 JAVA_OPT="${JAVA_iOPT} -server PermSize=128m -XX:MaxPermSize=256m" 验证启动成功 jobs 或 jps //查看启动情况 NamesrvStartup //nameserver
每个Broker节点,在启动时,都会遍历NameServer列表,与每个NameServer建立长连接,注册自己的信息,之后定时上报。 3 NameServer如何保证数据的最终一致 NameServer作为一个名称服务,需要提供服务注册、服务剔除、服务发现这些基本功能,但是NameServer节点之间并不通信,在某个时刻各个节点数据可能不一致的情况下 同时由于不需要NameServer通知众多不固定的生产者,也降低了NameServer实现的复杂性。 需要注意的是,尽管使用round-robin策略,但是在选择了一个NameServer节点之后,后面总是会优先选择这个NameServer,除非与这个NameServer节点通信出现异常的情况下,才会选择其他节点 笔者考虑,通常NameServer节点是固定的几个,但是客户端的数量可能是成百上千,为了减少每个NameServer节点的压力,所以每个客户端节点只随机与其中一个NameServer节点建立连接。
Throwable e) { e.printStackTrace(); System.exit(-1); } return null; } 通过main方法启动NameServer
文章目录 RocketMQ路由中心NameServer 一 NameServer架构设计 启动流程 步骤一 步骤二 步骤三 二 NameServer动态路由发现与剔除机制 1. 路由元信息 2 路由注册 1)Broker发送心跳包 2)NameServer处理心跳包 3 路由删除 4路由发现 三 小结 RocketMQ路由中心NameServer 一 NameServer架构设计 NameServer本身的高可用是通过部署多台NameServer来实现,但彼此之间不通讯,也就是NameServer服务器之间在某一个时刻的数据并不完全相同,但这对消息发送并不会造成任何影响,这也是NameServer 二 NameServer动态路由发现与剔除机制 NameServer的主要作用是为消息的生产者和消息消费者提供关于主题Topic的路由信息,那么NameServer需要存储路由的基础信息,还要管理Broker 但是如果Broker宕机,NameServer无法收到心跳包,此时NameServer如何来剔除这些失效的Broker呢?
你给翻译翻译,什么叫 NameServer NameServer 你可以简单的把它理解成注册中心。 NameServer。 而 Producer 则会从 NameServer 中获取元数据,从而将 Message 发到对应的 Broker 中去。 相应的,Consumer 也需要从 NameServer 中获取数据。 那不知道你有没有想过,NameServer 如何区分 主 和 从 的呢? NameServer 启动流程 上面通过了解注册 Broker的整个流程,对整个 NameServer 的架构有了个大概的了解,接下来再从整体视角来看一下 NameServer。
producer.shutdown(); } } 发送消息NameServer Test0--NameServer Test99 2.运行Producer ? 发现消息消费一共也是100条 四、关闭一台nameserver节点 1.关闭nameserver02 [root@nameserver02 ~]# init 0 2.发送消息 再次发送100条消息 ? 五、关闭所有nameserver节点 1.消息发送 继续发送10000条消息,发送的同时继续关闭nameserver01 [root@nameserver01 ~]# init 0 ? ? 六、开启nameserver01 1.nameserver01开机 消息发送和消费会恢复,但是会丢消息 ? ? 七、总结 总结:为保证RocketMQ集群能正常对外提供服务,需至少保证有一台nameserver服务器处于运行状态;当所有nameserver服务器宕机时,消息无法发送和消费。
之所以存在,是由于CVE-2023-33246的补丁中并未对DefaultRequestProcessor#updateConfig方法中的configStorePath属性值进行过滤,所以在低版本中,当NameServer 地址暴露在公网并且缺乏权限校验,未经授权的攻击者可payload注入到 configStorePath中,调用NameServer的更新配置函数将恶意文件上传到RocketMQ服务器中实现远程代码执行。 公网开放端口(默认9876),至少开放nameserver端口: 然后使用root账户到rocketmq的bin目录执行启动命令: #启动nameserver nohup sh mqnamesrv >/ 通过命令看到端口监听成功,服务启动成功: 通过nc命令,检查nameserver端口通畅。 在上述json数据包当中,比较重要的是"code":25,不同的code代表了不同的业务,根据数据包当中的code字段,程序会进行不同的业务处理,对于nameserver,code是318: 处理业务在
NameServer启动 从生产环境实践来看,NameServer启动使用默认配置即可,运行良好。 启动命令:nohup sh bin/mqnamesrv & NamesrvStartup.java 启动入口类,NameServer 启动默认端口9876 nettyServerConfig.setListenPort (9876) 每10秒钟扫描一次,移除失效的broker,同时删除缓存元数据信息 //初始化NameServer boolean initResult = controller.initialize( 主要向NameServer发送心跳包、获取Cluster、Broker、Topic元数据信息。 调用链: 在NameServer启动时注册,NamesrvController.initialize()->registerProcessor() public RemotingCommand processRequest
从 NameServer 起点 5.1 RocketMQ 大脑 —— NameServer NameServer 是一个 Broker 与 Topic 路由的注册中心,支持 Broker 的动态注册与发现 路由信息管理:每个 NameServer中都保存 Broker 集群的整个路由信息可用于客户端查询队列信息,Producer 和 Consumer 通过 NameServer可以获取整个 Broker 5.4 NameServer 启动时序图 6. 如下图所示: 7.2 源码学习的方法 本地调试法(启动类,Debug,QuickStart等) 7.3 NameServer 设计的亮点 读写锁使用,Map 结构存储路由信息; NameServer 之间不通信 (AP,最终一致性); NameServer 只管理 Broker 集群等信息。
概述 NameServer 是RocketMQ 消息队列的状态服务器(服务发现功能),集群中的各个服务都需要通过 NameServer 来了解集群中各个服务的状态。 NameServer 可以部署多个,多个NameServer互相独立,不会交换消息。 NameServer 模块结构 ? 可以看出 NameServer 中的类比较少,8个类。分析起来也比较轻松。 NameServer 启动 org.apache.rocketmq.namesrv.NamesrvStartup 是 NameServer 的启动类。 ? -p 打印 NameServer 的配置参数信息。打印完参数后退出进程。 下面是打印 NameServer 默认的配置参数信息。 ?
NameServer的部署 要搭建一个RocketMQ技术栈,必然要部署NameServer,那么NameServer是如何部署的呢? 比如我们有10台Broker机器,2个NameServer机器,其中5台互注册到一个NameServer上,另外5台会注册到另外的一个NameServer上,这样一来NameServer中的数据也就实现了分布式存储 这样从NameServer获取数据时无论从哪台机器上都能获取到所有的数据,而且就算其中一个NameServer宕机了,其他NameServer也能继续提供服务。 系统是如何从NameServer获取信息的 了解了向NameServer注册信息的方式,那么系统是如何从NameServer中获取信息的呢? Broker宕机了,NameServer是如何感知到的 在Broker向NameServer注册了自己的信息后,如果这个时候由于各种原因,Broker宕机了,此时如果不去告知NameServer,那么NameServer
写作目的 RocketMQ一个用Java写的开源项目,而且也是阿里开源的,所以想看一看设计思路以及一些细节,所以就写了这篇博客,记录一下Broker注册到Nameserver的过程以及心跳逻辑。 我的风格比较偷懒,我们想看哪一部分就跟哪一部分和哪个分支,其他的没必要看,这样你就能偷懒了,所以这篇文章想跟的是Broker注册到NameServer源码以及Broker与NameServer的心跳。 注意:本文只关心Broker注册到NameServer和心跳逻辑,其他都不关心。 ,每次都会向NameServer注册自己,不断覆盖到NameServer存的Broker的信息,从而达到心跳的效果,我只能说一个字,秀。 之间的心跳我以为是发送心跳包去实现的,结果是通过不断的向nameserver注册自己实现的 2 NameServer通过定时任务不断的扫描brokerLiveTable去根据时间阈值(broker注册的时间和此时此刻的时间差距
nameserver 127.0.0.53 options edns0 trust-ad 之前,我曾经简单写过一个linux下如何获取dns服务器的博客:Linux 中查看 DNS 与 配置;但是无论怎么查找 我对此进行了进一步探究,并进行简要记录,方便我个人记忆,如果对你也有启发,欢迎留言讨论: Resolved is a local, caching, DNS nameserver resolver and systemd-resolved 带来的好处,一个是统一了dns的管理;另外一个就是可以通过本地cache加速dns查询; 参考文档: How and why (not) to use the 127.0.0.53 nameserver
上篇文章主要梳理了NameServer的启动器和配置信息,并复习了JVM中的关闭钩子这个知识点。这篇文章看下NameServer的其他模块。 建议带着如下三个问题阅读: NameServer管理哪些信息?如何管理的? NameServer中对Netty的使用案例? NameServer中对Java并发编程使用案例? 一、NamesrvController 作用:NameServer模块的控制器 主要属性: namesrvConfig:name server的配置信息 nettyServerConfig:name return this.wipeWritePermOfBroker(ctx, request); case RequestCode.GET_ALL_TOPIC_LIST_FROM_NAMESERVER } 五、KVConfigManager 这个模块用于管理name server自己的配置信息,配置信息以json信息存放在文件中,以二维数组形式存在于内存中,请看代码: /** * 管理NameServer
NameServer在RocketMQ中的角色是配置中心,主要有两个功能:Broker管理、路由管理。因此NameServer上存放的主要信息也包括两类:Broker相关的信息、路由信息。 NameServer模块的结构如下: ? name server代码结构 上面这些类之间的依赖关系图如下图所示: ? 启动器的主要流程 使用common-cli包处理命令行参数 读取并设置服务器配置,包括NameServer的配置和NettyServer的配置 读取日志框架配置并初始化日志框架 初始化NameServer 控制器(注意:NameServer的配置和Netty服务器的配置为初始化参数) 设置JVM关闭时的钩子 知识点 NettyServerConfig,rmq中用于配置Netty服务器的配置文件,这里对于Netty return null; } })); 参考资料 JAVA虚拟机关闭钩子(Shutdown Hook) RocketMQ源码分析之NameServer
你给翻译翻译,什么叫 NameServer NameServer 你可以简单的把它理解成注册中心。 NameServer。 而 Producer 则会从 NameServer 中获取元数据,从而将 Message 发到对应的 Broker 中去。 相应的,Consumer 也需要从 NameServer 中获取数据。 那不知道你有没有想过,NameServer 如何区分 主 和 从 的呢? NameServer 启动流程 上面通过了解注册 Broker的整个流程,对整个 NameServer 的架构有了个大概的了解,接下来再从整体视角来看一下 NameServer。
、Broker、Producer和Consumer,下面我们先依次简单说明下这四个核心组件: NameServer:NameServer充当路由信息的提供者。 本文重点介绍的就是NameServer,我们下面一起来看下NameServer是如何启动以及如何进行路由管理的。 路由注册:Broker服务器在启动的时候会想NameServer集群中所有的NameServer发送心跳信号进行注册,并会每隔30秒向nameserver发送心跳,告诉NameServer自己活着。 高可用:NameServer通过部署多台NameServer服务器来保证自身的高可用,同时多个NameServer服务器之间不进行通信,这样路由信息发生变化时,各个NameServer服务器之间数据可能不是完全相同的 这个也正是NameServer追求简单高效的目的所在。 三、 启动流程 在整理了解了NameServer的架构设计之后,我们先来看下NameServer到底是如何启动的呢?