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

 

posted @ 2026-05-08 14:02  苦逼yw  阅读(13)  评论(0)    收藏  举报