以下是kafka在zookeep中的详细存储结构图:

1.Broker注册

Kafka是一个分布式的消息系统。Kafka 集群包含一个或多个服务器,服务器节点称为broker。虽然Broker是分布式部署并且相互之间独立运行的,但是还需要一个注册系统能够将整个集群中的Broker服务器都管理起来。

在ZooKeeper上有一个专门用来进行Broker服务器列表记录的节点,下文中我们称之为“Broker节点”,其节点路径为/brokers/ids

每个Broker服务器在启动时,都会到ZooKeeper上进行注册,即到Broker节点下创建属于自己的节点,其节点路径为/broker/ids/[0...N]。

从上面的节点路径中,我们可以看出,在Kafka中,我们使用一个全局唯一的数字来指定每一个Broker服务器,可以称其为“Broker ID"。不同的Broker必须使用不同的Broker ID进行注册。

注意:Broker创建的节点是一个临时节点,也就是说,一旦这个Broker服务器宕机或下线后,那么对应的Broker节点也就被删除了。

2.Topic注册

在Kafka中,会将同一个Topic的消息分成多个分区并将其分布到多个Broker上,这些信息在ZooKeeper上由专门的节点来记录,其节点路径为/brokers/topics。Kafka中的每一个Topic,都会以/brokers/topics/[topic]的形式记录在这个节点下,例如/brokers/topic/login和/brokers/topics/search等。

Broker服务器在启动后,会到对应的Topic节点下注册自己的Broker ID,并写入针对该Topic的分区总数。

例如,/brokers/topics/login/3 -->2 这个节点表明Broker ID为3的一个Broker服务器,对于“login”这个topic的消息,提供了2个分区进行消息存储。同样,这个分区数节点也是一个临时节点。

3.生产者负载均衡

由于同一个Topic消息会被分区并将其分布在多个Broker上,因此,生产者需要将消息合理地发送到这些分布式的Broker上,那么如何实现生产者的负载均衡,Kafka支持传统的四层负载均衡,也支持Zookeeper方式实现负载均衡。

(1) 四层负载均衡,根据生产者的IP地址和端口来为其确定一个相关联的Broker。通常,一个生产者只会对应单个Broker,然后该生产者产生的消息都发往该Broker。这种方式逻辑简单,每个生产者不需要同其他系统建立额外的TCP连接,只需要和Broker维护单个TCP连接即可。但是,其无法做到真正的负载均衡,因为实际系统中的每个生产者产生的消息量及每个Broker的消息存储量都是不一样的,如果有些生产者产生的消息远多于其他生产者的话,那么会导致不同的Broker接收到的消息总数差异巨大,同时,生产者也无法实时感知到Broker的新增和删除。

(2) 使用Zookeeper进行负载均衡,由于每个Broker启动时,都会完成Broker注册过程,生产者会注册Broker节点的Watcher事件监听,通过该节点的变化来动态地感知到Broker服务器列表的变更,这样就可以实现动态的负载均衡机制。

4.消费者负载均衡

与生产者类似,Kafka中的消费者同样需要进行负载均衡来实现多个消费者合理的从对应的Broker服务器上接收消息。Kafka有消费者分组的概念,每个消费者分组中都包含了若干个消费者,每一条消息都只会发送给分组中的一个消费者,不同的消费者分组消费自己特定Topic下面的消息,互不干扰。因此消费者的负载均衡也可以看作是同一个消费者分组内部的消息消费策略。

5.消息消费进度Offset 记录

在消费者对指定消息分区进行消息消费的过程中,需要定时地将分区消息的消费进度Offset记录到Zookeeper上,以便在该消费者进行重启或者其他消费者重新接管该消息分区的消息消费后,能够从之前的进度开始继续进行消息消费。Offset在Zookeeper中由一个专门节点进行记录,其节点路径为:

/consumers/[group_id]/offsets/[topic]/[broker_id-partition_id]

节点内容就是Offset的值。

6.消费者注册

消费者服务器在初始化启动时加入消费者分组的步骤如下:

1)注册到消费者分组

每个消费者服务器启动时,都会到Zookeeper的指定节点下创建一个属于自己的消费者节点,例如/consumers/[group_id]/ids/[consumer_id],完成节点创建后,消费者就会将自己订阅的Topic信息写入该临时节点。

2)对消费者分组中的消费者的变化注册监听

每个消费者都需要关注所属消费者分组中其他消费者服务器的变化情况,即对/consumers/[group_id]/ids节点注册子节点变化的Watcher监听,一旦发现消费者新增或减少,就触发消费者的负载均衡。

3)对Broker服务器变化注册监听

消费者需要对/broker/ids/[0-N]中的节点进行监听,如果发现Broker服务器列表发生变化,那么就根据具体情况来决定是否需要进行消费者负载均衡。

4)进行消费者负载均衡。

为了让同一个Topic下不同分区的消息尽量均衡地被多个消费者消费而进行消费者与消息分区分配的过程,通常,对于一个消费者分组,如果组内的消费者服务器发生变更或Broker服务器发生变更,会发出消费者负载均衡。

6.补充

早期版本的 kafka 用 ZooKeeper 做 meta 信息存储、consumer 的消费状态、group 的管理以及offset的值。考虑到ZooKeeper本身的一些因素以及整个架构较大概率存在单点问题,新版本中确实逐渐弱化了ZooKeeper的作用。新的consumer使用了kafka内部的group coordination协议,也减少了对ZooKeeper的依赖。

Kafka 0.9版本之后,consumer已经不通过ZooKeeper来实现重平衡。而是使用GroupCoordinator机制。

Coordinator具体介绍可以查看博客:https://www.cnblogs.com/zhy-heaven/p/10994022.html

Kafka在ZooKeeper中的应用相关推荐

  1. kafka在zookeeper中存储结构

    1.topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 Schema: {     "version": ...

  2. Kafka在zookeeper中存储结构和查看方式

    Zookeeper 主要用来跟踪Kafka 集群中的节点状态, 以及Kafka Topic, message 等等其他信息. 同时, Kafka 依赖于Zookeeper, 没有Zookeeper 是 ...

  3. Kubernetes 搭建 Kafka 和 Zookeeper 集群(完整教程)

    推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...

  4. kafka、zookeeper正常启动,创建topic:报错Replication factor: 3 larger than available brokers: 0

    1.问题描述 新启用了一个集群,正常启动kafka和zookeeper后,jps查看所有节点kafka和zookeeper都正常工作. 当使用命令行创建topic时 ./kafka-topics.sh ...

  5. 基于 Kafka 和 ZooKeeper 的分布式消息队列原理

    转载:https://gitbook.cn/books/5bc446269a9adf54c7ccb8bc/index.html 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量 ...

  6. 再谈基于 Kafka 和 ZooKeeper 的分布式消息队列原理

    关于分布式消息队列,我在几个月前写过一篇文章:<深入浅出理解基于 Kafka 和 ZooKeeper 的分布式消息队列 >.最近,由于写作课程<分布式中间件实践之路>的契机,我 ...

  7. 深入浅出理解基于 Kafka 和 ZooKeeper 的分布式消息队列

    https://gitbook.cn/books/5ae1e77197c22f130e67ec4e/index.html 向作者提问 毕业于 C9 高校,硕士学历,曾在 IEEE ITS.VSD 等 ...

  8. Zabbix监控之从zookeeper中获取Kafka消费进度和lag

    Kafka在0.9之前,消费进度是存放在zookeeper中,在0.9及之后的版本,kafka自身提供了存放消费进度的功能.从kafka中获取消费进度请查看我另一片文章 传送门 这篇文章是转载自htt ...

  9. 五分钟搞定:Centos中Kafka和Zookeeper的快速安装教程

    [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! 代码案例地址: ?https://github.com/Mydreamandrea ...

最新文章

  1. STL学习笔记(一)
  2. OSChina 周三乱弹 —— 程序员火灾逃生指南
  3. js bom window对象
  4. HDU 1221: Cube
  5. 帆软地址栏传参,实例
  6. vue 判断两对象是否一致_你的.vue文件就已经是你的文档了
  7. numpy 几个比较重要的链接
  8. 个人总结---连通图的最小生成树算法
  9. 小程序资源服务器,开发小程序没有服务器资源
  10. beetle 2.7海量消息广播测试
  11. 开源物联网平台建设、参考解决方案
  12. java实现简单的 cs架构
  13. 赵小楼《天道》《遥远的救世主》深度解析(135)观念,传统观念,传统观念有没有用取决于观念,而不在传统
  14. python里row是什么意思_row python
  15. 使用vmdk文件创建虚拟机
  16. slack 开源系统_Slack团队聊天的5种开源替代品
  17. 关系代数中的除操作怎么用SQL语句表示?
  18. Python学习之解决“千年虫”问题
  19. RMA( 退货)的业务流程
  20. Python科研数据分析专题之缺失值填补

热门文章

  1. 近世代数--素理想和极大理想--有单位元的交换环,每个极大理想都是素理想
  2. 数据结构--队列(数组)的一种实现
  3. ❗HTML引入CSS的三种常用方式汇总❗
  4. 5-Interrupt Management Framework
  5. 删除-Trustzone-TEE-ATF
  6. FileLocatorPro正则表达式批量搜索文件中的字符串
  7. WIN32获取进程当前目录
  8. Android_NetWork_Test
  9. python实现键盘记录器
  10. 【Redis】配置远程连接