热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

kafka集群扩容后的数据均衡

戳原文,更有料!

点击上方蓝字“极客运维”一起运筹帷幄

kafka 集群扩容后的数据均衡

生产环境的 kafka 集群扩容,是一个比较常见的需求和操作。然而 kafka 在新增节点后并不会像 elasticsearch 那样感知到新节点加入后,自动将数据 reblance 到整个新集群中,因此这个过程需要我们手动分配。

分区重分配方案

扩容后的数据均衡,其本质就是对 topic 进行分区重分配,数据迁移的过程。在执行分区重分配的过程中,对集群的影响主要有两点:

  1. 分区重分配主要是对 topic 数据进行 Broker 间的迁移,因此会占用集群的带宽资源;
  2. 分区重分配会改变分区 Leader 所在的 Broker ,因此会影响客户端。

针对以上两点,第一点可以在晚间业务低峰时操作,必要时还可以和业务沟通,临时缩短数据保存时间,加快迁移,减少带宽影响时间。针对第二点,有两个方案:

  1. 整个分配方案分成两个步骤:1)手动生成分配方案,原有分区 Leader 位置不改变,只对副本进行分区重分配;2)等待数据迁移完成后,再手动更改分区分配方案,目的是均衡 Leader
  2. 直接用 Kafka 官方提供的分区重新分配 工具 生成分区重分配方案,直接执行分区重分配。

重分配方案分析

方案一

方案一理论对客户端影响最小,把整个分配方案分成了两个步骤,也就是将对集群的带宽资源与客户端的影响分开了,对过程可控性很高。

但问题是,如果集群中的某些 topic ,比如有 64 个分区,3 副本,共 192 个副本,就需要在保持原有分区 Leader 位置不变的情况下,手动均衡其余副本,这个人工步骤过度繁杂,稍微有一点偏差,就会造成副本不均衡。

方案二

针对方案二我特意去看了分区重分配的源码,并对其过程进一步分析。发现分区重分配的步骤是,将分区原有的副本与新分配的副本合并成一个新的副本集合,新分配的副本努力追上 Leaderoffset ,最终加入 ISR 。待全部副本都加入 ISR 之后,就会进行分区 Leader 选举,选举完后删除原有副本。

这里注意,由于是最后选举完成才删除原副本,所以重分配的过程中,日志存储量是会大幅增加的。具体细节我后续单独写一篇文章叙述。

根据以上分析,意味着在数据进行重分配过程中, Leader 并没有发生变动,所以客户端不会阻塞,数据迁移完成后进行 Leader 选举时发生变更,生产者会及时拉取最新的元数据,并重新进行消息发送,影响并不大。

重分配步骤

其实官方文档关于集群扩容讲解很详细:Expanding your cluster ,整个过程分为三个步骤:获取 kafka 给出的建议分配方案、按照给出的分配方案执行分配、查看分配的进度以及状态。这三个步骤对应了 kafka 脚本提供的三个 partition reassigment 工具。

--generate: 在此模式下,给定一个 topic 列表和一个 broker 列表,该工具会生成一个候选重新分配,以将指定的 topic 的所有分区移动到新的broker。此选项仅提供了一种便捷的方式,可以根据 tpoc 和目标 broker 列表生成分区重新分配计划。
--execute: 在此模式下,该工具基于用户提供的重新分配计划启动分区重新分配。(使用--reassignment-json-file选项)。这可以是由管理员制作的自定义重新分配计划,也可以是使用--generate选项提供的自定义重新分配计划。
--verify: 在此模式下,该工具将验证最近用 --execute 模式执行间的所有分区的重新分配状态。状态可以是成功完成,失败或正在进行。
  1. 生成需要执行分区重分配的 topic 列表 json 文件:

    > cat topics-to-move.json
    {"topics": [{"topic": "foo1"},
               {"topic": "foo2"}],
    "version":1
    }
    
  2. 使用 kafka-reassign-partitions.sh 脚本获取分配方案:

    > bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --topics-to-move-json-file topics-to-move.json --broker-list "5,6" --generate
    当前分区副本分配
     {"version":1,
    "partitions":[{"topic":"foo1","partition":2,"replicas":[1,2]},
                  {"topic":"foo1","partition":0,"replicas":[3,4]},
                  {"topic":"foo2","partition":2,"replicas":[1,2]},
                  {"topic":"foo2","partition":0,"replicas":[3,4]},
                  {"topic":"foo1","partition":1,"replicas":[2,3]},
                  {"topic":"foo2","partition":1,"replicas":[2,3]}]
    }
    
    建议的分区重新分配配置
    {"version":1,
    "partitions":[{"topic":"foo1","partition":2,"replicas":[5,6]},
                  {"topic":"foo1","partition":0,"replicas":[5,6]},
                  {"topic":"foo2","partition":2,"replicas":[5,6]},
                  {"topic":"foo2","partition":0,"replicas":[5,6]},
                  {"topic":"foo1","partition":1,"replicas":[5,6]},
                  {"topic":"foo2","partition":1,"replicas":[5,6]}]
    }
    

    保存当前分区副本分配情况,用作回滚操作用。保存建议的分区重新分配配置到 expand-cluster-reassignment.json 用于执行迁移。

  3. 执行重分配,并验证。

    > bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file expand-cluster-reassignment.json --execute
    
    > bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file expand-cluster-reassignment.json --verify
    Status of partition reassignment:
    Reassignment of partition [foo1,0] completed successfully
    Reassignment of partition [foo1,1] is in progress
    Reassignment of partition [foo1,2] is in progress
    Reassignment of partition [foo2,0] completed successfully
    Reassignment of partition [foo2,1] completed successfully
    Reassignment of partition [foo2,2] completed successfully
    

    is still in progress 表示还在处理中,全部迁移成功后每个 partition 都会显示 completed successfully 。注意如果 topic 数据量大,这个过程可能会很长,在此期间不要进行敏感操作,可能会导致数据不一致。

自定义重分配

分区重新分配工具还可以将分区的副本移动到指定的一组 broker 。只需自定义修改分配配置文件,后续步骤同上。

例如,以下示例将 topic foo1 的分区 0 移到 broker 5,6 中和将 topic foo2 的分区 1 移到 broker 2,3 中:

> cat custom-reassignment.json
{
    "version": 1,
    "partitions": [
        {
            "topic": "foo1",
            "partition": 0,
            "replicas": [
                5,
                6
            ]
        },
        {
            "topic": "foo2",
            "partition": 1,
            "replicas": [
                2,
                3
            ]
        }
    ]
}


推荐阅读
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 如果程序使用Go语言编写并涉及单向或双向TLS认证,可能会遭受CPU拒绝服务攻击(DoS)。本文深入分析了CVE-2018-16875漏洞,探讨其成因、影响及防范措施,为开发者提供全面的安全指导。 ... [详细]
  • 利用Jenkins与SonarQube集成实现高效代码质量检测与优化
    本文探讨了通过在 Jenkins 多分支流水线中集成 SonarQube,实现高效且自动化的代码质量检测与优化方法。该方案不仅提高了开发团队的代码审查效率,还确保了软件项目的持续高质量交付。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 本文详细探讨了MySQL数据库实例化参数的优化方法及其在实例查询中的应用。通过具体的源代码示例,介绍了如何高效地配置和查询MySQL实例,为开发者提供了有价值的参考和实践指导。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 在搭建Hadoop集群以处理大规模数据存储和频繁读取需求的过程中,经常会遇到各种配置难题。本文总结了作者在实际部署中遇到的典型问题,并提供了详细的解决方案,帮助读者避免常见的配置陷阱。通过这些经验分享,希望读者能够更加顺利地完成Hadoop集群的搭建和配置。 ... [详细]
  • 本文整理了Java中org.apache.hadoop.io.ByteWritable.<init>()方法的一些代码示例,展示了ByteWri ... [详细]
  • 第十三章go实现分布式网络爬虫单机版爬虫
     网络爬虫分为两类1.通用爬虫:类似于baidu,google.他们会把大量的数据挖下来,保存到自己的服务器上.用户打开跳转的时候,其实先是跳转到他们自己的服务器. 2.聚焦爬虫: ... [详细]
author-avatar
牛哥粉丝_对白
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有