Kafka支持单集群20万分区
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社区计划实现单集群支撑百万级分区的构想,所以,敬请期待~~
Kafka支持单集群20万分区的更多相关文章
- 【译】Apache Kafka支持单集群20万分区
之前网上关于确定Kafka分区数的博客多多少少都源自于饶军大神的文章,如今他带来了这方面的第二篇文章,特此翻译一下,记录一下其中的要点. 原贴地址: https://www.confluent.io/ ...
- [转帖]单集群10万节点 走进腾讯云分布式调度系统VStation
单集群10万节点 走进腾讯云分布式调度系统VStation https://www.sohu.com/a/227223696_355140 2018-04-04 08:18 云计算并非无中生有的概念, ...
- [转帖]“腾百万”之后,腾讯的云操作系统VStation单集群调度达10万台
“腾百万”之后,腾讯的云操作系统VStation单集群调度达10万台 https://www.leiphone.com/news/201909/4BsKCJtvvUCEb66c.html 腾讯有超过1 ...
- 100+诡异的数据集,20万Eclipse Bug、死囚遗言等
摘要:近日,Robert Seaton整理了100多个最有趣的数据集,其中包括Jeopardy真题,死囚的最后一句话,20万个Eclipse Bug,足球比赛相关,柏拉图式的爱情,太阳系以外的行星,1 ...
- Python 基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控
基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控 By: 授客 QQ:1033553122 1.测试环境 python 3.4 zookeeper- ...
- ELK+zookeeper+kafka+rsyslog集群搭建
前言 环境困境: 1.开发人员无法登陆服务器 2.各系统都有日志,日志数据分散难以查找 3.日志数据量大,查询忙,不能实时 环境要求: 1.日志需要标准化 集群流程图: 角色: 软件: 以 ...
- 当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题?
作者 | 阿里云容器平台高级技术专家 曾凡松(逐灵) 本文主要介绍阿里巴巴在大规模生产环境中落地 Kubernetes 的过程中,在集群规模上遇到的典型问题以及对应的解决方案,内容包含对 etcd.k ...
- kafka高可用性集群
kafka集群并测试其高可用性 介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站 ...
- [转帖]当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题?
改天学习一下. https://www.cnblogs.com/alisystemsoftware/p/11570806.html 当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题 ...
随机推荐
- 有关 Table 获取Json 的解决方案
目录 写在前面 具体操作步骤 写在前面 在项目的开发过程中,我们使用最多的是表单的序列化.而有关以Table的序列化成Json的方法不太常见. 在做功能的时候发现,没有提交如何把Table序列化成Js ...
- Power BI连接Oracle的注意事项
开始 Power BI 连接Oracle需要安装对应位数的ODAC,这个过程中有几个点要注意. ODAC 12c.x 版本(32.64),在安装时要将GAC的勾搭上.否则打开Power BI时会提示找 ...
- 整理:C#常用字符串操作,常用数值类型转换
一.字符串操作 1. 字符串连接 //将指定的数组所有元素拼接为一个字符串 string[] arr = {"A","B","C"}; st ...
- 性能监控工具的配置及使用 - Spotlight On Oracle(oracle)
一. Spotlight On Oracle(oracle)1.1. 工具简介Spotlight是一个强有力的Oracle数据库实时性能诊断工具,提供了一个直观的.可视化的数据库活动展现.S ...
- moodle3.7上传中文文件,无法引用,图片不显示
初始安装moodle3.7 上传图片,名称为中文时,无法引用图片,图片不显示.这里采用修改moodle根目录下的config.php文件, 添加了变量$CFG->slasharguments = ...
- python 排序 归并排序
算法思想 迭代法: 归并算法一共有两种思想,笼统的说,这两种思想的区别就在于一种不分割未排序的序列(直接将序列看为n个个数为1的子序列),这种称为---迭代法 直接从队头开始,两两合并为一个个数为2的 ...
- Spring Cloud微服务架构升级总结
↵ [编者的话]微服务的概念源于 2014 年 3 月 Martin Fowler 所写的一篇文章“Microservices”.文中内容提到:微服务架构是一种架构模式,它提倡将单一应用程序划分成一组 ...
- EF自动创建数据库步骤之一(实体类写法)
文章演示使用EF自动创建数据库第一个步骤创建实体类. 一.创建表映射实体类 using System; using System.Collections.Generic; using System.C ...
- 第二篇Scrum冲刺博客
第二篇Scrum冲刺博客 一.站立式会议 提供当天站立式会议照片一张 二.每个人的工作 成员 已完成工作 明天计划完成的工作 遇到的困难 林剑峰 初步学习小程序的编写.博客园的撰写 初步完成用户界面 ...
- Django框架(十四)-- forms组件、局部钩子、全局钩子
一.什么是forms组件 forms组件就是一个类,可以检测前端传来的数据,是否合法. 例如,前端传来的邮箱数据,判断邮件格式对不对,用户名中不能以什么开头,等等 二.forms组件的使用 1.使用语 ...