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. 快钱报错:javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name解决

    jdk1.7提示:javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name //方案1:设置系统属性:System. ...

  2. sqlite函数大全

      abs(X) 返回参数X的绝对值. coalesce(X,Y,...) 返回第一个非空参数的副本.若所有的参数均为NULL,返回NULL.至少2个参数. glob(X,Y) 用于实现SQLite的 ...

  3. HDU 1260 Tickets(简单dp)

    Tickets Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  4. 项目中遇到的 linq datatable select

    1如何使用DataTable.Select选出来的Rows生成新的DataTable?DataTable dt = 数据源;DataTable dtt = new DataTable();dtt=dt ...

  5. cocos2d-x3.0环境搭建(基于win7以及mac)

    流程概览: Windows平台 一.安装 Python与配置Python环境变量 二.安装Cocos2d-x,并创建项目 Mac平台 安装Cocos2d-x,并创建项目 具体操作: 一.安装Pytho ...

  6. HDFS Protocol修改流程

        相对于1.x版本的Hadoop,2.x版本的Hadoop采用了Protocol Buffer作为序列化反序列化工具,以及RPC通讯工具.这样当我们对Hadoop源码进行修改之前,就需要了解Ha ...

  7. Android异步下载图片并且缓存图片到本地

    Android异步下载图片并且缓存图片到本地 在Android开发中我们经常有这样的需求,从服务器上下载xml或者JSON类型的数据,其中包括一些图片资源,本demo模拟了这个需求,从网络上加载XML ...

  8. weblogic 安装与配置

    Weblogic 安装 从官网 下载 需要的weblogic 版本, 解压缩后得到 wls1036_generic.jar [fmw_12.1.3.0.0_wls.jar , fmw_12.2.1.1 ...

  9. 使用xshell链接本地虚拟机中的Linux

    昨天想在自己机器上安装一下Linux,并使用xshell访问,可是费了很长时间,在xshell端都提示“Could not connect to '192.168.54.100' (port 22): ...

  10. Linux系统下如何禁止ping命令或允许ping命令的方法

    1.禁止pingecho 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all 2.允许ping echo 0 >/proc/sys/net/ipv4/ic ...