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. iptables使用multiport 添加多个不连续端口 不指定

    iptables使用multiport 添加多个不连续端口   碟舞飞扬 , 01:26 , Linux技术 , 评论(0) , 引用(0) , 阅读(12214) , Via 本站原创 大 | 中  ...

  2. Xmarks丢失书签

    想体验下Xmarks,不同浏览器同步书签,听说很好用,就安装Chrome插件,没想到竟然把我的所有书签都丢了. 不过在网上找到了回复的办法,也很简单: 原始地址:http://irising.me/2 ...

  3. 查看w3wp进程占用的内存及.NET内存泄露,死锁分析--转载

    一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...

  4. LoaderManager使用详解(三)---实现Loaders

    这篇文字将介绍Loader<D>类,并且介绍自定义Loader的实现.这是本系列的第三篇文章.   一:Loaders之前世界 二:了解LoaderManager 三:实现Loaders ...

  5. 修改DevExpress中英文提示,将英文改为中文

    1 : 修改DX 提示框中的英文字符 /// <summary> /// 重写DX弹出框 英文变为中文 /// </summary> public class CHS : De ...

  6. Struts2 Convention插件的使用(1)

    刚刚查阅官方文档(convention-plugin.html)并学习了Struts2的Convention插件,文章这里只作为一个笔记,建议大家去看官方文档比较清晰和全面. 需要在项目添加这些包 c ...

  7. (转载)C++ ofstream和ifstream详细用法

    原文出自[比特网],转载请保留原文链接:http://soft.chinabyte.com/database/460/11433960.sh [导读] ofstream是从内存到硬盘,ifstream ...

  8. Project Euler 104:Pandigital Fibonacci ends 两端为全数字的斐波那契数

    Pandigital Fibonacci ends The Fibonacci sequence is defined by the recurrence relation: F[n] = F[n-1 ...

  9. java web多线程

    1.多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑 ...

  10. iOS复杂动画之抽丝剥茧(Objective-C & Swift)

    一.前言 随着开发者的增多和时间的累积,AppStore已经有非常多的应用了,每年都有很多新的APP产生.但是我们手机上留存的应用有限,所以如何吸引用户,成为产品设计的一项重要内容.其中炫酷的动画效果 ...