62 lines
2.4 KiB
Bash
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."
|