热门标签 | 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
            ]
        }
    ]
}


推荐阅读
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 在安装并配置了Elasticsearch后,我在尝试通过GET /_nodes请求获取节点信息时遇到了问题,收到了错误消息。为了确保请求的正确性和安全性,我需要进一步排查配置和网络设置,以确保Elasticsearch集群能够正常响应。此外,还需要检查安全设置,如防火墙规则和认证机制,以防止未经授权的访问。 ... [详细]
  • 解决宝塔面板Nginx反向代理缓存问题
    本文介绍如何在宝塔控制面板中通过编辑Nginx配置文件来解决反向代理中的缓存问题,确保每次请求都能从服务器获取最新的数据。 ... [详细]
  • Python脚本实现批量删除多种类型文件的扩展名
    本文介绍了一个Python脚本,用于批量处理并移除指定目录下不同格式文件(如png、jpg、xml、json、txt、gt等)的文件扩展名。该方法通过递归遍历文件夹中的所有文件,并对每个文件执行重命名操作。 ... [详细]
  • iOS 小组件开发指南
    本文详细介绍了iOS小部件(Widget)的开发流程,从环境搭建、证书配置到业务逻辑实现,提供了一系列实用的技术指导与代码示例。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • Vue CLI 基础入门指南
    本文详细介绍了 Vue CLI 的基础使用方法,包括环境搭建、项目创建、常见配置及路由管理等内容,适合初学者快速掌握 Vue 开发环境。 ... [详细]
  • 本文详细介绍了Elasticsearch中的分页查询机制,包括基本的分页查询流程、'from-size'浅分页与'scroll'深分页的区别及应用场景,以及两者在性能上的对比。 ... [详细]
  • 本文详细介绍了如何在Linux系统(以CentOS为例)上彻底卸载Zimbra邮件系统,包括停止服务、删除文件和用户等步骤。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • Kafka 是由 Apache 软件基金会开发的高性能分布式消息系统,支持高吞吐量的发布和订阅功能,主要使用 Scala 和 Java 编写。本文将深入解析 Kafka 的安装与配置过程,为程序员提供详尽的操作指南,涵盖从环境准备到集群搭建的每一个关键步骤。 ... [详细]
  • MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案
    MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案 ... [详细]
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社区 版权所有