Files
王绍宏 c1472b9a95 fix(syslog-consumer-rule): 解耦统计物化并解决多实例达梦死锁
- 将设备、规则和采集任务业务统计改为专用 Kafka Topic 异步物化
- 使用维度 ID 作为 Kafka key,保证同一统计维度串行更新
- 物化过程读取小型统计表精确值,确保重复消费不会重复计数
- 增加提交后发布、失败重试及定时小表对账补偿
- 固定日统计聚合键写入顺序,完善达梦死锁识别和事务重试
- JSON 解析失败直接转为非标日志,避免进入 DLT 重试链路
- 非标日志使用独立异步队列,不再阻塞正常消息 Kafka ACK
- Kafka 升级脚本新增 STATS.MATERIALIZE Topic
- 增加统计物化状态指标、配置示例及单元测试
2026-09-11 20:42:22 +08:00

89 lines
3.1 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
set -euo pipefail
# Kafka 集群只需在一台装有 Kafka CLI、能够访问集群的服务器上执行一次。
# 示例:
# export KAFKA_BIN=<现场Kafka客户端bin目录>
# export BOOTSTRAP=<现场broker1地址>:<端口>,<现场broker2地址>:<端口>
# export RAW_TOPIC=<现场原始Topic名称>
# export COMMAND_CONFIG=<现场client.properties路径> # 无认证时不设置
# ./kafka-cluster-upgrade.sh
# BOOTSTRAP 必须使用客户 Kafka 运维提供的地址;集群建议填写两个以上 broker。
: "${KAFKA_BIN:?请根据现场环境设置 KAFKA_BIN}"
: "${BOOTSTRAP:?请填写客户 Kafka 运维提供的 broker 地址和端口}"
: "${RAW_TOPIC:?请填写现场实际使用的原始 Topic 名称}"
TOPICS_CMD="${KAFKA_BIN}/kafka-topics.sh"
CONFIGS_CMD="${KAFKA_BIN}/kafka-configs.sh"
if [[ ! -x "${TOPICS_CMD}" ]] || [[ ! -x "${CONFIGS_CMD}" ]]; then
echo "ERROR: ${KAFKA_BIN} 下缺少 kafka-topics.sh 或 kafka-configs.sh" >&2
exit 1
fi
COMMON_ARGS=(--bootstrap-server "${BOOTSTRAP}")
if [[ -n "${COMMAND_CONFIG:-}" ]]; then
if [[ ! -r "${COMMAND_CONFIG}" ]]; then
echo "ERROR: 无法读取认证配置 ${COMMAND_CONFIG}" >&2
exit 1
fi
COMMON_ARGS+=(--command-config "${COMMAND_CONFIG}")
fi
echo "[1/4] 测试 Kafka 集群连接:${BOOTSTRAP}"
"${TOPICS_CMD}" "${COMMON_ARGS[@]}" --list >/dev/null
echo "[2/4] 读取原始 Topic:${RAW_TOPIC}"
RAW_INFO=$("${TOPICS_CMD}" "${COMMON_ARGS[@]}" --describe --topic "${RAW_TOPIC}")
printf '%s\n' "${RAW_INFO}"
PARTITIONS=$(printf '%s\n' "${RAW_INFO}" | awk '
/PartitionCount:/ {
for (i = 1; i <= NF; i++) if ($i == "PartitionCount:") { print $(i + 1); exit }
}
')
REPLICAS=$(printf '%s\n' "${RAW_INFO}" | awk '
/ReplicationFactor:/ {
for (i = 1; i <= NF; i++) if ($i == "ReplicationFactor:") { print $(i + 1); exit }
}
')
if [[ ! "${PARTITIONS}" =~ ^[1-9][0-9]*$ ]] || [[ ! "${REPLICAS}" =~ ^[1-9][0-9]*$ ]]; then
echo "ERROR: 无法读取原始 Topic 的分区数或副本数" >&2
exit 1
fi
echo "新 Topic 使用分区数=${PARTITIONS},副本数=${REPLICAS}"
SUFFIXES=("RETRY.1M" "RETRY.10M" "RETRY.1H" "DLT" "REPLAY" "STATS.MATERIALIZE")
RETENTIONS=(259200000 604800000 604800000 7776000000 604800000 604800000)
echo "[3/4] 创建或更新升级 Topic"
for i in 0 1 2 3 4 5; do
TOPIC="${RAW_TOPIC}.${SUFFIXES[$i]}"
RETENTION_MS="${RETENTIONS[$i]}"
echo "处理 ${TOPIC}"
"${TOPICS_CMD}" "${COMMON_ARGS[@]}" \
--create --if-not-exists \
--topic "${TOPIC}" \
--partitions "${PARTITIONS}" \
--replication-factor "${REPLICAS}" \
--config cleanup.policy=delete \
--config "retention.ms=${RETENTION_MS}"
"${CONFIGS_CMD}" "${COMMON_ARGS[@]}" \
--alter --entity-type topics --entity-name "${TOPIC}" \
--add-config "cleanup.policy=delete,retention.ms=${RETENTION_MS}"
done
echo "[4/4] 显示升级结果"
for SUFFIX in "${SUFFIXES[@]}"; do
"${TOPICS_CMD}" "${COMMON_ARGS[@]}" \
--describe --topic "${RAW_TOPIC}.${SUFFIX}"
done
echo "PASS: Kafka 集群 Topic 已创建或更新;未删除 Topic,未修改消费组 offset。"