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

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主要解决以下几个问题。

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

Cruise Control的工作原理

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

  REST API

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

负载监控器

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

分析器

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

硬性目标

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

软性目标

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

探测器

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

broker失效:比如一个非空闲的broker离开集群,导致分区不同步。因为这种情况在集群正常重置时也会发生,所以探测器在触发告警之前会预留一段时间,如果不是正常重置,就会触发告警并进行修复。偏离目标:如果启用了自愈功能,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组件同样适用于其他分布式系统。从长远来看,我们想把这些核心组件抽象出来,用在其他的项目上。

本文转自d1net(转载)

时间: 2024-10-22 01:20:33

LinkedIn开源Cruise Control:一个Kafka集群自动化运维新利器的相关文章

如何为Kafka集群选择合适的Partitions数量

如何为Kafka集群选择合适的Partitions数量 Hadoop技术博文 这是许多kafka使用者经常会问到的一个问题.本文的目的是介绍与本问题相关的一些重要决策因素,并提供一些简单的计算公式. 文章目录 1 越多的分区可以提供更高的吞吐量 2 越多的分区需要打开更多地文件句柄 3 更多地分区会导致更高的不可用性 4 越多的分区可能增加端对端的延迟 5 越多的partition意味着需要客户端需要更多的内存 6 总结   越多的分区可以提供更高的吞吐量 首先我们需要明白以下事实:在kafka

Kafka详解二、如何配置Kafka集群

Kafka集群配置比较简单,为了更好的让大家理解,在这里要分别介绍下面三种配置 单节点:一个broker的集群 单节点:多个broker的集群 多节点:多broker集群 一.单节点单broker实例的配置 1. 首先启动zookeeper服务      Kafka本身提供了启动zookeeper的脚本(在kafka/bin/目录下)和zookeeper配置文件(在kafka/config/目录下),首先进入Kafka的主目录(可通过 whereis kafka命令查找到):      [roo

kafka集群部署

前提:kafka集群依赖于zk集群,没有zk集群环境的请先参考 http://www.cnblogs.com/yjmyzz/p/4587663.html . 假设搭建3个节点的kafka集群,下面是步骤:  一.下载 http://kafka.apache.org/downloads ,如果只是安装,直接down kafka_2.12-0.11.0.0.tgz 即可. 二.解压 假设$KAFKA_HOME为解压后的根目录,将tag包解压到该目录下(3台机器上都解压) 三.修改$KAFKA_HOM

部署kafka集群到服务器

前面文章写道的是伪集群的部署,是在同一台服务器部署了四个kafka broker 实际上没有任何的高HA作用.现在来部署一个真正的kafka集群 三台服务器,分别是106 107 108-现在已经部署的lafka在106上 -已经在106上启动了kafka服自带的zookeeper 编辑106服务器的kafka server.properties conf/server.properties 修改broker.id=0 修改listeners=PLAINTEXT://0.0.0.0:9092 修

Kafka集群配置

之前一篇博文简单讲述了zookeeper和kafka的单机配置,详细可以参考<Linux(CentOS)中常用软件安装,使用及异常--Zookeeper, Kafka>. 本文只要讲述Kafka集群的配置事项,包括zookeeper集群的配置.本文讲述的前提是kafka和zookeeper在单机情况下已正确安装和配置.如有疑问,可以参考<Linux(CentOS)中常用软件安装,使用及异常--Zookeeper, Kafka>. 假设集群中有三台机器, ip地址分别为: 10.10

Kafka集群磁盘使用率瞬超85%,幕后元凶竟是它?

Kafka是一种快速.可扩展的,设计内在就是分布式的.分区的和可复制的提交日志服务.作为一种高吞吐量的分布式发布订阅消息系统,Kafka被广泛的应用于海量日志的收集.存储.网上有大量Kafka架构.原理介绍的文章,本文不再重复赘述,重点谈谈Consumer Offset默认保存机制.   Topic作为一类消息的逻辑集合,Kafka集群为其维护了一个分区的日志,其结构如图:     Topic每个分区是一个有序的.信息不断追加的序列.分区中的每个消息都分配了一个连续的ID号,称为偏移量(offs

一脸懵逼学习KafKa集群的安装搭建--(一种高吞吐量的分布式发布订阅消息系统)

1:KafKa的官方网址:http://kafka.apache.org/ 开发流程图,如: 2:KafKa的基础知识: 2.1:kafka是一个分布式的消息缓存系统2.2:kafka集群中的服务器都叫做broker2.3:kafka有两类客户端,一类叫producer(消息生产者),一类叫做consumer(消息消费者),客户端和broker服务器之间采用tcp协议连接2.4:kafka中不同业务系统的消息可以通过topic进行区分,而且每一个消息topic都会被分区,以分担消息读写的负载2.

扩展-kafka集群 报错 在线等

问题描述 kafka集群 报错 在线等 WARN [Controller-1-to-broker-2-send-thread], Controller 1's connection to broker Node(2, mine-28, 9092) was unsuccessful (kafka.controller.RequestSendThread) java.io.IOException: Connection to Node(2, mine-28, 9092) failed at kafk

手把手教你用Docker部署一个MongoDB集群

本文讲的是手把手教你用Docker部署一个MongoDB集群,[编者的话]MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中最像关系数据库的.支持类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引.本文介绍了如何使用Docker搭建MongoDB集群. 本文我会向大家介绍如何使用Docker部署一个MongoDB集群,具体如下: 2.6.5版本的MongoDB 有3个节点的副本集(Replica set) 身份验证 持