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. 学习笔记-涛讲F#(基础)

    目录 简介 类型推导 多个输入参数的函数 定义单位 偏函数 常量也是函数 返回值(unit与ignore) 函数串联实现"开方乘十" 使用管道符 |> 元组(参数加上括号) ...

  2. 【jQuery】(8)---jquery Ajax

    jquery ajax 一.AJAX 概述 1.什么是 AJAX? 特点 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使 ...

  3. using用法总结

    一.命名空间的使用 不再赘述. 二.在子类中改变基类成员的访问权限 using可以将public和protected的基类成员的访问权限改为public.protected.private,注意,us ...

  4. 1、Azure Devops之什么是Azure DevOps

    什么是Azure DevOps 1.师出名门:是微软推出的一个集项目管理.开发管理.测试管理的一个服务套件. 2.历史:前身是微软在2005年推出的Team foundation Server一个专门 ...

  5. Leetcode 招商银行-03. 点燃木棒

    用广度优先,暴力搜索.代码如下 import java.util.*; class Solution { public static void main(String[] args) { Soluti ...

  6. WebView库功能完善

    目录介绍 01.loadUrl到底做了什么 02.触发加载网页的行为 03.webView重定向怎么办 04.js交互的一点知识分享 05.拦截缓存如何优雅处理 06.关于一些问题和优化 07.关于一 ...

  7. drools执行String规则或执行某个规则文件

    1.背景 此处主要记录一下2个小的知识点,防止以后忘记. 1.如何在drools中执行某个drl文件. 2.如果我们的规则是一个String类型的字符串,那么该如何执行. 2.实现 2.1 执行指定的 ...

  8. parameter常数及常数函数的使用

    模型功能 常数在verilog设计中具备特殊的含义 一个可以由编译器进行处理的数 和C语言中常数一个不变的变量的作用不同 在verilog中,常数更多地作为预编译变量以提高设计的灵活性 在上一篇文章中 ...

  9. 内核模块的makefile规则详解

    内核中的Makefile 这里主要对内核源码各子集目录中的Kbulid(内核的编译系统)Makfile进行简单介绍 这部分式内核驱动或设备驱动开发这最长接触到的 Makefile 的语法包括几个方面 ...

  10. 6 CSS样式继承

    6 样式继承 CSS的样式表继承指的是,特定的CSS属性向下传递到子孙元素.总的来说,一个HTML文档就是一个家族,然后html元素有两个子元素,相当于它的儿子,分别是head和body,然后body ...