知名网站建设定制云原生中间件RocketMQ-核心原理之高可用机制

文章目录

知名网站建设定制高可用机制解析

知名网站建设定制分布式集群是通过Master和Slave知名网站建设定制的配合达到高可用性的。
Master和Slave的区别:

  • 在Broker知名网站建设定制的配置文件中,参数brokerId的值为0表明这个Broker是Master,大于0表明这个Broker是Slave,brokerRole知名网站建设定制参数也说明这个Broker是Master还是Slave。(SYNC_MASTER/ASYNC_MASTER/SALVE)
  • Master角色的Broker知名网站建设定制支持读和写,Slave角色的Broker仅支持读。
  • Consumer可以连接Master角色的Broker,知名网站建设定制也可以连接Slave角色的Broker知名网站建设定制来读取消息。

消息消费高可用

在Consumer的配置文件中,并不需要设置是从Master读还是从Slave 读,当Master不可用或者繁忙的时候,Consumer会被自动切换到从Slave 读。
有了自动切换Consumer这种机制,当一个Master角色的机器出现故障后,Consumer仍然可以从Slave读取消息,不影响Consumer程序。这就达到了消费端的高可用性

消息发送高可用

如何达到发送端的高可用性呢?
在创建Topic的时候,把Topic的多个Message Queue创建在多个Broker组上(相同Broker名称,不同brokerId的机器组成一个Broker组),这样既可以在性能方面具有扩展性,也可以降低主节点故障对整体上带来的影响,而且当一个Broker组的Master不可用后,其他组的Master仍然可用,Producer仍然可以发送消息的。
RocketMQ目前还不支持把Slave自动转成Master,如果机器资源不足,需要把Slave转成Master。可以按照如下步骤操作:

  1. 手动停止Slave角色的Broker。
  2. 更改配置文件。
  3. 用新的配置文件启动Broker

NameServer协调者解析

NameServer基本概念和功能

对于一个消息队列集群来说,系统由很多机器组成,每个机器的角色、IP地址都不相同,而且这些信息是变动的(如在某些情况下,会有新的Producer或Consumer加入)。
NameServer的存在主要是为了解决这类问题,由NameServer维护这些配置信息、状态信息,其他角色都通过NameServer来协同执行。
NameServer是整个消息队列中的状态服务器,集群的各个组件通过它来了解全局的信息。各个角色的机器要定时向NameServer上报自己的状态,如果超时未上报,NameServer会认为某个机器出故障不可用了,其他的组件会把这个机器从可用列表中删除。
NameServer可以部署多个,相互之间独立,其他角色同时向多个NameServer上报状态信息,从而达到热备份的目的。NameServer本身是无状态的,也就是说NameServer中的Broker、Topic等信息都不会持久化,都是由各个角色定时上报并存储到内存中的(NameServer支持参数的持久化,一般用不到)。

集群状态的存储结构

在nameserver模块下的RouteInfoManager可以看到有五个HashMap变量保存了集群的信息。

    /**     * 存储所有Topic与Broker关联的属性信息     */    private final HashMap<String/* topic */, Map<String /* brokerName */ , QueueData>> topicQueueTable;    /**     *  存储BrokerName对应的属性信息     */    private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;    /**     * 存储集群的信息     */    private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;    /**     * 存储Broker机器的实时状态     */    private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;    /**     * 存储过滤服务器信息     */    private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

topicQueueTable

HashMap<String/* topic */, Map<String /* brokerName */ , QueueData>> topicQueueTable;
  • 1

key:Topic的名称。
value:value是个一个Map集合,集合中存的brokerName与QueueData(队列数据)的关联信息。QueueData存储着Broker的名称,读写Queue的数量、同步标识等。

brokerAddrTable

HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
  • 1

key:brokerName
value:BrokerData里面存了broker相关数据信息。

clusterAddrTable

HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
  • 1

key:cluster(集群)的名称
value:Broker Name组成的集合。
即一个cluster名称对应的一个BrokerName的集合。

brokerLiveTable

HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
  • 1

key:Broker的地址,brokerAddr 对应着一台机器。
value:BrokerLiveInfo存储的内容是这台 Broker 机器的实时状态,包括上次更新状态的时间戳,NameServer 会定期检查这个时间戳,超时没有更新就认为这个 Broker 无效了,将其从 Broker 列表里清除。

filterServerTable

HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
  • 1

key:BrokerAddr
value:FilterServer的地址列表。
Filter Server是过滤服务器,是RocketMQ的一种服务端过滤方式。一个Broker可以有一个或多个Filter Server。

总结:NameServer 通过 brokerLiveInfo 来维护存活的 Broker。Producer 会获取上面的路由信息,发送消息的时候指定发送到哪个 Topic,根据 Topic 可以从 topicQueueTable 选择一个 Broker,根据 BrokerName 可以从 BrokerAddrTable 获取到Broker IP 地址。有了地址 Producer 就可以将消息通过网络传递给 Broker。

为什么不直接用而是定义NameServer

Zookeeper为应用程序提供协调服务,Zookeeper的功能很强大,包括自动Master选举,RocketMQ的设计决定了它不需要进行Master选举,用不到这些复杂的功能,只需要一个轻量级的元数据服务器就足够了。
中间件对稳定性要求很高,RocketMQ的NameServer只有很少的代码,容易维护,所以不需要再依赖另一个中间件,从而减少整体维护成本。

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位指出。
主页

保持热爱,奔赴下一场山海。🏃🏃🏃

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发