apache-kafka - 为什么 Kafka 集群已经使用 Zookeeper,还需要 Controller?
问题描述
Kafka 集群有一个控制器节点和一个 Zookeeper 集群,它们都有自己的一套职责。当我们已经拥有 zookeeper 时,控制器的要求是什么? 例如:控制器选举由zookeeper执行,分区领导者选举由控制器完成。当 Kafka 已经知道哪些分区在哪些节点上以及哪些节点实际处于活动状态时,为什么不使用 Zookeeper 进行分区领导者选举。
简而言之,尽管动物园管理员在场,但我仍在努力理解控制器的要求。如果有人能解释这种设计选择的原因和优势,那将非常有帮助。
解决方案
kafka 使用 zookeeper 做一些事情:
- 集群成员 - 集群的实时代理是那些拥有临时 ZK 节点的代理
- 领导者选举 - 选举作为控制器的 kafka 经纪人
- 状态存储 - 一些(主要是较旧的)状态存储在 ZK 中 - 例如主题的配置。曾经在 ZK 中的一些状态已迁移到特殊主题(消费者偏移量),并且编写了一些更新的功能以将状态完全存储在 kafka 中(例如事务日志)。
总的趋势是停止在 ZK 中使用状态,而是自行托管它(尽管代码的旧部分从未被迁移出来)。
至于为什么不使用 ZK 进行分区领导者选举 - 一个原因是涉及逻辑。在选举集群领导代理时,没有偏好 - 任何代理都可以。这与基于 ZK 的领导人选举的工作方式非常吻合(第一个创建和拥有临时 znode 的成员获胜)。
但是,在选择分区领导者时,您需要更多的逻辑。例如 - 您想选择具有“最高水印”的领导者(具有最新数据,记住复制通常是异步的)。不干净的领导人选举也有逻辑。仅 ZK 无法做到这一点,因此它由控制器完成。
推荐阅读
- python - 如何仅根据使用Python的路径字符串计算目录中的子目录数
- postgresql - 如何使用 postgres 按不同的标准对行进行排序
- log4j - 如何将 Logback 附加到 smartfox 服务器
- google-apps-script - Apps Script Google Sheets POP up 选择是或否总是发送电子邮件,无论
- c# - 在实体框架中如何配置影子拥有的实体?
- django - Django-q如何从代码中删除计划任务
- php - 托管一个没有 PHP 和 MySQL 的动态网站
- vue.js - Vue-multiselect 使用 AJAX 更新字段
- textinput - 如何在键盘事件上显示数据列表弹出窗口
- javascript - 从角度的html表中获取数据