【译】Apache Kafka支持单集群20万分区

  之前网上关于确定Kafka分区数的博客多多少少都源自于饶军大神的文章,如今他带来了这方面的第二篇文章,特此翻译一下,记录一下其中的要点。

  原贴地址: https://www.confluent.io/blog/apache-kafka-supports-200k-partitions-per-cluster



  Kafka中topic可以设置多个分区,而分区是最小的并行度单位。通常而言,分区数越多吞吐量也越高。但是依然有很多因素制约了一个Kafka集群所能支持的最大分区数。我现在高兴地宣布Kafka 1.1.0版本在这方面取得了重大的改进。目前生产环境中单Kafka集群支持的分区上限得到了极大的提升。

  为了便于理解这个改进是如何实现的,我们重温一下分区leader和controller的基本概念。首先,每个分区都可以配置多个副本用于实现高可用性以及持久性。其中的一个副本被指定为leader而所有client只与leader进行交互;其次,cluster中的某个broker被指定为controller来管理整个集群。若broker挂掉,controller负责为该broker上所有分区选举leader。

  默认情况下关闭Kafka broker执行的是一个受控关闭操作(下称controlled shutdown)。Controlled shutdown对client的影响是最小的。一个典型的controlled shutdown分为以下几步:1. 发送SIGTERM信号给待关闭的broker;2. Broker发送请求给controller表明自己要正常关闭;3. Controller变更该broker上所有分区的leader并将这部分数据保存回Zookeeper;4. Controller发送新的leader信息给其他broker;5. Controller发送响应给关闭中的broker表明操作成功,于是broker成功关闭。此时,client端不受任何影响因为新leader已经转移到其他broker上。下面的两张图描述了这个过程,注意到图中(4)和(5)步是可以并行执行的:

       

上图中步骤(1)发起broker关闭;步骤(2)发送controlled shutdown请求给controller;步骤(3)中controller写入新leader到Zookeeper;步骤(4)controller发送新leader信息到其他broker;步骤(5)controller发送成功信息给关闭中的broker

  在Kafka 1.1.0之前,一旦发起controlled shutdown,controller每次只能为一个分区选举leader。对于每个分区而言,controller顺序执行:选择新leader、同步写leader信息回Zookeeper以及同步leader信息给其他broker等操作。这种设计是低效率的:首先,同步写入Zookeeper就有很高的延时,从而整体拖慢controller shudown时间;其次,每次处理一个分区的做法导致需要给其他broker发送很多次请求,即使这些请求本身携带的数据量是很小的,从而最终导致对新leader的处理时间被极大地拉长。

  Kafka 1.1.0为controlled shutdown引入了多个方面的性能提升。第一个提升就是使用异步API来替代了之前的同步写入Zookeeper。在controlled shutdown过程中,Kafka不再是每次写入一个leader信息,等待其完成然后再写入下一个。相反地,controller使用异步API一次性地提交多个分区的leader到Zookeeper上,然后统一等待其执行完毕。这就等于在Kafka与Zookeeper之间构建了一种管道式请求处理流程,从而减少了整体的延时。第二个提升则是将于新leader的交互操作批量化。与其每次为一个分区发送RPC请求,controller使用单个RPC请求一次性地携带所有受影响分区的leader信息。

  同时,Kafka对于controller failover的时间也做了优化。当controller挂掉后,Kafka集群自动检测controller失败并选择其他broker作为新的controller。在开启controller工作之前,新选出的controller必须要从Zookeeper中加载所有分区的状态信息到内存中。如果controller直接崩溃的话,分区不可用的时间窗口将等同于Zookeeper会话超时时间加上controller状态加载时间,所以降低加载时间能够有效地帮助我们改善Kafka可用性。在1.1.0之前,加载操作使用的也是同步Zookeeper API。在1.1.0中被替换成了异步API。

  社区对controlled shutdown时间和加载时间都做了测试。每个测试都使用了5节点Zookeeper的集群。在测试controlled shutdown时,社区搭建了一个5节点broker的Kafka集群并为该集群创建了25000个单分区的topic,每个topic都是双副本,故每个broker上平均有10000个分区。之后测试controlled shutdown,测试结果如下:

  提升的很大一部分来自于修复了打日志(logging)的开销:之前在每个分区leader变更时都会记录集群中所有分区的数据——这实际上是没必要的。通过修复了这个logging的bug,controller shutdown从6.5分钟被压缩到30秒,而采用异步API更进一步地将其拉低到3秒。这些提升都极大地缩短了Kafka集群重启恢复的时间。

  在第二项测试中,社区同样搭建了一个5节点集群,只不过这次创建了2000个配置有50分区的topic,单副本——故总数是1000000个分区。当测试controller状态加载时间时发现比1.0.0有了100%的提升(1.0.0耗时28秒,1.1.0耗时14秒)。

  有了这些提升,Kafka单集群能够支持多少分区呢?确切的数字自然依赖于诸如可容忍的不可用窗口时间、Zookeeper延时、broker存储类型等因素。根据经验法则我们评估单台broker能够支撑的分区数可达4000个,而单集群能够支撑200000个分区。当然后者主要受限于集群对controller崩溃这种不常见情形的容忍度,另外其他影响分区数的因素也要考虑进来。

  1.1.0所做的改进仅仅是提升Kafka高扩展性的一小步。事实上社区在1.1.0版本还尝试了更多的分区并改进了它们的延时表现。后面可能会在另一篇文章中给出具体的说明。在未来,Kafka社区计划实现单集群支撑百万级分区的构想,所以,敬请期待~~

原文地址:https://www.cnblogs.com/huxi2b/p/9984523.html

时间: 2024-10-29 21:16:00

【译】Apache Kafka支持单集群20万分区的相关文章

消息订阅发布系统Apache Kafka分布式集群环境搭建和简单测试

一.什么是kafka? kafka是LinkedIn开发并开源的一个分布式MQ系统,现在是Apache的一个孵化项目.在它的主页描述kafka为一个高吞吐量的分布式(能将消息分散到不同的节点上)MQ.Kafka仅仅由7000行Scala编写,据了解,Kafka每秒可以生产约25万消息(50 MB),每秒处理55万消息(110 MB) 二.kafka的官方网站在哪里? http://kafka.apache.org/ 三.在哪里下载?需要哪些组件的支持? kafka2.9.2在下面的地址可以下载:

【译】调优Apache Kafka集群

今天带来一篇译文"调优Apache Kafka集群",里面有一些观点并无太多新颖之处,但总结得还算详细.该文从四个不同的目标出发给出了各自不同的参数配置,值得大家一读~ 原文地址请参考:https://www.confluent.io/blog/optimizing-apache-kafka-deployment/ ========================================== Apache Kafka是当前最好的企业级流式处理平台.把你的应用程序链接到Kafka

使用Scala开发Apache Kafka的TOP 20大好用实践

本文作者是一位软件工程师,他对20位开发人员和数据科学家使用Apache Kafka的方式进行了最大限度得深入研究,最终将生产实践环节需要注意的问题总结为本文所列的20条建议. Apache Kafka是一个广受欢迎的分布式流媒体平台,New Relic.Uber以及Square等数千家公司都在使用它构建可扩展.高吞吐量.可靠的实时流媒体系统.例如,New Relic的Kafka集群每秒处理超过1500万条消息,总数据速率接近1 Tbps. Kafka在应用程序开发人员和数据科学家中非常受欢迎,

Apache Kafka 在大型应用中的 20 项最佳实践

原标题:Kafka如何做到1秒处理1500万条消息? Apache Kafka 是一款流行的分布式数据流平台,它已经广泛地被诸如 New Relic(数据智能平台).Uber.Square(移动支付公司)等大型公司用来构建可扩展的.高吞吐量的.且高可靠的实时数据流系统. 例如,在 New Relic 的生产环境中,Kafka 群集每秒能够处理超过 1500 万条消息,而且其数据聚合率接近 1Tbps. 可见,Kafka 大幅简化了对于数据流的处理,因此它也获得了众多应用开发人员和数据管理专家的青

Apache httpd + tomcat 简单集群

集群其实很简单,我们就来说一下httpd+tomcat集群都要注意哪些部分: 首先使用的东西有 apache-tomcat-8.0.32      下载地址: http://tomcat.apache.org/download-80.cgi httpd-2.4.18-x86-vc11-r3/Apache24     下载地址:http://httpd.apache.org/download.cgi        http://apache.opencas.org//httpd/binaries/

实践部署与使用apache kafka框架技术博文资料汇总

前一篇Kafka框架设计来自英文原文(Kafka Architecture Design)的翻译及整理文章,很有借鉴性,本文是从一个企业使用Kafka框架的角度来记录及整理的Kafka框架的技术资料,也很有借鉴价值,为了便于阅读与分享,我将其整理一篇Blog.本文内容目录摘要如下: 1)apache kafka消息服务 2)kafka在zookeeper中存储结构 3)kafka log4j配置 4)kafka replication设计机制 5)apache kafka监控系列-监控指标 6)

Apache Kafka

简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交日志服务. Apache Kafka与传统消息系统相比,有以下不同: 它被设计为一个分布式系统,易于向外扩展: 它同时为发布和订阅提供高吞吐量: 它支持多订阅者,当失败时能自动平衡消费者: 它将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序. 本文我将重点介绍Apache Kaf

Apache kafka 工作原理介绍

消息队列 消息队列技术是分布式应用间交换信息的一种技术.消息队列可驻留在内存或磁盘上, 队列存储消息直到它们被应用程序读走.通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置.或在继续执行前不需要等待接收程序接收此消息.在分布式计算环境中,为了集成分布式应用,开发者需要对异构网络环境下的分布式应用提供有效的通信手段.为了管理需要共享的信息,对应用提供公共的信息交换机制是重要的.常用的消息队列技术是 Message Queue. Message Queue 的通讯模式 点对点通讯:点对

[kfaka] Apache Kafka:下一代分布式消息系统

简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交日志服务. Apache Kafka与传统消息系统相比,有以下不同: 它被设计为一个分布式系统,易于向外扩展: 它同时为发布和订阅提供高吞吐量: 它支持多订阅者,当失败时能自动平衡消费者: 它将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序. 本文我将重点介绍Apache Kaf