文章目录

  • cruise-control介绍
    • 什么是cruise control
      • 特性
    • 为什么是cruise control——动态负载均衡的复杂性
  • 基本设计
    • 负载均衡目标
      • 单个目标副本列表的生成与过滤
      • 各个目标对应的副本迁移类型
    • 系统设计和架构
  • cruise-control源码解析
    • 客户端-CruiseControlMetricsReporter
    • 服务端-Monitor
      • 负载指标的生成&加载过程
      • 负载均衡过程
      • 指标聚合
  • 附录

cruise-control介绍

什么是cruise control

资源的动态负载均衡

  • CPU
  • 磁盘使用率
  • 入流量
  • 出流量

失败检测与自修复

  • 重新分配副本到死亡broker上
  • 减少副本不足的窗口

添加/撤销一个broker

特性

  • 持续平衡Kafka集群的磁盘、网络和CPU利用率;
  • 当broker崩溃时,自动将这台broker上的副本重新分配到其他broker上,并还原原始复制因子;
  • 确定消耗集群资源最多的主题分区;
  • 支持一键式集群扩展和broker下线;
  • 支持异构Kafka集群和单机多broker;

为什么是cruise control——动态负载均衡的复杂性

考虑下面情况

2000  Topics
16000 partitions
32000 replicas(RF=2)

每个副本有一个清晰的负载资料

CPU (Leader > Follower)
Disk utilization (Leader = Follower)
Network Inbound (Leader = Follower)
Network Outbound (Follower = 0)

每个指标都有多个值进行分析:流量模式各不相同;足够长的观察期
更多需要考虑的事情

所有分区在不同broker之间的分布
考虑机架
一台机器挂掉之后其他机器的负载情况

进行分区的重新分配很困难

不能影响正常流量
可能需要中断

大量副本
多资源负载均衡
附加限制条件
两种均衡方法

Leadership movement(cheap)
Replica movement(expensive)
  • 总结
    使用负载均衡前,单个资源组(1000个分区)均衡计划的生成需要300+min
    使用负载均衡后,单个资源组(1000个分区)均衡计划的生成需要1~2min

基本设计

负载均衡目标





机架目标(Hard Goal)

RackAwareGoal: 相同分区的副本必须在不同机架上

RackAwareDistributionGoal: 保证副本均衡分散在机架上

资源使用阈值目标CapacityGoal(Hard Goal)

一台broker的每一个资源(CPU、Disk、NetWorkIn、NetWorkOut)利用率都应该在预定义的阈值之下

**CpuCapacityGoal **
**DiskCapacityGoal **
**NetworkInboundCapacityGoal **
**NetworkOutboundCapacityGoal **

资源利用率均衡目标ResourceDistributionGoal(Soft Goal)

一台broker的每个资源的利用率与每个资源的平均利用率之间不能相差x%
Topic分区分布目标(Soft Goal)
每个topic的分区应该尽可能分布在不同broker上

CpuUsageDistributionGoal
DiskUsageDistributionGoal
NetworkInboundUsageDistributionGoal
NetworkOutboundUsageDistributionGoal

全局分区分布目标(Soft Goal)

?
每一个目标都有优先级
用一个唯一整数来代替
确定令人满意的顺序

单个目标副本列表的生成与过滤

每个目标在计算均衡计划之前会对每个broker的副本列表按照目标维度(比如cpu、disk、netIn等)进行排序/其他处理(比如过滤topic等)

CapacityGoal:

CpuCapacityGoal-REVERSE-LEADER、CpuCapacityGoal-REVERSE
DiskCapacityGoal-REVERSE-LEADER、DiskCapacityGoal-REVERSE
NetworkInboundCapacityGoal-REVERSE-LEADER、NetworkInboundCapacityGoal-REVERSE
NetworkOutboundCapacityGoal-REVERSE-LEADER、NetworkOutboundCapacityGoal-REVERSE

GroupAwareGoal: GroupAwareGoal
RackAwareGoal: RackAwareGoal
ReplicaCapacityGoal: ReplicaCapacityGoal

各个目标对应的副本迁移类型

CapacityGoal:

LEADERSHIP_MOVEMENT、INTER_BROKER_REPLICA_MOVEMENT

GroupAwareGoal:

INTER_BROKER_REPLICA_MOVEMENT

RackAwareGoal:

INTER_BROKER_REPLICA_MOVEMENT

ReplicaCapacityGoal:

INTER_BROKER_REPLICA_MOVEMENT

系统设计和架构

Cruise control架构示意图

副本负载模型

CPU利用率:从总的CPU利用率派生而来((Partition_Bytes_in / Total_Bytes_In) * CPU_UTIL)
Disk利用率:分区大小(最近的)
网络入流量:Kafka metrics
网络出流量:Kafka metrics

负载快照

代表一个定义窗口的平均负载;
对于每一个分区保存最近N个快照;
对于每个负载快照进行多次负载取样;
不可用的取样导致非法的负载快照;
根据配置可以决定指标取样的窗口的大小以及训练时所需合法取样窗口的

只采取可信的执行计划

没有足够合法的负载快照的分区 排除在外;
有分区被排除了的topic 排除在外;
停止分析如果太多的topic 被排除在外;

cruise-control源码解析

客户端-CruiseControlMetricsReporter

服务端-Monitor

// LoadMonitorTaskRunner.java
// NOT_STARTED -> RUNNING// SamplingTask(采样任务)
// RUNNING -> SAMPLING
// SAMPLING -> RUNNINGpublic enum LoadMonitorTaskRunnerState {NOT_STARTED, RUNNING, PAUSED, SAMPLING, BOOTSTRAPPING, TRAINING, LOADING}

负载指标的生成&加载过程

源码分析示意图

cruise-control服务端对于负载指标的处理分为两部分:

  1. 负载指标的生成——SamplingTask任务负责(定时任务)

SamplingTask从__CruiseControlMetrics topic中获取原生负载指标(topic/cpu/disk);
通过相应的计算加工为每个partition/broker生成sample指标对象,并将其集合封装仅MetricsSampler.Samples中;
对封装好的MetricsSampler.Samples做聚合处理并写入目标topic __KafkaCruiseControlModelTrainingSamples|__KafkaCruiseControlPartitionMetricSamples

  1. 负载指标的获取——SampleLoadingTask任务负责
    根据配置创建对应topic的消费者,并消费已经处理好的指标数据
Cruise Control使用Kafka存储和检索其指标,该指标由Metric Fetcher读取。
在负载监视器中,Metric Fetcher Manager负责协调所有采样任务:Metric采样任务,Bootstrap任务和线性模型训练任务。
每个采样任务都由配置数量的Metric Fetcher线程执行。每个Metric Fetcher线程使用一个可插入的Metric Sampler来获取样本。每个Metric Fetcher都在集群中分配了几个分区以获取样本。指标标准样本由指标标准样本聚合器组织,该指标标准聚合器根据指标标准样本的时间戳将每个指标标准样本放入工作负载快照中。
集群工作负载模型是负载监视器的主要输出。集群工作负载模型反映了集群的当前副本分配,并提供了移动分区或副本的接口。分析器使用这些接口来生成优化解决方案。
样本存储区存储指标标准和训练样本以供将来使用。
借助指标标准采样器,您可以将Cruise Control部署到各种环境并与现有的指标标准系统一起使用。
在Cloudera环境中使用Cruise Control时,将 HttpMetricsReporter 指标报告给Cloudera Manager时间序列数据库。结果,可以使用Cloudera Manager读取Kafka指标。

负载均衡过程

源码分析示意图

cruise-control服务端对于负载均衡过程的处理分为三部分:

  1. 指标模型加载——KafkaCruiseControl先通过LoadMonitor加载cluster model

LoadMonitor首先会分别对partition和broker指标进行聚合操作;
LoadMonitor调用MonitorUtils工具类结合指标聚合结果生成最终cluster model并返回;

  1. 目标优化分析——KafkaCruiseControl将得到的cluster model传递给GoalOptimizer进行优化分析

GoalOptimizer按照goals -> brokers -> replicas的层级结构逐层下探,最终在replica层面上计算当前目标下的replica均衡计划并更改clusterModel中对应分区的分布(将违背目标的replica移动到最空闲的broker上)。经历过所有goals -> brokers -> replicas的分析、clusterModel更新后,结合分析、clusterModel更新之前就保存下来的副本、leader分布,最终得到均衡计划,比如下面这样:

{"proposal": {"oldReplicas": [1000005,1000006],"topicPartition": {"hash": -2051444043,"partition": 37,"topic": "cruise-control-test3"},"newReplicas": [1000003,1000002],"oldLeader": 1000005}
}
  1. 目标均衡计划执行——KafkaCruiseControl将得到的均衡计划提交给线程,最终由Executor执行均衡计划

指标聚合

源码分析示意图

指标聚合简介

  1. 从__KafkaCruiseControlPartitionMetricSamples获取到指标,对每个窗口的若干个采样做聚合操作(累加/均值、最大值、最新值)
  2. 按照指标类型对聚合的指标分类,每个指标类型会有多个窗口,每个窗口的值就是上面聚合操作得来的

最终效果示意图:

附录

  • 参考文章
  1. linkedIn/cruise-control
  2. Introduction to Kafka Cruise Control
  3. Cloudera Cruise Control REST API Reference
  4. Kafka集群管理工具介绍
  5. cruise-control-for-cluster-rebalancing
  6. kafka自带测试脚本-压力测试

深入理解Kafka cruise control相关推荐

  1. Linkedin Cruise Control安装

    为什么80%的码农都做不了架构师?>>>    背景 一直在寻找开源好用的kafka管理平台,也一直没找到,从第一次用kafka到现在差不多快四年了,0.8和0.8之后的管理方式有些 ...

  2. Cruise Control

    Cruise Control 使用报告 1.       Cruise Control 介绍 Cruise Control 是一种持续集成过程的框架,包括了邮件通知,ant 和各种源码控制工具的插件, ...

  3. 《深入理解Kafka:核心设计与实践原理》笔误及改进记录

    2019年2月下旬笔者的有一本新书--<深入理解Kafka:核心设计与实践原理>上架,延续上一本<RabbitMQ实战指南>的惯例,本篇博文用来记录现在发现的一些笔误,一是给购 ...

  4. 新书《深入理解Kafka:核心设计与实践原理》上架,感谢支持~

    新书上架 初识 Kafka 时,笔者接触的还是 0.8.1 版本,Kafka 发展到目前的 2.x 版本,笔者也见证了Kafka的蜕变,比如旧版客户端的淘汰.新版客户端的设计.Kafka 控制器的迭代 ...

  5. Kafka科普系列 | 轻松理解Kafka中的延时操作

    欢迎跳转到本文的原文链接:https://honeypps.com/mq/kafka-basic-knowledge-of-delay-operation/ 本文起源于之前去面试的一道面试题,面试题大 ...

  6. 取本地数据_深入理解Kafka服务端之Follower副本如何同步Leader副本的数据

    一.场景分析Kafka采用的是主写主读的方式,即客户端的读写请求都由分区的Leader副本处理,那么Follower副本要想保证和Leader副本数据一致,就需要不断地从Leader副本拉取消息来进行 ...

  7. 深入理解kafka_深入理解Kafka随书代码示例已整理完毕,附地址~

    <深入理解Kafka>中大多都是以文字或者图片的形式来陈述,但是书中也有一些示例代码,尤其在书本的前1/3部分,为了让Kafka新手能够适应,会有些许demo呈现. 其实在写这本书的时候, ...

  8. 一文理解kafka端到端的延迟

    前言: 在大规模的使用kafka过程中,我们通常会遇到各种各样的问题,比如说,通常会有一些大数据集群中的Job发现总有几个task会比较慢,导致整体的任务迟迟不能完成运行,这种情况通常问题会比较复杂, ...

  9. Kafka系列之:深入理解Kafka 主题、分区、副本、LEO、ISR、HW、Kafka的主写主读和分区leader选举

    Kafka系列之:深入理解Kafka 主题.分区.副本.LEO.ISR.HW.Kafka的主写主读和分区leader选举 一.Kafka重要知识点提炼 二.详细介绍Kafka 主题.分区.副本.LEO ...

  10. 深入理解Kafka核心设计与实践原理_01

    深入理解Kafka核心设计与实践原理_01 01_初识Kafka 1.1 基本概念 1.2 安装与配置 1.3 生产与消费 1.4 服务端参数配置 01_初识Kafka 1.1 基本概念 一个典型的 ...

最新文章

  1. python 模拟HTTP服务端
  2. Linux上java进程的查看和终止
  3. mysqli 启动出错
  4. Angular Web App部署Ubuntu Nginx
  5. Java工作笔记-IntelliJ IDEA中高效文件切换跳转
  6. DirectX - dds图片格式(DDSURFACEDESC2)
  7. 使用Maven自动部署Java Web项目到Tomcat问题小记
  8. 三、 redis进阶篇
  9. 《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——01-05 基本职能:老鸟也曾是菜鸟...
  10. mybatis中$和#号的区别
  11. java多线程编程核心技术 2
  12. 贪吃蛇游戏C语言源代码学习
  13. Ubuntu系统下搭建C/C++ gcc开发环境
  14. python这个单词的含义是什么_python style是什么意思
  15. 录屏软件 OBS 入门笔记
  16. JDBC与ORM发展与联系 JDBC简介(九)
  17. 全球十大富豪的奢侈座驾
  18. 手动清除网卡IP的Linux命令
  19. 实时时钟模块RX-8010SJ
  20. 大学生python期末解答题_大学mooc2020年用Python玩转数据期末考试大全答案

热门文章

  1. proteus中的标签及总线的使用方法
  2. 【java学习】多线程之高并发编程
  3. 基于Labview的简易计算器设计
  4. 上计算机课没有签到肿么办,钉钉教学直播如何课前签到 钉钉直播如何提醒未签到的学生...
  5. 调试错误,请回到请求来源地,重新发起请求。 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足,建议在开发者中心检查对应功能是否已经添加
  6. 4x4矩阵键盘扫描c语言程序,4x4矩阵键盘工作原理及扫描程序
  7. LED的基本操作(138译码器 573锁存器)
  8. ClearCase 介绍
  9. 4k微型计算机接口,单片微型计算机原理与接口技术:基于STC15W4K32S4单片机
  10. 利用python从《牛津高阶英汉词典》里提取单词列表