Kafka 创建时未指定多个副本或者副本数量过少,都可以在后期手动添加,另外如果副本过多也可以减少,当前调整基于 Kafka 的版本是 2.5.1,但是估计 2.1 ~ 2.5 应该都是兼容的。

下面先来操作一下 Topic 副本减少的过程,首先查看 Kafka Topic 的详情:

# 新版本的 Kafka 建议使用 --bootstrap-server 不建议再使用 --zookeeper
bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test-topic

比如输出如下:

Topic: test-topic     PartitionCount: 4       ReplicationFactor: 2    Configs: cleanup.policy=delete
Topic: test-topic Partition: 0 Leader: 1002 Replicas: 1002,1004 Isr: 1002,1004
Topic: test-topic Partition: 1 Leader: 1001 Replicas: 1001,1002 Isr: 1001,1002
Topic: test-topic Partition: 2 Leader: 1003 Replicas: 1003,1001 Isr: 1001,1003
Topic: test-topic Partition: 3 Leader: 1004 Replicas: 1004,1003 Isr: 1003,1004

然后我们看每个 partition 其实是有两个副本的,我们接下来准备缩减一下,那么我们尽量只留 Leader 副本就可以了,干掉 Follower 副本,我们首先编写下面的配置文件:

{"version":1,
"partitions":[
{"topic":"test-topic","partition":0,"replicas":[1002]},
{"topic":"test-topic","partition":1,"replicas":[1001]},
{"topic":"test-topic","partition":2,"replicas":[1003]},
{"topic":"test-topic","partition":3,"replicas":[1004]}
]}

然后将上面的 JSON 保存到 reassign.json 文件,这个配置相当于每个分区只保留一个 Leader 副本,然后我们执行命令减少副本:

# 注意这里需要指定 ZooKeeper 地址,2.5 之前的都是这样,最新的好像是支持 --bootstrap-server 参数
bin/kafka-reassign-partitions.sh --zookeeper localhost:2181/kafka --reassignment-json-file reassign.json --execute

执行完成之后,Kafka 会给我们提示开始执行,然后我们可以用下面的命令查看进度:

bin/kafka-reassign-partitions.sh --zookeeper localhost:2181/kafka --reassignment-json-file reassign.json --verify

等进度完成后,我们再次查看 Topic 的详情:

bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test-topic

这个时候分区就减少了:

Topic: test-topic     PartitionCount: 4       ReplicationFactor: 1    Configs: cleanup.policy=delete,segment.bytes=1073741824
Topic: test-topic Partition: 0 Leader: 1002 Replicas: 1002 Isr: 1002
Topic: test-topic Partition: 1 Leader: 1001 Replicas: 1001 Isr: 1001
Topic: test-topic Partition: 2 Leader: 1003 Replicas: 1003 Isr: 1003
Topic: test-topic Partition: 3 Leader: 1004 Replicas: 1004 Isr: 1004

然后这个时候分区的底层文件会先标记为删除,并在稍后进行清理。正常情况下所有的生产者和消费者都不会受到影响而导致中断。

然后我们还可以增加分区的副本数量,同样需要编写文件如下:

{"version":1,
"partitions":[
{"topic":"test-topic","partition":0,"replicas":[1002, 1004]},
{"topic":"test-topic","partition":1,"replicas":[1001, 1002]},
{"topic":"test-topic","partition":2,"replicas":[1003, 1001]},
{"topic":"test-topic","partition":3,"replicas":[1004, 1003]}
]}

Kafka 会使用 replicas 下的第一个 broker id 作为 Leader 副本,其余的作为 Follower 副本,所以我们尽量保证现有的 Leader 和变化后的 Leader 一致,这样不会由于 Rebalance 导致消费者阻塞,从而保证服务不中断,如果后期确实分配不均再考虑调整,然后将上面 JSON 保存成文件开始操作:

bin/kafka-reassign-partitions.sh --zookeeper localhost:2181/kafka --reassignment-json-file reassign.json --execute

然后查看进度:

bin/kafka-reassign-partitions.sh --zookeeper localhost:2181/kafka --reassignment-json-file reassign.json --verify

等执行完,再次查看 Topic 详情,确定 Isr 中包含所有的副本就说明已经同步了。

然后在当前状态下,还可以让 Kafka 给我们生成比较好的副本方案,这样比较均衡,我们可以创建一个包含 Topic 的文件:

{
"topics": [
{
"topic": "test-topic"
}
],
"version": 1
}

这个文件可以指定多个 Topic,然后我们保存文件为:topic-generate.json,并让 Kafka 给我们生成分配方案:

bin/kafka-reassign-partitions.sh --zookeeper localhost:2181/kafka --topics-to-move-json-file topic-generate.json --broker-list "1001,1002,1003,1004" --generate

注意上面 --broker-list 要输入集群所有的 broker id,一定不要漏,然后执行完成 Kafka 就会输出一个基于当前副本数量的分配方案,前面是当前的,后面是 Kafka 为我们生成的,然后我们可以保存后面的 JSON 文件然后执行它即可。

还有一种比较常用的场景是 Kafka 集群添加了一些节点,但是之前的分区没有重新分配,我们这个时候也需要这样来执行重分配,首先也是按照上面的命令指定全部的 broker id,包括新添加的节点,然后生成分配的方案,生成后执行即可。

但是需要注意的是,如果我们原来的分区数量就比较少,比如每个机器只有一个分区,那么这个时候重分配无论如何也无法均衡,我们需要调用 Kafka 命令手动添加分区,然后分区数量足够的条件下再执行重分配即可。当然假如我们开始的分区比较多,那么直接重新分配也是没问题的,并且可以同时调整分区跟副本。另外还有一些技巧,比如尽量保证 Leader replica 前后不变,可以做到尽量不影响生产者和消费者的运行等。

Kafka 集群副本数量调整的更多相关文章

  1. Kafka集群优化篇-调整broker的堆内存(heap)案例实操

    Kafka集群优化篇-调整broker的堆内存(heap)案例实操 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看kafka集群的broker的堆内存使用情况 1>. ...

  2. Kafka集群副本分配算法解析

    副本分配算法如下: 将所有N Broker和待分配的i个Partition排序. 将第i个Partition分配到第(i mod n)个Broker上. 将第i个Partition的第j个副本分配到第 ...

  3. 如何为Kafka集群选择合适的Partitions数量

    转载:http://blog.csdn.net/odailidong/article/details/52571901 这是许多kafka使用者经常会问到的一个问题.本文的目的是介绍与本问题相关的一些 ...

  4. window环境搭建zookeeper,kafka集群

    为了演示集群的效果,这里准备一台虚拟机(window 7),在虚拟机中搭建了单IP多节点的zookeeper集群(多IP节点的也是同理的),并且在本机(win 7)和虚拟机中都安装了kafka. 前期 ...

  5. 《Apache Kafka实战》读书笔记-调优Kafka集群

    <Apache Kafka实战>读书笔记-调优Kafka集群 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.确定调优目标 1>.常见的非功能性要求 一.性能( ...

  6. kafka集群操作指南

    目录 kafka集群操作指南 (一)单机版安装 (二)集群安装 (三)集群启停操作 (四)topic相关的操作 (五)某个broker挂掉,本机器可重启 (六)某个broker挂掉且无法重启,需要其它 ...

  7. CentOS 7搭建Zookeeper和Kafka集群

    环境 CentOS 7.4 Zookeeper-3.6.1 Kafka_2.13-2.4.1 Kafka-manager-2.0.0.2 本次安装的软件全部在 /home/javateam 目录下. ...

  8. CentOS 7 Zookeeper 和 Kafka 集群搭建

    环境 CentOS 7.4 Zookeeper-3.6.1 Kafka_2.13-2.4.1 Kafka-manager-2.0.0.2 本次安装的软件全部在 /home/javateam 目录下. ...

  9. zookeeper集群+kafka集群 部署

    zookeeper集群 +kafka 集群部署 1.Zookeeper 概述: Zookeeper 定义 zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目 Zooke ...

  10. Zookeeper、Kafka集群与Filebeat+Kafka+ELK架构

    Zookeeper.Kafka集群与Filebeat+Kafka+ELK架构 目录 Zookeeper.Kafka集群与Filebeat+Kafka+ELK架构 一.Zookeeper 1. Zook ...

随机推荐

  1. kubernetes 1.20版本 二进制部署

    kubernetes 1.20版本 二进制部署 目录 kubernetes 1.20版本 二进制部署 1. 前言 2. 环境准备 2.1 机器规划 2.2 软件版本 3. 搭建集群 3.1 机器基本配 ...

  2. 4- 信号量& 互斥量

    信号量,计数值 问题:  还是那个AB任务互斥调度的问题,B等A执行完毕的过程中,判断标志位会耗费CPU资源 利用信号量,当没有信号的时候,不参与调度 计数信号量(不能用来传输数据) static S ...

  3. [VueJsDev] 快速入门 - 开发前小知识

    [VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html 开发前小知识 ::: details 目录 目录 开发前小知 ...

  4. tapable - webpack 的 hooks - getAc - 异步流程控制

    tapable - webpack 的 hooks,类似自己的 getAc 官方地址 https://www.npmjs.com/package/tapable 随便找了篇文章:聊聊 Webpack ...

  5. linux 环境 打包 失败,一次解决过程

    发现打包失败 测试发现 npm run build 打包失败 发现问题1 node_modules 库 没装 rm -rf node_modules 进行 npm install 安装失败 发现lin ...

  6. GO 语言的并发编程相关知识点简介与测试【GO 基础】

    〇.什么是协程 Coroutines ? 进程和线程太常见,本文就不再赘述了,直接一起看下什么是协程.如下图,先看下协程的定位: 关于用户空间和内核空间:进程运行起来就涉及到对内存资源的管理,然而内存 ...

  7. python 创建文件夹并写入文件源码

    废话就不多少说了,直接上源码吧. import time import os folder = os.getcwd() folder = folder + '/test/' print(folder) ...

  8. day17--Java常用类05

    Java常用类 5.其他常用类 5.1Math类 java.lang.Math提供了一系列静态方法用于科学计算:其方法的参数和返回值类型一般为double型.如果需要更加强大的数学运算能力,计算高等数 ...

  9. day16--Java常用类04

    Java常用类 4.字符串相关类练习 4.1StringBuilder练习 package li.normalclass.stringbuilder; public class TestBuffer ...

  10. 安装libevent

    1.在libevent官网(http://libevent.org/)上下载压缩包(我下载的是libevent-2.1.8-stable.tar.gz) 2.解压压缩包:tar -zxvf libev ...