Replicated LevelDB Store with zookeeper

当Broker启动时,它首先向zookeeper注册自己的信息(brokerName,消息日志的版本戳等),如果此时group中没有其他broker实例,并阻塞初始化过程,等到足够多的broker加入group;

当brokers的数量达到“replicas的多数派"时,开始选举,选举将会根据“消息日志的版本戳”、“权重"的大小决定,即“版本戳”越大(数据最新)、权重越高的broker优先成为master,其他broker作为slave并跟随master。

当一个broker成为master时,它会向zookeepr注册自己的sync地址信息;

此后slaves首先根据sync地址与master建立链接,并同步消息文件(download)。

当足够多的slave数据同步结束后,master将初始化transportConnector,此后Client将可以与master进行数据交互。

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="mq-group" brokerId="mq-group-0" dataDirectory="${activemq.data}">  
  
    <persistenceAdapter>  
        <replicatedLevelDB directory="${activemq.data}"  
          replicas="3"  
          bind="tcp://127.0.0.1:0"  
          zkAddress="127.0.0.1:2181"  
          zkSessionTmeout="30s"  
          zkPath="/activemq/leveldb-stores"  
          hostname="broker0" />  
     </persistenceAdapter>  
           
</broker>  

 

    Master-slaves集群中,所有的broker必须具有相同的brokerName,它作为group域来限定集群的成员,brokerId可以不同,它仅作为描述信息。

“replicas”参数非常重要,默认为3,表示消息最多可以备份在几个broker实例上,同是只有当“replicas/2 + 1”个broker存活时(包含master),集群才有效,才会选举master和备份消息,此值必须>=2。

Client发送给Master的持久化消息(包括ACK和事务),master首先在本地保存,然后立即同步(sync)给选定的(replicas/2)个slaves,只有当这些节点也同步成功后,此消息的交互才算结束;对于剩下的replicas个节点,master采用异步的方式(async)转发。

这种设计要求,可以保证集群中消息的可靠性,只有当(replicas/2 + 1)个节点物理故障,才会有丢失消息的风险。通常replicas为3,这要求开发者需要至少部署3个broker实例。

如果replicas过大,会严重影响master的吞吐能力,因为它在sync消息的过程中会消耗太多的时间。



  

 

    如果集群故障,在重启broker实例时,建议首先查看每个broker中查看LevelDB日志文件的版本戳(文件名为16进制数字),并优先启动版本戳较大的实例。(因为replicas多数派的约束,随机重启也不会有太大的问题)。但是不得随意调小replicas的值,如果你确实需要修改,那就首先关闭集群,一定优先启动版本戳最大的broker。

 

    尽管集群对zookeeper的操作并不是很多,但是我们还是希望不要接入负载过高的zookeeper集群,以免给消息服务引入不稳定因素。通常zookeeper集群至少需要3个实例,才能保证zookeeper本身的高可用性。

 

    其中bind属性表示当此broker实例成为master时,开启一个socket地址,此后slave可以通过此地址与其同步数据。

 

    我们还需要为Replicated LevelDB配置zookeeper的地址和path,其中path下用来存储group中所有broker的注册信息,此值在group中所有的broker上都要一样。“hostname”用来描述当前机器的核心信息,通常为机器IP。如果你在本机构建伪分布式,那么需要在系统hosts文件中使用转义。

 

127.0.0.1   broker0  
127.0.0.1   broker1  
127.0.0.1   broker2  

    对于Client端而言,仍然需要使用failover协议,而且协议中需要包含group中所有broker的链接地址。

 

failover://(tcp://localhost:61616,tcp://localhost:51616,tcp://localhost:41616)?randomize=false  

    和其他模式一样,对于非持久化消息仍然只会保存在master上,当master失效后,消息将会丢失。

 

1)这种方式使用Zookeeper选举Master。要进行选举,则需要多数派的“参与者”。因为Replicated LevelDB Store中有多个Broker,从多个Broker中选举出一个成为Master,其他的则成为Slave。只有Master接收Client的连接,Slave负责连接到Master,并接收(同步方式、异步方式)Master上的数据。

The elected master broker node starts and accepts client connections. 
The other nodes go into slave mode and connect the the master and synchronize their persistent state /w it.

以上也表明:每个Broker都是单独存储数据的。因为Master要把新的数据复制到Slave上。从这个角度看:称这种方式为“Share Storage”有点不合适。

 

2)Quorum机制的又一应用

假设有3个Broker,那么选举时至少需要两个Broker同意(大多数)之后,才能选出Master。此外,只需要当新消息复制到大多数Broker上时,就可以给Producer返回ACK。其他少数Broker则可以在后台以异步方式复制新的消息。

All messaging operations which require a sync to disk will wait for the update to be replicated to a quorum of the nodes before completing. 
So if you configure the store with replicas="3" then the quorum size is (3/2+1)=2. 
The master will store the update locally and wait for 1 other slave to store the update before reporting success.

比如说:一共有3个Broker,一个Master,二个Slave。当新消息到达Master时,Master需要将消息同步到其中一台Slave之后,才能向Producer发送ACK确认此次消息成功发送。

而剩下的另一台Slave,则可以在后台以异步方式复制这个新消息。此外,还能容忍一台Slave宕机。(能容忍不超过大多数的Broker宕机)

这种设计要求,可以保证集群中消息的可靠性,只有当(replicas/2 + 1)个节点物理故障,才会有丢失消息的风险。另外,也提高了一定的响应性,因为它不需要将消息同步到所有的Slave上,而只需要同步到大多数Broker上。

 

3)以何种标准判断谁是Master,谁是Slave呢?

【选举将会根据“消息日志的版本戳”、“权重"的大小决定,即“版本戳”越大(数据最新)、权重越高的broker优先成为master,其他broker作为slave并跟随master。】

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Zookeeper的模式分为三种:standalone(单机模式)、replicated(多机复制模式)和集群模式。 在standalone(单机模式)中,Zookeeper只运行在单台机器上。这种模式适用于一些小型项目或者用于测试和开发的环境。在单机模式下,Zookeeper可以提供可靠的服务,但是它不能提供高可用性和容错性。 如果你需要在生产环境下使用Zookeeper,建议使用replicated(多机复制模式)或者集群模式。在这些模式下,Zookeeper会在多台机器上运行,从而提高了可用性和容错性。 ### 回答2: zookeeper模式有三种:standalone、replicated、和集群模式。其中,standalone模式是最简单的一种模式,它比较适合于开发阶段或者小规模的生产环境,因为它只需要一个zookeeper实例即可。 在standalone模式下,zookeeper只运行在一个节点上,所有的数据都存储在该节点的内存中。即使在该节点宕机的情况下,由于数据只存储在内存中,因此数据会丢失。 当然,我们也可以将数据持久化到磁盘上,即使节点宕机,在节点重启之后,数据依旧可以恢复。在standalone模式下启动zookeeper时,需要指定一个数据目录,这个目录会被用于存储zookeeper的数据。 在standalone模式下,只有一个zk server,它同时也是leader和follower。因为在standalone模式下只有一个zookeeper实例,因此不需要进行选主操作,也不需要进行数据同步,这种方式简单明了,不需要太多的配置,因此比较适合于小型应用。 总之,在zookeeper的standalone模式下,只有一个zookeeper实例,它负责管理所有的数据,并且不需要进行数据同步和选主。它的工作方式较为简单,但是对于大规模的部署来说,standalone模式不适用。 ### 回答3: Zookeeper是一种分布式的开源协调服务,它用于管理和协调分布式集群中的服务。Zookeeper的主要功能是协调和管理分布式应用程序,并且可以使应用程序在复杂的集群环境中能够自动化的处理失败情况。 Zookeeper模式有三种,分别是Standalone模式(单机模式)、集群模式和观察者模式。Standalone模式是Zookeeper最简单的模式,也是最适合单机测试和开发的模式。在Standalone模式中,Zookeeper只运行在一台物理机上,不与其他的Zookeeper服务器创建连接形成集群。Standalone模式中只有一个Zookeeper实例,并且所有的客户端都与该实例进行交互。 Standalone模式下,对于单个Zookeeper服务器的应用程序来说,它具有以下优点: 1. 运行和管理方便:只需要一台物理机即可部署Zookeeper,不需要搭建集群,运行和管理相对简单。 2. 可以在单机上模拟多个Zookeeper实例:可以通过在不同端口上启动多个Zookeeper实例,来模拟多个Zookeeper集群上的实例进行测试。 3. 适合开发和测试环境:Standalone模式不需要大量的硬件和网络资源,所以非常适合作为开发和测试环境使用。 但是,Standalone模式在生产环境下并不太适用。因为在单机上运行的Zookeeper实例无法高可用,一旦该物理机出现故障,整个Zookeeper服务就会停止工作。在生产环境下,一般会采用集群模式或者观察者模式来提高Zookeeper的可用性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值