Kafka - 根据主题前缀设置最小 ISR



我有以下问题需要解决。你们知道允许根据主题前缀设置不同最小ISR值的机制吗?例如,使用前缀app-*创建的主题的最小ISR因子值将设置为2,logs-*等于1,但core-*的值将为4。


解决方案建议书

min.insync.replicas.per.topic=topic_name_1:value,topic_name_2:value看起来几乎是一个解决方案,但不幸的是,当min.insync.replicas也存在于kafka.properties中时,它被遮蔽了。因此,我将探讨是否有将这两个支柱结合起来的解决方案。源

使用验证最小ISR值

./kafka-configs.sh --bootstrap-server localhost:9092 
--entity-type topics --entity-name $TOPIC --describe --all

您也可以使用kafkactl进行以下操作:

# first run with --validate-only to see what kafkactl will do
kafkactl get topics -o compact | grep '^app.*'  | xargs -i echo "echo Topic: {};kafkactl alter topic {} --replication-factor 2 --validate-only" | sh
kafkactl get topics -o compact | grep '^log.*'  | xargs -i echo "echo Topic: {};kafkactl alter topic {} --replication-factor 1 --validate-only" | sh
kafkactl get topics -o compact | grep '^core.*' | xargs -i echo "echo Topic: {};kafkactl alter topic {} --replication-factor 4 --validate-only" | sh
# then do the replica reassignment
kafkactl get topics -o compact | grep '^app.*'  | xargs -i echo "echo Topic: {};kafkactl alter topic {} --replication-factor 2" | sh
kafkactl get topics -o compact | grep '^log.*'  | xargs -i echo "echo Topic: {};kafkactl alter topic {} --replication-factor 1" | sh
kafkactl get topics -o compact | grep '^core.*' | xargs -i echo "echo Topic: {};kafkactl alter topic {} --replication-factor 4" | sh

请注意,kafkactl用于此目的的Kafkaneneneba API仅适用于Kafka≥2.4.0。

免责声明:我是这个项目的贡献者

编辑:为了避免80年代风格的解决方案(如本答案所示(,请查看Dirk的答案

我只是喜欢bash/sh


对于已经创建的主题,您必须执行分区重新分配操作。

如果您希望为新创建的主题控制ISR,您可以将kafka-topics.sh脚本包装在一个新脚本中,让我们称之为createTopics.sh

#!/bin/bash
isr=0
if [[ $1 = logs* ]]; then
isr=1
elif  [[ $1 = app* ]]; then
isr=2
elif  [[ $1 = core* ]]; then
isr=4
fi
/bin/kafka-topics.sh --create --topic $1 --replication-factor $isr 
--partitions $3  --bootstrap-server $2
  • $1-主题名称
  • $2-引导服务器
  • $3-分区

例如:

./createTopics.sh apps-topic localhost:9092 1 && 
./createTopics.sh core-topic localhost:9092 1

这将创建两个具有各自复制因子的新主题:

  • apps-topic>ISR=2
  • core-topic>ISR=4

(最大ISR值,假设所有副本都同步(


该脚本还将验证新主题的创建,因为它不会创建任何名称不是以其中一个开头的主题:logs/app/core。卡夫卡会显示一个错误,Replication factor must be larger than 0

例如,您可以通过在脚本开头设置不同于0:isr=1的默认isr值来更改此行为,以允许使用不同的主题前缀。这将导致:

#!/bin/bash
isr=1
if  [[ $1 = app* ]]; then
isr=2
elif  [[ $1 = core* ]]; then
isr=4
fi
/bin/kafka-topics.sh --create --topic $1 --replication-factor $isr 
--partitions $3  --bootstrap-server $2

最新更新