gcx/backend/scripts/debezium/register-connectors.sh

62 lines
2.4 KiB
Bash

#!/usr/bin/env bash
# =============================================================================
# Debezium connector 注册脚本
# 用法: ./scripts/debezium/register-connectors.sh [CONNECT_URL]
#
# 经验教训 (rwadurian 事故):
# - 必须使用 debezium/connect:2.5.4.Final (修复 DBZ-7316 WAL 积压 bug)
# - heartbeat 使用 TABLE 方式而非 pg_logical_emit_message
# - Kafka Connect REST API 不能暴露公网 (SSRF 注入风险)
# - 配置 signal channel 以便出问题时可用增量快照重放数据
# =============================================================================
set -euo pipefail
CONNECT_URL="${1:-http://localhost:8083}"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
echo "Waiting for Kafka Connect to be ready..."
until curl -sf "${CONNECT_URL}/" > /dev/null 2>&1; do
echo " Kafka Connect not ready, retrying in 5s..."
sleep 5
done
echo "Kafka Connect is ready at ${CONNECT_URL}"
# 注册 outbox connector
CONNECTOR_NAME="genex-outbox-connector"
CONFIG_FILE="${SCRIPT_DIR}/outbox-connector.json"
if [ ! -f "$CONFIG_FILE" ]; then
echo "ERROR: Config file not found: $CONFIG_FILE"
exit 1
fi
# 检查 connector 是否已存在
STATUS_CODE=$(curl -s -o /dev/null -w "%{http_code}" "${CONNECT_URL}/connectors/${CONNECTOR_NAME}")
if [ "$STATUS_CODE" = "200" ]; then
echo "Connector '${CONNECTOR_NAME}' already exists. Updating config..."
# 提取 config 部分进行 PUT 更新
CONFIG_ONLY=$(python3 -c "import json,sys; d=json.load(open(sys.argv[1])); print(json.dumps(d['config']))" "$CONFIG_FILE" 2>/dev/null \
|| python -c "import json,sys; d=json.load(open(sys.argv[1])); print(json.dumps(d['config']))" "$CONFIG_FILE")
curl -sf -X PUT \
-H "Content-Type: application/json" \
-d "$CONFIG_ONLY" \
"${CONNECT_URL}/connectors/${CONNECTOR_NAME}/config" | python3 -m json.tool 2>/dev/null || true
echo "Connector '${CONNECTOR_NAME}' updated."
else
echo "Creating connector '${CONNECTOR_NAME}'..."
curl -sf -X POST \
-H "Content-Type: application/json" \
-d @"$CONFIG_FILE" \
"${CONNECT_URL}/connectors" | python3 -m json.tool 2>/dev/null || true
echo "Connector '${CONNECTOR_NAME}' created."
fi
# 验证状态
echo ""
echo "=== Connector Status ==="
curl -sf "${CONNECT_URL}/connectors/${CONNECTOR_NAME}/status" | python3 -m json.tool 2>/dev/null || \
curl -sf "${CONNECT_URL}/connectors/${CONNECTOR_NAME}/status"
echo ""
echo "Done."