您当前的位置:首页 > 电脑百科 > 站长技术 > 服务器

Apache Kafka 移除 ZK Proposals

时间:2022-12-27 14:17:49  来源:今日头条  作者:Java码农之路

Zookeeper 和 KRaft

这里有一篇 Kafka 功能改进的 proposal 原文。要了解移除 ZK 的原因,可以仔细看看该文章。以下是对该文章的翻译。

动机

目前,Kafka 使用 Zookeeper 保存与分区(patitions)、brokers 相关的元数据,以及选举 Kafka 控制器(某个 broker)。我们将移除对 Zookeeper 的依赖。如此一来,Kafka 在管理元数据方面,将获得更好的可扩展性和鲁棒性,同时支持更多的分区。在部署、配置 Kafka 方面,也将得到极大的简化。

将元数据视为 Event Log

我们常说将状态做为事件流管理的好处。一个在流中描述消费者位置的数字:offset。消费者通过回放 offset 之后的事件,就能获取最新状态。日志建立一套清晰、有序的事件机制,并确保每个消费者能获取到自己的时间线。

虽然我们的用户享受这些便利,但是忽略了 Kafka 本身。我们将作用到元数据的变更看作彼此孤立,互不相干。当控制器将状态变更通知到集群中的其他 broker 时,其他 broker 可能会收到一些变更,但不是全部变更。虽然控制器会重试几次,但最终会停止重试。这将导致 broker 之间处于不同步的状态。

更糟糕的是,虽然 Zookeeper 存储 record,但是 Zookeeper 中保存的状态经常与控制器保存在内存中的状态无法匹配。例如,当分区 leader 在 Zookeeper 中变更其 ISR(in-sync Replica)时,通常情况下,控制器会延误几秒钟才能获知其变更。对于控制器来说,没有通用的方法追踪 Zookeeper 的 event log。虽然控制器可以设置一次性守卫,但是守卫的数量由于性能问题会受到限制。当触发守卫时,守卫不负责通知控制器当前状态,仅仅是通知控制器状态发生了变更。同时,控制器重读 znode,然后设置一个新的守卫,但是,从最初守卫发出通知,到控制器完成重读,重新设置守卫期间,状态可能已经产生了新的变更。如果不设置守卫,控制器将永远无法得知变更。某些情况下,重启控制器是解决状态不一致的唯一手段。

元数据与其存储在独立的系统中,不如存储在 Kafka 中。这种情况下,控制器状态与 Zookeeper 状态之间和差异相关的问题将不复存在。与其挨个通知 broker,不如让 broker 们从 event log 中消费元数据事件。这样就确保了元数据变更能够按相同的顺序同步到 broker 中。broker 将元数据存储在本地文件中。当这些 broker 启动时,它们只需要从控制器中(某个 broker)中读取变更,而无需全量读取状态。在这种情况下,我们消耗更少的 CPU 资源就能获得更多分区。

简化部署与配置

Zookeeper 是一套独立的系统,有其配置文件语法,管理工具以及部署模式。这意味着系统管理员为了部署 Kafka,需要学习如何管理和部署两套独立的分布式系统。这对系统管理员来说,是非常艰巨的任务,尤其是在他们不熟悉部署 JAVA 服务的情况下。统一系统将极大地改善运行 Kafka 的初次体验,并有助于拓宽其应用范围。

由于 Kafka 和 Zookeeper 的配置文件是分离的,因此极易产生错误。例如,管理员在 Kafka 中设置了 SASL(Simple Authentication Security Layer,简单认证安全层),并且错误的认为对所有在网络中传输的数据都做了加密。事实上,还需要在外部系统 Zookeeper 中配置加密。统一两个系统将获得完整的加密配置模型。

最后,未来我们可能需要支持单节点 Kafka 模型。对于那些要测试 Kafka 功能的人来说,无需启动守护进程,将提供极大的便利性。移除 Zookeeper 依赖,将使其成为可能。

架构介绍

本 KIP(Kafka Improvement Proposal,Kafka 改进 Proposal) 展现的是一个可扩展的后 Zookeeper 时代的 Kafka 系统的总体愿景。为了突出重要部分,我忽略了大多数细节,比如 RPC 格式、磁盘格式等等。在后续 KIP 中,我们将逐步深入描述细节。与 KIP-4 类似,提出总体愿景,后续的 KIP 中逐步扩充。

总览


 

目前,一套 Kafka 集群包括几个 broker 节点,Zookeeper 节点做为一套外部 quorum (投票机制,少数服从多数)。我们画了 4 个 broker 节点和 3 个 Zookeeper 节点。这是小集群所需的正常配置。控制器(用橙色标识)在被选举后,从 Zoopeeper 的 quorum 中加载其状态。从控制器连接其他节点的线,在 broker 中代表更新控制器推送的消息,比如 LeaderAndIsr、UpdateMetadata 消息。

注意,这张图有误导的地方。除控制器以外,其他 broker 也可以与 Zookeeper 通信。因此,每个 broker 都应该画一条连接 ZK 的线。无论如何,画太多线将导致该图难以阅读。该图还忽略了,在不需要控制器介入的情况下,能够修改 Zookeeper 中的状态的外部命令行工具和工具包。正如上面讨论的那样,这些问题导致了控制器内存中状态无法真正的反映 Zookeeper 中的持久化状态。

在 Proposed 架构中,三个控制器节点取代了 Zookeeper 的 3 个节点。控制器节点和 broker 节点在不同的 JVM 中运行。控制器节点为元数据分区选举一个 leader 节点,用橙色标识。相较于控制器向各个 broker 推送元数据更新,在 Proposed 中,各个 broker 从 leader 中拉取元数据更新。这就是箭头指向控制器的原因。

注意,控制器进程与 broker 进程是逻辑隔离的,它们不必做物理隔离。在某些情况下,将部分或者全部控制器进程与 broker 进程部署在一个节点上,有其存在的意义。这和 Zookeeper 进程和 Kafka broker 部署在同一个节点上(目前小型集群的部署方式)类似。通常,各种各样的部署方式都可能出现,包括在同一个 JVM 中运行。

控制器 Quorum

控制器节点由管理元数据日志的 Raft quorum(Raft 选举机制)组成。该日志包括每次变更集群的元数据相关信息。目前,一切信息都存储在 Zookeeper 中,比如 topic、partition、ISR、配置等,在新的架构中,这些信息都将存在日志中。

通过 Raft 算法,控制器节点将在它们之间选举 leader,不需要依赖任何外部系统。元数据日志的 leader 被称作活动的(active)控制器。活动控制器处理所有来自 broker 的 RPC 调用。follower 控制器(相对 leader 控制来说)从活动控制器中复制所有写入的数据,并且当活动控制器故障时,做为热备(hot standbys)。由于控制器全量追踪最新状态,控制器故障切换将不再需要花很多时间转移最新状态到新的控制器上。

和 Zookeeper 一样,Raft 需要大多数节点能正常运行,才能正常工作。因此,3 个节点控制器集群允许一个节点失效。5 个节点的控制器集群允许两个节点失效,以此类推。

控制器将按周期将元数据快照写入磁盘。虽然在概念上和压缩相似,但是代码路径有些许不同,原因是我们从内存中读取状态,而不是从磁盘中重读日志。

管理 broker 元数据

不同于控制器将更新推送至各个 broker,这些 broker 将通过新的 MetadataFetch API 从活动控制器拉取更新。

MetadataFetch 与拉取请求类似。就和拉取请求一样,broker 将记录最近一次拉取的更新的 offset,并且只从活动控制器请求新的更新。

broker 将拉取到的元数据持久化至磁盘。这将使得 broker 启动的非常快,即使有成百上千分区,甚至上百万个分区。(注意,这种持久化是一种优化,如果忽略这种优化可以提高开发效率,那么我们可以在第一个版本中忽略它)

大多数时候,broker 只需要拉取增量状态(deltas),而不是全量状态。无论如何,如果 broker 的状态与活动控制器的状态差距过大,或者 broker 完全没有缓存元数据,控制器将返回全量元数据镜像,而不是返回一些列的增量数据。


 

broker 按周期从活动控制器中请求元数据更新。该请求同时做为心跳发送,控制器以此得知该 broker 是存活状态。

注意,虽然本节只讨论管理 broker 的元数据,但是管理客户端的元数据对于可伸缩性也很重要。一旦发送增量元数据更新的基础设施搭建好后,这些基础设施将用于客户端和 broker。毕竟,一般情形下,客户端的数量会大于 broker 的数量。随着分区数量的增长,客户端感兴趣的分区也会越多,所以,以增量的方式将元数据更新交付给客户端将变得越来越重要。我们将在接下来的几个小节中讨论这个问题。

broker 状态机

目前,broker 在启动以后,马上在 Zookeeper 中注册自己。注册的过程完成两件事:告诉 broker 它是否被选举为控制器,让其他节点知道如何和它联系。

在后 Zookeeper 时代的世界里,broker 通过控制器 quorum 注册自己,而不是 Zookeeper。

当前,一个能够联系 Zookeeper ,但由控制器分区的 broker,能继续为用户的请求提供服务,但不会接收任何元数据更新。这将导致一些令人困惑、难以应对的情况。例如,一个 producer 通过 acks=1 继续发送数据给 leader,但实际上该 leader 已经不再是真正的 leader,但是这个失效的 leader 无法接收控制器的 LeaderAndIsrRequest,从而移除 leader 地位。

在后 ZK 时代的世界里,集群的成员关系集成在元数据更新中。如果 broker 无法接收元数据更新,将从集群的成员中移除。虽然该 broker 仍然可能被某个特殊的客户端分区,但如果该 broker 是由控制器分区的,仍将从集群中移除。

broker 状态


 

Offline

当 broker 进程为 Offline 状态,它要么没有启动,要么在执行启动所需的单节点任务,比如,初始化 JVM 或者执行恢复日志。

Fenced

当 broker 处于 Fenced 状态,它将不再响应来自客户端的 RPC 请求。broker 在启动后,尝试拉取最新的元数据时,将处于 fenced 状态。如果无法联系活动控制器,broker 将重新进入 fenced 状态。发给客户端的元数据应该忽略状态为 fenced 的 broker。

Online

当 broker 状态为 online 时,表示该 broker 准备好响应客户端的请求了。

Stopping

broker 进入 stoppoing 状态表示它们收到 SIGINT 信号。该信号表明系统管理员要关闭 broker。

broker 在 stopping 状态时,仍在运行,但是我们尝试将分区 leader 从 broker 中移除。

最后,活动控制器在 MetadataFetchResponse 中添加一串特殊的代码,要求 broker 进入 offline 状态。或者,如果 leader 在预先定义的时间内没有动作,broker 将关闭。

将已有的 API 迁移到控制器中

之前的很多直接写入 Zookeeper 的操作将变为写入控制器。例如,变更配置、修改保存默认授权的 ACLs,等等。

新版本的客户端应该将这些操作直接发给活动控制器。这是一个向后兼容的变更:在新旧集群中都能正常工作。为了兼容老客户端,这些操作将随机发送给 broker,broker 将这些请求转发给活动控制器。

新的控制器 API

在某些情况下,我们需要创建一个新的 API 替换之前通过 Zookeeper 完成的操作。例如,当分区 leader 要修改 in-sync replica 集合时,在后 ZK 时代的世界里,它直接修改 Zookeeper,现在,leader 发起一个 RPC 请求到活动控制器。

从工具包中移除直接访问 Zookeeper

目前,一些工具和脚本直接联系 Zookeeper。在后 Zookeeper 时代的世界里,这些工具将被 Kafka API 取代。幸运的是,“KIP-4:命令行和中心化管理操作”,在几年前开始移除直接访问 Zookeeper,并且快完成了。



Tags:Apache   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
如何使用Python、Apache Kafka和云平台构建健壮的实时数据管道
译者 | 李睿审校 | 重楼在当今竞争激烈的市场环境中,为了生存和发展,企业必须能够实时收集、处理和响应数据。无论是检测欺诈、个性化用户体验还是监控系统,现在都需要接近即时...【详细内容】
2024-01-26  Search: Apache  点击:(48)  评论:(0)  加入收藏
Apache RocketMQ 5.0腾讯云落地实践
Apache RocketMQ 发展历程回顾RocketMQ 最早诞生于淘宝的在线电商交易场景,经过了历年双十一大促流量洪峰的打磨,2016年捐献给 Apache 社区,成为 Apache 社区的顶级项目,并在国...【详细内容】
2023-12-13  Search: Apache  点击:(134)  评论:(0)  加入收藏
利用Apache Kafka、Flink和Druid构建实时数据架构
译者 | 陈峻审校 | 重楼如今,对于使用批处理工作流程的数据团队而言,要满足业务的实时要求并非易事。从数据的交付、处理到分析,整个批处理工作流往往需要大量的等待,其中包括:等...【详细内容】
2023-12-11  Search: Apache  点击:(234)  评论:(0)  加入收藏
Contentsquare 使用微服务和 Apache Kafka 来发送通知
作者 | Rafal Gancarz译者 | 平川策划 | TinaContentsquare 平台的许多场景都需要通知功能。作为其微服务架构的一部分,该公司创建了一个跨多个服务的通用解决方案。在实现过...【详细内容】
2023-10-29  Search: Apache  点击:(331)  评论:(0)  加入收藏
如何确定Apache Kafka的大小和规模
作者丨Andrew Mills编译丨云昭调整或扩展Kafka以获得最佳成本和性能的第一步是了解数据流平台如何使用资源。这里给一些实用的建议。实现Apache Kafka的团队,或者扩展他们对...【详细内容】
2023-10-23  Search: Apache  点击:(331)  评论:(0)  加入收藏
什么让 Apache Kafka 如此快速?
Kafka 支持高吞吐量、高度分布式、容错性强的平台,能够以低延迟传递消息。有几种技术使 Apache Kafka 如此快速: 低延迟消息传递 批量数据和压缩 水平扩展低延迟消息传递大多...【详细内容】
2023-09-12  Search: Apache  点击:(352)  评论:(0)  加入收藏
Go语言开发者的Apache Arrow使用指南:内存管理
如果你看了上一篇《Go语言开发者的Apache Arrow使用指南:数据类型》[1]中的诸多Go操作arrow的代码示例,你很可能会被代码中大量使用的Retain和Release方法搞晕。不光大家有这...【详细内容】
2023-09-11  Search: Apache  点击:(266)  评论:(0)  加入收藏
Apache Iceberg 在严选批流一体的实践
Iceberg是数据湖解决方案中比较热门的方案之一,通常用于批流一体中数据存储的组织实现,希望通过本文让大家了解到严选是如何从老的Lambda架构升级到基于Iceberg的批流一体架构...【详细内容】
2023-09-04  Search: Apache  点击:(283)  评论:(0)  加入收藏
Set集合工具类Apache之SetUtils
本文主要讲述:集合工具类Apache之 org.apache.commons.collections4.SetUtils上文介绍了关于ListUtils的实例,本文我们对SetUtils的部分用法进行演示。一、判断两Set集合是否...【详细内容】
2023-08-14  Search: Apache  点击:(229)  评论:(0)  加入收藏
Apache Spark 的新编程语言
English SDK for Spark : 将英语作为一种新的编程语言,将生成式 AI 当做编译器, 将 Python 视作字节码!本文主要介绍了 Apache Spark 的英语软件开发套件(SDK)的重要性和目标,以及...【详细内容】
2023-07-07  Search: Apache  点击:(239)  评论:(0)  加入收藏
▌简易百科推荐
为什么Nginx被称为“反向”代理呢?
Nginx(发音为"engine-x")是一款高性能、轻量级的开源Web服务器软件,也可用作反向代理服务器、负载均衡器和HTTP缓存。Nginx之所以有被称为“反向”代理,是因为它充当客户端设备...【详细内容】
2024-02-01  coderidea  微信公众号  Tags:Nginx   点击:(60)  评论:(0)  加入收藏
哪种服务器操作系统更好呢?
在当今的IT世界中,服务器操作系统扮演着至关重要的角色。它们是确保服务器能够高效、安全地运行的关键因素。然而,对于许多人来说,服务器操作系统的种类和特点可能是一个复杂的...【详细内容】
2024-01-30    简易百科  Tags:操作系统   点击:(76)  评论:(0)  加入收藏
什么是VPS服务器
VPS服务器是一种虚拟化技术,它将一台物理服务器划分为多个虚拟的独立服务器,每个虚拟服务器都可以拥有自己的操作系统、运行环境、应用程序等。这种技术使得每个虚拟服务器可...【详细内容】
2024-01-30    简易百科  Tags:VPS服务器   点击:(71)  评论:(0)  加入收藏
VPS服务器下载速度慢?这五招帮你提速
VPS服务器下载速度慢可能会让用户感到沮丧,尤其是对于需要大量下载和上传数据的用户。幸运的是,有一些方法可以帮助您提高VPS服务器的下载速度,使您的在线体验更加顺畅。在本文...【详细内容】
2024-01-30  IDC行业观察者    Tags:VPS服务器   点击:(58)  评论:(0)  加入收藏
美国VPS和英国VPS:地理位置对服务器性能的影响
在今天的数字时代,VPS已成为在线业务和网站托管的关键组成部分。然而,选择合适的VPS主机服务时,地理位置通常被忽视,尽管它对服务器性能有着重要的影响。本文将探讨美国VPS和英...【详细内容】
2024-01-26  IDC行业观察者    Tags:服务器   点击:(55)  评论:(0)  加入收藏
如何判断服务器所需带宽:基于业务需求和流量模式的关键考量
在选择服务器时,带宽是一个重要的考虑因素。带宽的大小直接影响到网站的加载速度和用户的访问体验。那么,如何判断服务器需要多大的带宽呢?本文将为你揭示这一关键问题的答案...【详细内容】
2024-01-26  源库科技    Tags:服务器   点击:(75)  评论:(0)  加入收藏
服务器内存空间及IO操作原理解析
服务器的内存空间分为内核空间和用户空间,而我们编写的程序通常在用户空间中运行。在进行读写操作时,我们直接操作的是用户缓冲区,而用户缓冲区的内容来自于内核缓冲区。这种内...【详细内容】
2024-01-23  王建立    Tags:服务器   点击:(44)  评论:(0)  加入收藏
如何在Java环境中安装Nginx?
1. 下载Nginx:首先,前往Nginx官方网站(https://nginx.org/en/download.html)下载新版本的Nginx。选择适合您操作系统的版本,通常有Windows、Linux和Mac等不同操作系统的版本可供...【详细内容】
2024-01-22  敲代码的小动    Tags:Nginx   点击:(63)  评论:(0)  加入收藏
服务器证书和SSL证书有啥区别?
在互联网经济时代,随着越来越多的信息以及合作都是从企业官网开始的,因此绝大多数企业都会为自己的网站配置SSL证书,以提高安全性。在接触SSL证书时,也有很多人称之为服务器证书...【详细内容】
2024-01-10  安信SSL证书    Tags:服务器证书   点击:(65)  评论:(0)  加入收藏
宝塔面板怎样部署java项目?
宝塔面板怎样部署java项目?在使用宝塔面板部署Java项目之前,需要确保已经安装了Java Development Kit (JDK)。接下来,将介绍如何使用宝塔面板来部署Java项目的步骤。步骤一:安装...【详细内容】
2024-01-09  西部数码    Tags:宝塔面板   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条