我有以下问题需要解决。你们知道允许根据主题前缀设置不同最小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
=2core-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