【kafka】kafa topic-partition 的多副本、高可用改造

一、 背景

3节点kafka集群 ,broker id 分别为 0 1 2 。

二、 改造操作

$ /data/kafka/bin/kafka-topics.sh  --zookeeper  192.168.1.110:2181   --topic testTopic --describe

Topic:testTopic       PartitionCount:16       ReplicationFactor:1     Configs:
        Topic: testTopic      Partition: 0    Leader: 0       Replicas: 0     Isr: 0
        Topic: testTopic      Partition: 1    Leader: 2       Replicas: 2     Isr: 2
        Topic: testTopic      Partition: 2    Leader: 1       Replicas: 1     Isr: 1
        Topic: testTopic      Partition: 3    Leader: 0       Replicas: 0     Isr: 0
        Topic: testTopic      Partition: 4    Leader: 2       Replicas: 2     Isr: 2
        Topic: testTopic      Partition: 5    Leader: 1       Replicas: 1     Isr: 1
        Topic: testTopic      Partition: 6    Leader: 0       Replicas: 0     Isr: 0
        Topic: testTopic      Partition: 7    Leader: 2       Replicas: 2     Isr: 2
        Topic: testTopic      Partition: 8    Leader: 1       Replicas: 1     Isr: 1
        Topic: testTopic      Partition: 9    Leader: 0       Replicas: 0     Isr: 0
        Topic: testTopic      Partition: 10   Leader: 2       Replicas: 2     Isr: 2
        Topic: testTopic      Partition: 11   Leader: 1       Replicas: 1     Isr: 1
        Topic: testTopic      Partition: 12   Leader: 0       Replicas: 0     Isr: 0
        Topic: testTopic      Partition: 13   Leader: 2       Replicas: 2     Isr: 2
        Topic: testTopic      Partition: 14   Leader: 1       Replicas: 1     Isr: 1
        Topic: testTopic      Partition: 15   Leader: 0       Replicas: 0     Isr: 0
$ cat  topic-generate.json

{
  "topics": [
    {
      "topic": "testTopic"
    }
  ],
  "version": 1
}
$ /data/kafka/bin/kafka-reassign-partitions.sh --zookeeper 192.168.1.110:2181  --topics-to-move-json-file topic-generate.json --broker-list "0,1,2" --generate

Current partition replica assignment
{"version":1,"partitions":[{"topic":"testTopic","partition":15,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":2,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":7,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":12,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":4,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":11,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":10,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":8,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":5,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":13,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":1,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":14,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":9,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":6,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":0,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":3,"replicas":[0],"log_dirs":["any"]}]}

Proposed partition reassignment configuration
{"version":1,"partitions":[{"topic":"testTopic","partition":14,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":3,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":8,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":0,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":11,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":5,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":13,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":2,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":10,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":15,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":7,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":12,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":1,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":4,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":9,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":6,"replicas":[0],"log_dirs":["any"]}]}


将 Proposed partition reassignment configuration 下的 json 复制到临时文件,通 sed 去掉 多余的 部分 (,"log_dirs":["any"] )
$ sed -i 's/,"log_dirs":["any"]//g' tmp.json

如果需要将改topic的 每个分区 (partition)都改为 3 副本,我们需要将 改json 文件中的 "replicas": [x] 改为 "replicas": [0,1,2] ,可通过nodpad修改,修改后的文件内容我们导入到 partition-replica-reassignment.json

注: 如果将数据副本设为2也可以,只是这里 json文件就不好修改了,手动分配容易导致分区在各节点分布不均,设为3 (broker节点数)就不用担心这个问题

$ cat partition-replica-reassignment.json

{
  "version": 1,
  "partitions": [
    {
      "topic": "testTopic",
      "partition": 14,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 3,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 8,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 0,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 11,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 5,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 13,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 2,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 10,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 15,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 7,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 12,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 1,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 4,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 9,
      "replicas": [
        0,
        1,
        2
      ]
    },
    {
      "topic": "testTopic",
      "partition": 6,
      "replicas": [
        0,
        1,
        2
      ]
    }
  ]
}

$ /data/kafka/bin/kafka-reassign-partitions.sh --zookeeper 192.168.1.110:2181  --reassignment-json-file partition-replica-reassignment.json --execute

Current partition replica assignment

{"version":1,"partitions":[{"topic":"testTopic","partition":15,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":2,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":7,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":12,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":4,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":11,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":10,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":8,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":5,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":13,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":1,"replicas":[2],"log_dirs":["any"]},{"topic":"testTopic","partition":14,"replicas":[1],"log_dirs":["any"]},{"topic":"testTopic","partition":9,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":6,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":0,"replicas":[0],"log_dirs":["any"]},{"topic":"testTopic","partition":3,"replicas":[0],"log_dirs":["any"]}]}

Save this to use as the --reassignment-json-file option during rollback
Successfully started reassignment of partitions.

$ /data/kafka/bin/kafka-reassign-partitions.sh --zookeeper 192.168.1.110:2181  --reassignment-json-file partition-replica-reassignment.json --verify

Status of partition reassignment:
Reassignment of partition testTopic-15 completed successfully
Reassignment of partition testTopic-2 completed successfully
Reassignment of partition testTopic-7 completed successfully
Reassignment of partition testTopic-12 completed successfully
Reassignment of partition testTopic-4 completed successfully
Reassignment of partition testTopic-11 completed successfully
Reassignment of partition testTopic-10 completed successfully
Reassignment of partition testTopic-8 completed successfully
Reassignment of partition testTopic-5 completed successfully
Reassignment of partition testTopic-13 completed successfully
Reassignment of partition testTopic-1 completed successfully
Reassignment of partition testTopic-14 completed successfully
Reassignment of partition testTopic-9 completed successfully
Reassignment of partition testTopic-6 completed successfully
Reassignment of partition testTopic-0 completed successfully
Reassignment of partition testTopic-3 completed successfully
$ /data/kafka/bin/kafka-topics.sh  --zookeeper  192.168.1.110:2181   --topic testTopic --describe

Topic:testTopic       PartitionCount:16       ReplicationFactor:3     Configs:
        Topic: testTopic      Partition: 0    Leader: 0       Replicas: 0,1,2 Isr: 0,1,2
        Topic: testTopic      Partition: 1    Leader: 2       Replicas: 0,1,2 Isr: 2,1,0
        Topic: testTopic      Partition: 2    Leader: 1       Replicas: 0,1,2 Isr: 1,0,2
        Topic: testTopic      Partition: 3    Leader: 0       Replicas: 0,1,2 Isr: 0,1,2
        Topic: testTopic      Partition: 4    Leader: 2       Replicas: 0,1,2 Isr: 2,1,0
        Topic: testTopic      Partition: 5    Leader: 1       Replicas: 0,1,2 Isr: 1,0,2
        Topic: testTopic      Partition: 6    Leader: 0       Replicas: 0,1,2 Isr: 0,1,2
        Topic: testTopic      Partition: 7    Leader: 2       Replicas: 0,1,2 Isr: 2,1,0
        Topic: testTopic      Partition: 8    Leader: 1       Replicas: 0,1,2 Isr: 1,0,2
        Topic: testTopic      Partition: 9    Leader: 0       Replicas: 0,1,2 Isr: 0,1,2
        Topic: testTopic      Partition: 10   Leader: 2       Replicas: 0,1,2 Isr: 2,1,0
        Topic: testTopic      Partition: 11   Leader: 1       Replicas: 0,1,2 Isr: 1,0,2
        Topic: testTopic      Partition: 12   Leader: 0       Replicas: 0,1,2 Isr: 0,1,2
        Topic: testTopic      Partition: 13   Leader: 2       Replicas: 0,1,2 Isr: 2,1,0
        Topic: testTopic      Partition: 14   Leader: 1       Replicas: 0,1,2 Isr: 1,0,2
        Topic: testTopic      Partition: 15   Leader: 0       Replicas: 0,1,2 Isr: 0,1,2

要熟练使用 Kafka 自带的 kafka-reassign-partitions.sh 脚本工具来完成对 topic 的分区分配、分区副本增加等操作。
该脚本有三个参数:

--generate:配合着 --topics-to-move-json-file 可以生成分区分配策略,该参数适用于分区多的情况。
--execute: 配合着 --reassignment-json-file   可以执行分区分配策略。
--verify:  配合着 --reassignment-json-file   可以检查分区分配进度。

通过以上命令,既可以分配分区,也可以增加分区副本数,非常方便。

如果要kafak中新创的 topic ,默认就多副本,需要在配置文件中显式声明,然后重启 kafka进程。

$ cat /kingdee/kafka/config/server.properties

 num.partitions=1
default.replication.factor=3

设置默认的 num.partitions=1 而不是 大于1 ,是为了 避免出现 有些topic 确实需要单分区,而代码中又没有声明,从而发出多单分区的情况。

设置默认的 default.replication.factor=3, 如果代码中没有指定副本数,那么 读此配置,副本为 3.

代码里显式指定,类似shell命令行传递环境变量,优先级高于配置文件 ,就无法配置文件能兜底了。

三、参考

在线json美化
https://toolgg.com/jsonedit

kafka 主题、分区check脚本
https://www.jianshu.com/p/d524a84d505a
https://www.jianshu.com/p/fba009885042

教你如何重新分布kafka分区、增加分区副本数
https://cloud.tencent.com/developer/article/1755177

Kafka动态增加Topic的副本
https://www.cnblogs.com/xiao987334176/p/10315176.html

kafka修改分区、副本数、副本迁移
https://sukbeta.github.io/kafka-Modify-Partitions-and-ReplicationFactor

为什么不尝试从json文件中删除所有"log_dirs": ["any"]?
https://www.656463.com/wenda/fqzxfpzKafka110zsb_258

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容