漫游Kafka实现篇之分布式
Zookeeper节点标记
当路径中的元素包括在方括号里比如[xyz],则表示xyz表示的值是不固定的,每个可能的值都有一个Zookeeper节点。比如/topics/[topic]表示每个topic名称对应/topics的一个子目录。也可以用类似[0...5]表示一个数值范围来表示含有子目录0,1,2,3,4的目录。箭头->表示znode的节点含有某个内容,比如/hello->word表示一个含有“world”的节点。
- /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被注册到以下的目录中:
- /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目录中:
- /consumers/[group_id]/offsets/[topic]/[broker_id-partition_id] --> offset_counter_value ((persistent node)
分区归属注册
每个分区只会被组中的一个consumer消费,consumer在消费之前必须建立和分配的分区的归属关系,把它的consumerid写入broker分区下的一个临时节点。
- /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启东时,它将遵循以下步骤:
- 把自己注册到组下面的consumer id记录中。
- 注册一个监听器,监听consumer id记录的的“变更(新的consumer加入或老的退出)”,每次“变更”都会触发一次组中各consumer之间的再平衡。
- 注册一个监听器,监听broker id记录的“变更(新的broker加入或者老的退出)”,每次变更都会触发一次所有组中所有sonsumers之间的再平衡。
- 如果consumer消息流是使用了topic过滤器,也需要注册一个监听器去监听broker topic记录的变更(新的topic加入)。每次变更都会触发一次对所有的topics的重新评估以决定是否符合这个过滤器。一个新的copic会触发一次在所有consumers中的再平衡.
- 在它所在的组进行一次再平衡。
漫游Kafka实现篇之分布式的更多相关文章
- 漫游Kafka设计篇之主从同步
Kafka允许topic的分区拥有若干副本,这个数量是可以配置的,你可以为每个topci配置副本的数量.Kafka会自动在每个个副本上备份数据,所以当一个节点down掉时数据依然是可用的. Kafka ...
- 漫游Kafka设计篇之性能优化
Kafka在提高效率方面做了很大努力.Kafka的一个主要使用场景是处理网站活动日志,吞吐量是非常大的,每个页面都会产生好多次写操作.读方面,假设每个消息只被消费一次,读的量的也是很大的,Kafka也 ...
- 漫游Kafka入门篇之简单介绍
介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: Kafka将消息以 ...
- 漫游Kafka设计篇之性能优化(7)
Kafka在提高效率方面做了很大努力.Kafka的一个主要使用场景是处理网站活动日志,吞吐量是非常大的,每个页面都会产生好多次写操作.读方面,假设每个消息只被消费一次,读的量的也是很大的,Kafka也 ...
- 漫游Kafka入门篇之简单介绍(1)
介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: Kafka将消息以 ...
- (转)漫游Kafka入门篇之简单介绍
转自:http://blog.csdn.net/honglei915/article/details/37564521 原文地址:http://blog.csdn.net/honglei915/art ...
- 漫游Kafka实现篇之消息和日志
消息格式 消息由一个固定长度的头部和可变长度的字节数组组成.头部包含了一个版本号和CRC32校验码. /** * 具有N个字节的消息的格式如下 * * 如果版本号是0 * * 1. 1个字节的 &qu ...
- 漫游Kafka实战篇之客户端API
Kafka Producer APIs 旧版的Procuder API有两种:kafka.producer.SyncProducer和kafka.producer.async.AsyncProduce ...
- 漫游Kafka设计篇之Producer和Consumer
Kafka Producer 消息发送 producer直接将数据发送到broker的leader(主节点),不需要在多个节点进行分发.为了帮助producer做到这点,所有的Kafka节点都可以及时 ...
随机推荐
- javascript中关于坐标 大小 的描述
window对象 有效桌面的大小,除去桌面下面的任务栏的高度 window.screen.availHeight : window.screen.availWidth : 浏览器窗口的左上角相对于 ...
- json 处理
//String sssssString = "{"response":{"data":[{"address":"南京市 ...
- Sublime Text3激活 破解
Sublime Text 是一个复杂的文本.代码编辑器.出色用户界面,非凡的功能和惊人的性能. Sublime Text 3 官方网站 http://www.sublimetext.com/ 点击菜单 ...
- Random的用法
import java.util.Random; public class RandomTest { public static void main(String[] args) { Random r ...
- Java 延时常见的几种方法
1. 用Thread就不会iu无法终止 new Thread(new Runnable() { public void run() { while (true) { test(); try { Thr ...
- Android OpenGL 学习笔记 --开始篇
转自: http://www.cnblogs.com/TerryBlog/archive/2010/07/09/1774475.html 1.什么是 OpenGL? OpenGL 是个专业的3D程序接 ...
- Java集合框架(二)
Set Set:无序,不可以重复元素. |--------HashSet:数据结构是哈希表. 线程是非同步的.保证元素唯一性的原理是:判断元素的hashCode值是否相同,如果相同,还会继续判断元素的 ...
- 如何用虚拟机装SQL Server
更新(2016.3.14) 看来之前还是写的太简了,来问的同学有点多. 所以还是详细一些吧. 大概步骤 装好Virtual Box这个软件,免费的 下载window server 2003系统镜像,然 ...
- CentOS7-64bit 编译 Hadoop-2.5.0,并分布式安装
摘要 CentOS7-64bit 编译 Hadoop-2.5.0,并分布式安装 目录[-] 1.系统环境说明 2.安装前的准备工作 2.1 关闭防火墙 2.2 检查ssh安装情况,如果没有则安装ssh ...
- iOS:Git分布式版本控制器系统
Git的使用 1.Git简介: Git是一个开源的分布式版本控制系统.与SVN.CVS相比 分布式 不需要中心仓库 Git的版本号都是生成的一个哈希值,比如:bbaf6fb5060b4875b1 ...