kafka之间同步topic脚本
注意:
1、提取分区数和副本数因为kafka版本不对需要加个空格,如 旧版本PartitionCount:[0-9]* 新版本PartitionCount: [0-9]*
#!/bin/bash # Kafka Topic配置同步脚本 - 修复版(使用bootstrap-server) set -e echo "=== Kafka Topic配置同步 ===" echo "注意: 此脚本需要在两个集群中分别执行" if [ "$1" = "export" ]; then # 导出模式(保持原样,因为源集群还是用zookeeper) SOURCE_ZOOKEEPER="b-2.kafkaprod.9vszd8.c11.kafka.us-west-2.amazonaws.com:9092" OUTPUT_FILE="topic_configs_$(date +%Y%m%d).csv" echo "模式: 导出源集群配置" echo "输出文件: $OUTPUT_FILE" # 创建CSV文件头 echo "topic,partitions,replication_factor,retention_ms" > $OUTPUT_FILE # 获取所有topics(排除内部topics) /opt/lfx/kafka_2.13-4.1.1/bin/kafka-topics.sh --bootstrap-server $SOURCE_ZOOKEEPER --list | grep -v -E "^$|^__" | while read topic; do if [ -n "$topic" ]; then echo "处理: $topic" # 获取topic的概要信息(第一行) TOPIC_HEADER=$(/opt/lfx/kafka_2.13-4.1.1/bin/kafka-topics.sh --bootstrap-server $SOURCE_ZOOKEEPER --describe --topic "$topic" 2>/dev/null | head -1) if [ -n "$TOPIC_HEADER" ]; then # 提取分区数 - 修正解析方法 partitions=$(echo "$TOPIC_HEADER" | grep -o "PartitionCount: [0-9]*" | cut -d: -f2) # 提取副本数 replication_factor=$(echo "$TOPIC_HEADER" | grep -o "ReplicationFactor: [0-9]*" | cut -d: -f2) # 从Configs中提取retention.ms retention_ms=$(echo "$TOPIC_HEADER" | grep -o "retention.ms=[0-9]*" | cut -d= -f2) # 设置默认值 partitions=${partitions:-1} replication_factor=${replication_factor:-1} # 写入CSV echo "$topic,$partitions,$replication_factor,${retention_ms}" >> $OUTPUT_FILE echo " ✓ 分区: $partitions, 副本: $replication_factor, retention.ms: ${retention_ms:-默认}" else echo " ⚠️ 无法获取topic信息,使用默认值" echo "$topic,1,1," >> $OUTPUT_FILE fi fi done echo "导出完成! 请将文件 $OUTPUT_FILE 复制到目标集群环境" # 显示文件预览 echo "" echo "文件预览:" echo "========================================" head -10 "$OUTPUT_FILE" | column -t -s',' echo "..." echo "总行数: $(wc -l < "$OUTPUT_FILE")" elif [ "$1" = "import" ]; then # 导入模式 - 修改为使用bootstrap-server BOOTSTRAP_SERVER="10.52.92.79:32518" CONFIG_FILE="$2" if [ -z "$CONFIG_FILE" ] || [ ! -f "$CONFIG_FILE" ]; then echo "错误: 请提供配置文件" echo "用法: $0 import <config_file.csv>" exit 1 fi echo "模式: 导入到目标集群" echo "配置文件: $CONFIG_FILE" echo "Kafka地址: $BOOTSTRAP_SERVER" # 统计变量 SUCCESS_COUNT=0 SKIP_COUNT=0 ERROR_COUNT=0 # 关键修改:使用进程替换代替管道,避免子shell导致计数器失效 while IFS=',' read -r topic partitions replication_factor retention_ms; do # 清理字段 topic=$(echo "$topic" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') partitions=$(echo "$partitions" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') replication_factor=$(echo "$replication_factor" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') retention_ms=$(echo "$retention_ms" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') if [ -n "$topic" ] && [ "$topic" != "topic" ]; then echo "创建: $topic" echo " 配置: 分区=$partitions, 副本=$replication_factor, retention.ms=${retention_ms:-默认}" # 检查topic是否已存在(使用bootstrap-server) if /opt/lfx/kafka_2.13-4.1.1/bin/kafka-topics.sh --bootstrap-server $BOOTSTRAP_SERVER --list | grep -q "^$topic$"; then echo " ⚠️ Topic已存在,跳过创建" SKIP_COUNT=$((SKIP_COUNT + 1)) else # 创建topic(使用bootstrap-server) if /opt/lfx/kafka_2.13-4.1.1/bin/kafka-topics.sh --create \ --bootstrap-server $BOOTSTRAP_SERVER \ --topic "$topic" \ --partitions ${partitions:-5} \ --replication-factor ${replication_factor:-2} >/dev/null 2>&1; then echo " ✓ Topic创建成功" SUCCESS_COUNT=$((SUCCESS_COUNT + 1)) else echo " ❌ Topic创建失败" ERROR_COUNT=$((ERROR_COUNT + 1)) fi fi # 设置retention.ms(如果配置了且不为空)- 使用bootstrap-server if [ -n "$retention_ms" ] && [ "$retention_ms" != "null" ] && [[ "$retention_ms" =~ ^[0-9]+$ ]]; then echo " 设置 retention.ms: $retention_ms" if /opt/lfx/kafka_2.13-4.1.1/bin/kafka-configs.sh --bootstrap-server $BOOTSTRAP_SERVER \ --entity-type topics \ --entity-name "$topic" \ --alter \ --add-config "retention.ms=$retention_ms" >/dev/null 2>&1; then echo " ✓ retention.ms设置成功" else echo " ⚠️ retention.ms设置失败" fi fi echo "" fi done < <(tail -n +2 "$CONFIG_FILE") # 跳过CSV表头 echo "导入完成!" echo "统计: 成功=$SUCCESS_COUNT, 跳过=$SKIP_COUNT, 失败=$ERROR_COUNT" else echo "用法:" echo " 导出配置: $0 export" echo " 导入配置: $0 import <config_file.csv>" echo "" echo "步骤:" echo " 1. 在源集群执行: $0 export" echo " 2. 将生成的CSV文件复制到目标集群" echo " 3. 在目标集群执行: $0 import topic_configs_YYYYMMDD.csv" fi

浙公网安备 33010602011771号