Zookeeper节点标记

当路径中的元素包括在方括号里比如[xyz],则表示xyz表示的值是不固定的,每个可能的值都有一个Zookeeper节点。比如/topics/[topic]表示每个topic名称对应/topics的一个子目录。也可以用类似[0...5]表示一个数值范围来表示含有子目录0,1,2,3,4的目录。箭头->表示znode的节点含有某个内容,比如/hello->word表示一个含有“world”的节点。

  1. /brokers/ids/[0...N] --> host:port (ephemeral node)

表示一个broker节点的列表,每个节点提供了一个供consumers识别的broker id,这个id必须在配置文件中指明。启动时,broker节点会用纸的id在/brokers/ids下给自己注册一个znode,broker可以被转移到另外一台机器上,只要id不变就不会影响consumers.如果试图注册一个已经存在的broker id(比如两个节点配置了同样的id)将会产生错误。

Broker注册的Zookeeper节点是临时节点,如果一个broker节点关闭了,注册也就失效了,并通知consumer这个节点不再活动了。

Consumers和Consumer组

Consumers也在Zookeeper中注册自己,目的是在消费消息时进行负载均衡,并跟踪消费的每个分区的offset.

Consumers可以组成一个组,共同消费一个copic,组中的每个consumer共享一个组id.组id配置在consumer的配置参数中。可以参考前面文章的consumer实例。

组中的consumer会均匀分配topic的分区,每个分区只会被组里的一个consumer消费。

Consumer Id注册

除了共享的组id,每个consumer还会没分配一个临时的唯一的consumer_id,格式为:hostname:uuid。consumer_id被注册到以下的目录中:

  1. /consumers/[group_id]/ids/[consumer_id] --> {"topic1": #streams, ..., "topicN": #streams} (ephemeral node)

每个consumer都注册到组的下面,并用consumer_id创建一个znode.znode的值包含一个<topic, #streams>.的map.Znode节点是临时的,如果consumer线程结束了,这个节点就会消失。

Consumer Offset 跟踪

Consumer跟踪它在每个分区中消费的最大的offset,并保存在以下的Zookeeper目录中:

  1. /consumers/[group_id]/offsets/[topic]/[broker_id-partition_id] --> offset_counter_value ((persistent node)

分区归属注册

每个分区只会被组中的一个consumer消费,consumer在消费之前必须建立和分配的分区的归属关系,把它的consumerid写入broker分区下的一个临时节点。

  1. /consumers/[group_id]/owners/[topic]/[broker_id-partition_id] --> consumer_node_id (ephemeral node)

Broker节点注册

Broker节点基本是独立的,只需发布自己拥有的信息。当一个节点加入,它把自己注册到broker node目录中,并写入host name和port的信息到broker topic记录中。Broker也要注册一个topic列表,新的topic会被动态的注册。

Consumer注册规则

当一个consumer启东时,它将遵循以下步骤:

    1. 把自己注册到组下面的consumer id记录中。
    2. 注册一个监听器,监听consumer id记录的的“变更(新的consumer加入或老的退出)”,每次“变更”都会触发一次组中各consumer之间的再平衡。
    3. 注册一个监听器,监听broker id记录的“变更(新的broker加入或者老的退出)”,每次变更都会触发一次所有组中所有sonsumers之间的再平衡。
    4. 如果consumer消息流是使用了topic过滤器,也需要注册一个监听器去监听broker topic记录的变更(新的topic加入)。每次变更都会触发一次对所有的topics的重新评估以决定是否符合这个过滤器。一个新的copic会触发一次在所有consumers中的再平衡.
    5. 在它所在的组进行一次再平衡。

漫游Kafka实现篇之分布式的更多相关文章

  1. 漫游Kafka设计篇之主从同步

    Kafka允许topic的分区拥有若干副本,这个数量是可以配置的,你可以为每个topci配置副本的数量.Kafka会自动在每个个副本上备份数据,所以当一个节点down掉时数据依然是可用的. Kafka ...

  2. 漫游Kafka设计篇之性能优化

    Kafka在提高效率方面做了很大努力.Kafka的一个主要使用场景是处理网站活动日志,吞吐量是非常大的,每个页面都会产生好多次写操作.读方面,假设每个消息只被消费一次,读的量的也是很大的,Kafka也 ...

  3. 漫游Kafka入门篇之简单介绍

    介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢?   首先让我们看几个基本的消息系统术语: Kafka将消息以 ...

  4. 漫游Kafka设计篇之性能优化(7)

    Kafka在提高效率方面做了很大努力.Kafka的一个主要使用场景是处理网站活动日志,吞吐量是非常大的,每个页面都会产生好多次写操作.读方面,假设每个消息只被消费一次,读的量的也是很大的,Kafka也 ...

  5. 漫游Kafka入门篇之简单介绍(1)

    介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢?   首先让我们看几个基本的消息系统术语: Kafka将消息以 ...

  6. (转)漫游Kafka入门篇之简单介绍

    转自:http://blog.csdn.net/honglei915/article/details/37564521 原文地址:http://blog.csdn.net/honglei915/art ...

  7. 漫游Kafka实现篇之消息和日志

    消息格式 消息由一个固定长度的头部和可变长度的字节数组组成.头部包含了一个版本号和CRC32校验码. /** * 具有N个字节的消息的格式如下 * * 如果版本号是0 * * 1. 1个字节的 &qu ...

  8. 漫游Kafka实战篇之客户端API

    Kafka Producer APIs 旧版的Procuder API有两种:kafka.producer.SyncProducer和kafka.producer.async.AsyncProduce ...

  9. 漫游Kafka设计篇之Producer和Consumer

    Kafka Producer 消息发送 producer直接将数据发送到broker的leader(主节点),不需要在多个节点进行分发.为了帮助producer做到这点,所有的Kafka节点都可以及时 ...

随机推荐

  1. Pots of gold game:看谁拿的钱多

    问题描述: Pots of gold game: Two players A & B. There are pots of gold arranged in a line, each cont ...

  2. SharePoint Server 2007 简体中文下载

    SharePoint Server 2007 简体中文下载 2010-12-16 10:56 正式版key SN: Tkjcb-3wkhk-2ty2t-qymk2-9xm2y 这个版本也是通过Key来 ...

  3. iftop 使用

    测试中常常发现服务器网卡打满,那么这些流量具体占用情况如何呢? 这个时候我们要使用iftop来看看,首先我们要安装: 一. 安装 首先安装libpcap,下载链接:http://www.tcpdump ...

  4. Java笔记——面向切面编程(AOP模式)

    原文:http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html Aspect Oriented Programming  面向切面 ...

  5. Model的绑定

    ReflectedControllerDescriptor:ControllerDescriptor Controller的 public override ActionDescriptor Find ...

  6. eclipse调试jsp中的scriptlet代码

    在eclipse开发环境下,jsp中的scriptlet代码,也就是<%%>中的java代码,跟普通的java代码一样可以打断点单步调试的! 做个笔记,免得自己忘了!

  7. c# 计算一个整型数组的平均

    一个整型数组的平均: class Program { static void Main(string[] args) { ,,,,,,,,,}; double avg= GetAvg(array); ...

  8. LA 4255 Guess

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  9. Android应用开发学习笔记之事件处理

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android提供的事件处理机制分为两类:一是基于监听的事件处理:二是基于回调的事件处理.对于基于监听的事件处理,主 ...

  10. flex 组建重写

    flex历经几个版本的变化,其封装性也越来越规范. 今日flex的学习,总结是组件的重写. 项目中为使组件的针对性,易用性更强 ,免不了要重写组件. 要改变你的对手你的了解你的对手. 一个组件从被ne ...