写点什么

LinkedIn 开源 Cruise Control:一个 Kafka 集群自动化运维新利器

  • 2017-09-03
  • 本文字数:2746 字

    阅读完需:约 9 分钟

Kafka 近年来日渐流行,LinkedIn 的 1800 台 Kafka 服务器每天处理 2 万亿个消息。虽说 Kafka 运行得十分稳定,但要大规模运行 Kafka,在运维方面仍然面临巨大的挑战。每天都会有 broker 崩溃,导致集群工作负载不均衡。SRE 团队需要花费大量的时间和精力来重分配分区,以便让集群重新恢复均衡。

自动化因此变得十分重要,这也就是为什么我们要开发 Cruise Control :持续监控 Kafka 集群,自动调整分配给服务器的资源,达到预期的性能目标。用户设定目标,Cruise Control 对集群的工作负载进行分析,并自动执行一些操作来达成目标。

Cruise Control 即日起在 GitHub 上开源。在这篇文章里,我们将介绍 Cruise Control 的使用场景、它的架构以及我们在开发 Cruise Control 过程中面临的挑战。

设计目标

  • 可靠的自动化: Cruise Control 要准确地分析集群的工作负载,生成无需人工介入的执行计划。
  • 资源有效性: Cruise Control 要智能地执行操作,不会影响集群处理正常的工作负载。
  • 可扩展性: Kafka 用户对可用性和性能会有不同的需求,还可能使用各种不同的部署工具、管理端点和度量指标收集机制。Cruise Control 必须能够满足用户定义的各种目标,并执行用户定义的操作。
  • 通用性:尽管很多现有的产品可以用于均衡集群的资源,但它们大部分都与应用程序毫无关联,需要通过迁移整个应用进程来恢复均衡。这类产品对于无状态的系统来说是没有问题的,但对于有状态的系统来说就会显得有点力不从心,因为这类系统的很多状态与应用进程相关联。因此,我们希望 Cruise Control 会是一个能够了解应用程序的通用性框架,在恢复均衡时只需要进行一小部分状态迁移。

Cruise Control 在 LinkedIn 的应用

Cruise Control 在 LinkedIn 主要解决以下几个问题。

  1. 保证 Kafka 集群资源的均衡:磁盘、网络和 CPU。
  2. 如果有 broker 崩溃,自动将副本重新分配给其他 broker,并重置复制系数。
  3. 识别出消耗资源最多的主题分区。
  4. 在扩展集群或 broker 退役时只需要少量的人工介入。
  5. 支持异构的 Kafka 集群以及单台主机部署多个 broker 实例。

Cruise Control 的工作原理

Cruise Control 遵循的是“监控——分析——行动”这样的工作流程。下图是 Cruise Control 的架构图。大部分组件都是可插拔的,如度量指标取样器(metric sampler)、分析器(analyzer)等。

REST API

Cruise Control 为用户提供了一组 REST API,可以用于查询 Kafka 集群的工作负载情况或触发管理操作。

负载监控器

负载监控器从集群收集 Kafka 的度量指标和每个分区的资源度量指标,并生成集群工作负载模型,包括磁盘使用情况、CPU 使用情况、流量流入速率、流量流出速率等,然后把模型发送给探测器和分析器。

分析器

分析器是 Cruise Control 的“大脑”,它根据用户提供的优化目标和来自负载监控器的工作负载模型来生成优化计划。用户可以配置优化计划的优先级,还可以分别设定硬性目标和软性目标。硬性目标是指必须达成的目标(例如必须根据机架来分配副本的位置),软性目标是指在优先满足硬性目标的前提下有可能得不到满足的目标。

硬性目标

  1. 根据机架来安排副本的位置,即同一个分区的副本必须被放在不同的机架上,这样可以减少硬件崩溃给 Kafka 集群带来不利的影响。
  2. broker 的资源使用必须处在预定义的阈值内。
  3. 网络使用不能超过预定义的容量。如果一个 broker 的所有副本都成为首领,那么所有的消费者流量都会被重定向到这个 broker 上,导致网络流量膨胀。

软性目标

  1. 让集群所有的 broker 使用相同的资源。
  2. 让所有 broker 的首领分区达到相同的流量流入速率。
  3. 让主题的分区均匀地分布在所有 broker 上。
  4. 在所有 broker 上均匀地分布分区副本。

探测器

探测器主要用于探测两种类型的异常。

  1. broker 失效:比如一个非空闲的 broker 离开集群,导致分区不同步。因为这种情况在集群正常重置时也会发生,所以探测器在触发告警之前会预留一段时间,如果不是正常重置,就会触发告警并进行修复。
  2. 偏离目标:如果启用了自愈功能,Cruise Control 会尝试通过分析工作负载并执行优化计划解决问题。

执行器

执行器负责执行由分析器生成的优化计划。Kafka 集群的再均衡通常会涉及重新分配分区,执行器要对资源保持感知,避免拖垮 broker。分区重分配可能需要很长时间,一个大型的集群可能需要几天时间才能完成一次分区重分配。有时候,用户希望能够停止正在进行的分区重分配,所以执行器需要确保能够安全地中断执行计划。

有趣的挑战

在开发和使用 Cruise Control 时,我们遇到了很多有意思的挑战。

为 Kafka 构建可靠的集群工作负载模型

这个比看上去的要难得多,需要考虑到很多细节。例如,从 broker 上收集 CPU 度量指标是很容易的,但我们该如何量化每个分区的 CPU 使用情况?这个 Wiki 页对这个问题进行了解释。

你们愿意花多少时间在一个优化计划上?

分析器组件经历了一个漫长的演化过程。我们最开始使用了一个具有复杂配置功能的通用优化器,它需要几周的时间才能得到一个中型 Kafka 集群的优化计划。后来,我们改用现在的优化器,可以在几分钟之内得到一个较好的结果。

内存与速度的权衡

Cruise Control 是一个内存密集型的应用,因为它需要在内存里保存度量指标一段时间,以便分析流量模式。同时,它也是一个 CPU 密集型的应用,因为它需要大量的计算来生成优化计划。这两者之间存在冲突关系。为了加快生成优化计划,我们需要缓存更多的数据,进行更多的并行计算,但这样会使用更多的内存。我们需要在这两者之间做出权衡。例如,我们会预计算优化计划并缓存起来,当用户发起查询时就不需要等待那么长时间。另外,我们会交错执行内存密集型的任务,避免同时消耗大量内存。

未来的工作

更多的集群优化目标

Cruise Control 的优化组件是可插拔的,用户有可能会根据实际需要提出各种复杂的优化目标。作为一个开源项目,我们鼓励用户创建自己的优化目标,并把它们贡献给社区。

与云管理系统集成

目前,Cruise Control 通过移动失效 broker 的分区让集群保持正常运行。我们希望后续能够与云管理系统集成起来,实现自动集群扩展,或者使用空闲实例替换失效的 broker 实例。

增强运维洞见

Cruise Control 分析从 Kafka 收集而来的度量指标,帮助 SRE 团队量化各种资源度量指标的影响程度,提升容量规划和性能调优的能力。

通用性

我们在开发 Cruise Control 时就意识到动态负载均衡器对于分布式系统来说是非常重要的。用于聚合度量指标、分析资源使用情况、生成优化计划的 Cruise Control 组件同样适用于其他分布式系统。从长远来看,我们想把这些核心组件抽象出来,用在其他的项目上。

查看英文原文: Open Sourcing Kafka Cruise Control


感谢蔡芳芳对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-09-03 19:004944

评论

发布
暂无评论
发现更多内容

【Flutter 专题】28 易忽略的【小而巧】的技术点汇总 (五)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

Python代码阅读(第38篇):根据谓词函数和属性字符串构造判断函数

Felix

Python 编程 Code Programing 阅读代码

无处不在的Kubernetes ,难用的问题解决了吗?

望宸

容器 云原生 PaaS KubeVela kubenetes

架构设计系列五 如何设计业务高性能高可用计算架构

nydia

Apache APISIX 社区周报 | 2021 9.13-9.30

API7.ai 技术团队

开源社区 api 网关 社区周报 Apache APISIX

Vue进阶(幺叁捌):vue 路由传参的几种基本方式

No Silver Bullet

Vue 路由 10月月更

java springboot自习室选座预约小程序源码

清风

计算机毕业设计

技术干货 | jsAPI 方式下的导航栏的动态化修改

蚂蚁集团移动开发平台 mPaaS

容器 大前端 移动开发 mPaaS 动态化

产业互联网下半场,SaaS平台的机遇与挑战

雯雯写代码

SaaS

开源许可协议介绍

webrtc developer

10 月 30 日 北京 LiveVideoStack 阿里云视频云专场限量赠票 100 张

阿里云CloudImagine

阿里云 音视频 高清视频 视频编解码 视频云

架构实战营模块五作业 - 设计微博系统中”微博评论“的高性能高可用计算架构

李焕之

新书榜第一的《图解产品》,帮助内卷中的产品经理实现跨越式发展!

博文视点Broadview

【万字长文】吃透负载均衡

Java 负载均衡 架构 面试 后端

这篇 python 文章,是过去你错过的 python 细节知识点,滚雪球第4季第15篇

梦想橡皮擦

10月月更

官方线索|2021科大讯飞全球开发者大会

搬砖人

AI 大会 1024我在现场

☕【Java技术指南】「技术盲区」看看线程以及线程池的异常处理机制都有哪些?

码界西柚

Java 线上程序问题 线程异常 10月月更

看动画学算法之:平衡二叉搜索树AVL Tree

程序那些事

数据结构 算法 二叉树 程序那些事

Apache APISIX 社区新里程碑——全球贡献者突破 300 位!

API7.ai 技术团队

开源社区 API网关 Apache APISIX

iOS签名校验那些事儿

百度Geek说

后端

秀到飞起!Alibaba全新出品JDK源码学习指南(终极版)限时开源

收到请回复

Java jdk 面试

基于HarmonyOS分布式技术,这群学生赋予冰箱更智能的体验

科技汇

云小课丨SA基线检查:给云服务来一次全面“体检”

华为云开发者联盟

态势感知 华为云 基线检查 SA 上云合规

阿里开源的这个库,让 Excel 导出不再复杂(填充模板的使用指南)

看山

Java EasyExcel 10月月更

这几种Java异常处理方法,你会吗?

华为云开发者联盟

Java 数组 异常 程序

华为云企业级Redis:助力VMALL打造先进特征平台

华为云开发者联盟

华为云 云数据库 GaussDB(for Redis) 华为商城 VMALL

怎样才能画出清晰明了的时序图

华为云开发者联盟

接口 模型 UML 系统 时序图

【LeetCode】外观数列Java题解

Albert

算法 LeetCode 10月月更

Apache APISIX 社区成员助力 openEuler 发布第一个社区创新版

API7.ai 技术团队

开源 openresty openEuler api 网关 Apache APISIX

腾讯云,五轮面试,六个小时,灵魂拷问,含泪拿下 60W offer

收到请回复

Java 面试 大厂Offer

阿里大牛珍藏版:高并发系统设计(全彩版手册)带你从基础走向实战

Java 架构 面试 后端 高并发

LinkedIn开源Cruise Control:一个Kafka集群自动化运维新利器_语言 & 开发_Jiangjie Qin_InfoQ精选文章