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. MYSQL注入天书之数据库增删改介绍

    Background-4 增删改函数介绍 在对数据进行处理上,我们经常用到的是增删查改.接下来我们讲解一下mysql 的增删改.查就是我们上述总用到的select,这里就介绍了. 增加一行数据.Ins ...

  2. delphi中locate方法

    TDataSet控件以及它的继承控件,例如TSimpleDataSet/TClientDataSet等都可以使用Locate方法在结果数据集中查寻数据.程序首先必须使用SQL命令从后端数据库中取得数据 ...

  3. 【leetcode】Multiply Strings(middle)

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  4. hadoop,spark,linux上常用命令

    记下常用命令,慢慢补充 1.hadoop 查看hdfs上的目录: hadoop fs -ls /给hdfs上目录授予权限:   hadoop fs -chmod 777 /tmp/hive 在hdfs ...

  5. php curl 分离header和body信息

    php中可以通过curl来模拟http请求,同时可以获取http response header和body,当然也设置参数可以只获取其中的某一个.当设置同时获取response header和body ...

  6. POJ 1144 Network(Tarjan)

    题目链接 题意 : 找出割点个数. 思路 : Tarjan缩点,u是割点的充要条件是:u要么是具有两个以上子女的深度优先生成树的根,要么不是根,而有一个子女v满足low[v]>=dfn[u]. ...

  7. zoj 3529 A Game Between Alice and Bob 博弈论

    思路:每个数的SG值就是其质因子个数,在进行nim博弈 代码如下: #include<iostream> #include<cstdio> #include<cmath& ...

  8. MongoDB (七) MongoDB 数据类型

    MongoDB支持许多数据类型的列表下面给出: String : 这是最常用的数据类型来存储数据.在MongoDB中的字符串必须是有效的UTF-8. Integer : 这种类型是用来存储一个数值.整 ...

  9. 李洪强iOS开发之多线程编程2-NSOperation

    前言 1.上一讲简单介绍了NSThread的使用,虽然也可以实现多线程编程,但是需要我们去管理线程的生命周期,还要考虑线程同步.加锁问题,造成一些性能上的开销.我们也可以配合使用NSOperation ...

  10. 2016网易实习生编程题:n个骰子的和等于m

    题目 骰子的点数是1 到 6,当有n个骰子的时候,其点数和等于m的数量 如当n = 4 m = 23时候 有下面四种: 5666656666566665 解题 深度优先,开始第一感觉很复杂,然后就没有 ...