案例分享 | Yelp 如何在 Kubernetes 上运行 Kafka(第 1 部分 - 架构)

2024-01-18 03:20

本文主要是介绍案例分享 | Yelp 如何在 Kubernetes 上运行 Kafka(第 1 部分 - 架构),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文译自 Kafka on PaaSTA: Running Kafka on Kubernetes at Yelp (Part 1 - Architecture)[1]。作者:Lennart Rudolph

在 Yelp,Kafka 每天接收数百亿条消息来推进数据驱动并为关键业务管道和服务提供支持。我们最近通过在 PaaSTA (Yelp 自己的平台即服务)上运行集群,对 Kafka 部署架构进行一些改进。基于 K8s 的部署利用了 Kafka 的自定义 Kubernetes operator 以及用于生命周期管理的 Cruise Control 。

架构改进及动机

过去,我们所有的 Kafka 集群都在 AWS 的专用 EC2 实例上运行。Kafka 直接部署在这些主机上,配置管理高度依赖 Puppet 仓库。这种部署模式有些繁琐,创建一个新集群平均需要两个多小时。因此我们着手开发一种新的部署模型,以下是改进目标:

  • 减少对 Puppet 缓慢运行的依赖。

  • 在内部推广 PaaSTA ,并利用其 CLI 工具来提高生产力。

  • 提高生命周期管理系统的可维护性。

  • 简化执行操作系统主机升级和 Kafka 版本升级的过程。

  • 简化新 Kafka 集群的创建(与我们部署服务的方式一致)。

  • 加快代理退役,简化主机故障的恢复过程。拥有重新连接 EBS 卷的能力,避免不必要地网络资源消耗,节省资金。

Yelp 之前开发了在 Kubernetes 上运行有状态应用程序的实践(例如,Cassandra on PaaSTA and Flink on PaaSTA),因此 PaaSTA 是这个用例的自然选择。

新的部署架构利用 PaaSTA 池(或主机组)作为底层基础设施。Kafka 代理 pod 调度在 Kubernetes 节点上,并且代理 pod 具有可分离的 EBS 卷。新架构的两个关键组件是 Kafka operator 和 Cruise Control,后面会更详细地介绍这两者。我们在 PaaSTA 上部署了我们内部的 Kafka Kubernetes Operator 实例和各种 Sidecar 服务,并且每个 Kafka 集群的 PaaSTA 上也部署了一个 Cruise Control 实例。

新旧架构的两个关键区别是 Kafka 现在运行在 Docker 容器中,我们的配置管理方法不再依赖 Puppet。配置管理现在与基于 PaaSTA 的配置管理解决方案一致,在该解决方案中,只要 YAML 文件更改提交到服务配置存储库, Jenkins 就会传播这些变化。由于这次架构大修,我们才能够利用现有的 PaaSTA CLI 工具来查看集群的状态、读取日志并重新启动集群。另一个好处是,能够通过提供必要的配置(见下文)来部署新的 Kafka 集群,这种方法使我们配置新 Kafka 集群的时间减半。

PaaSTA 工具示例

example-test-prod:deploy_group: prod.everythingpool: kafkabrokers: 15cpus: 5.7  # CPU unit reservation breakdown: (5.7 (kafka) + 0.1 (hacheck) + 0.1 (sensu)) + 0.1 (kiam) = 6.0 (as an example, consider that our pool is comprised of m5.2xlarge instances)mem: 26Gidata: 910Gistorage_class: gp2cluster_type: examplecluster_name: test-produse_cruise_control: truecruise_control_port: 12345service_name: kafka-2-4-1zookeeper:cluster_name: test-prodchroot: kafka-example-test-prodcluster_type: kafka_example_testconfig:unclean.leader.election.enable: "false"reserved.broker.max.id: "2113929216"request.timeout.ms: "300001"replica.fetch.max.bytes: "10485760"offsets.topic.segment.bytes: "104857600"offsets.retention.minutes: "10080"offsets.load.buffer.size: "15728640"num.replica.fetchers: "3"num.network.threads: "5"num.io.threads: "5"min.insync.replicas: "2"message.max.bytes: "1000000"log.segment.bytes: "268435456"log.roll.jitter.hours: "1"log.roll.hours: "22"log.retention.hours: "24"log.message.timestamp.type: "LogAppendTime"log.message.format.version: "2.4-IV1"log.cleaner.enable: "true"log.cleaner.threads: "3"log.cleaner.dedupe.buffer.size: "536870912"inter.broker.protocol.version: "2.4-IV1"group.max.session.timeout.ms: "300000"delete.topic.enable: "true"default.replication.factor: "3"connections.max.idle.ms: "3600000"confluent.support.metrics.enable: "false"auto.create.topics.enable: "false"transactional.id.expiration.ms: "86400000"

运行 Kafka 2.4.1 版本的有 15 个代理的集群的示例配置文件

新架构详解

新架构的一个主要组件是 Kafka Kubernetes operator,它负责管理 Kafka 集群的状态。虽然我们仍然依赖外部 ZooKeeper 集群来维护集群元数据,但消息数据仍然保存在 Kafka 代理的磁盘中。由于 Kafka 用户依赖持久存储来检索数据,在 Kubernetes 中,Kafka 被认为是一个有状态的应用程序。Kubernetes 公开了用于管理有状态应用程序的工作负载 API 对象 。

(例如 StatefulSets ),但 Kubernetes 默认没有 Kafka-specific 结构。因此,需要标准 Kubernetes API 之外的其他功能来维护我们的实例。用 Kubernetes 的说法,operator 是一个自定义控制器,它允许我们公开这种特定的应用功能。

Operator 负责确定 Kubernetes 需要对集群执行操作的时间。它有一个协调循环,观察自定义集群资源的状态,并通过与 Kubernetes API 交互以及调用另一个关键架构组件 Cruise Control 公开的 API 来协调差异。

Cruise Control 是 LinkedIn 开发的开源 Kafka 集群管理系统。目标是减少与维护大型 Kafka 集群的开销。每个 Kafka 集群都有自己专用的 Cruise Control 实例,每个集群的 Operator 与其 Cruise Control 实例交互以执行生命周期管理操作,如检查集群的健康状况、重新平衡主题分区和添加/删除代理。

Cruise Control 使用的范式在许多方面与 operator 使用的范式相似。Cruise Control 监控 Kafka 集群的状态,生成一个内部模型,扫描异常目标,并尝试解决异常问题。它公开了用于各种管理任务和上述生命周期管理操作的 API 。这些 API 可替代我们之前的临时生命周期管理实现,我们使用 EC2 支持的代理来执行条件性再平衡操作或与 SNS 和 SQS 等 AWS 资源进行互动,将这些整合到一项服务中帮助简化生命周期管理栈。

集群架构

将这些组件放在一起就形成了一个集群架构,我们通过内部配置管理系统定义了一个 CRD,并将其与自定义 Kafka Docker 镜像结合起来。Kafka Kubernetes operator 在与 Kubernetes API 的交互中使用配置、CRD 和 Docker 镜像 ,在 Kubernetes 主服务器上生成 KafkaCluster 自定义资源,因此可以在 Kubernetes 节点上调度 Kafka pod,operator 通过 Kubernetes API 和 Cruise Control 服务公开的 API 来监督和维护集群的健康状况。我们可以通过 Cruise Control UI 或 PaaSTA CLI 工具观察集群并与之交互。

最后,通过一个示例场景来说明整个操作流程。考虑通过删除代理来缩小集群规模的情况。一个开发者更新集群的配置并减少代理的数量,从而更新 Kafka 集群的 CRD。作为协调循环的一部分,operator 认识到期望的集群状态与 StatefulSet 中表示的实际状态不同,所以它要求 Cruise Control 删除代理,Cruise Control API 返回有关删除任务的信息,operator 使用这个任务的元数据注释退役 pod。当 Cruise Control 执行将分区从代理移开的过程,operator 会通过向 Cruise Control 发出请求来例行检查停用的状态。一旦任务被标记为已完成,operator 将移除 pod ,集群规范的内部状态就被调和了。

缩小规模的方案

架构设计好后,我们会做什么?

在设计了这个架构之后,我们构建了一个将 Kafka 集群从 EC2 无缝迁移到 PaaSTA 的流程。截止目前,我们已经将许多集群迁移到 PaaSTA,并使用新架构部署了新集群。我们还在继续调整硬件选择,以适应集群的不同属性。

下一篇会分享我们将现有 Kafka 集群从EC2无缝迁移到基于Kubernetes的内部计算平台的策略。

引用链接

[1]

原文链接: https://engineeringblog.yelp.com/2021/12/kafka-on-paasta-part-one.html

这篇关于案例分享 | Yelp 如何在 Kubernetes 上运行 Kafka(第 1 部分 - 架构)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/617958

相关文章

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

如何在一台服务器上使用docker运行kafka集群

《如何在一台服务器上使用docker运行kafka集群》文章详细介绍了如何在一台服务器上使用Docker运行Kafka集群,包括拉取镜像、创建网络、启动Kafka容器、检查运行状态、编写启动和关闭脚本... 目录1.拉取镜像2.创建集群之间通信的网络3.将zookeeper加入到网络中4.启动kafka集群

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选

Python中处理NaN值的技巧分享

《Python中处理NaN值的技巧分享》在数据科学和数据分析领域,NaN(NotaNumber)是一个常见的概念,它表示一个缺失或未定义的数值,在Python中,尤其是在使用pandas库处理数据时,... 目录NaN 值的来源和影响使用 pandas 的 isna()和 isnull()函数直接比较 Na

PostgreSQL如何用psql运行SQL文件

《PostgreSQL如何用psql运行SQL文件》文章介绍了两种运行预写好的SQL文件的方式:首先连接数据库后执行,或者直接通过psql命令执行,需要注意的是,文件路径在Linux系统中应使用斜杠/... 目录PostgreSQ编程L用psql运行SQL文件方式一方式二总结PostgreSQL用psql运

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。