guoziyun пре 1 месец
родитељ
комит
4313159702
1 измењених фајлова са 62 додато и 2 уклоњено
  1. 62 2
      oms/scripts/migrate-clickhouse-events-partition.sh

+ 62 - 2
oms/scripts/migrate-clickhouse-events-partition.sh

@@ -29,6 +29,8 @@ Environment variables:
   CLICKHOUSE_PORT            Default: 9000
   CLICKHOUSE_USER            Optional
   CLICKHOUSE_PASSWORD        Optional
+  CLICKHOUSE_CONTAINER       Default: clickhouse
+  CLICKHOUSE_USE_DOCKER      Default: auto (prefer docker, fallback to native client)
   CLICKHOUSE_DATABASE        Default: omsdb
   CLICKHOUSE_SRC_TABLE       Default: events
   CLICKHOUSE_DST_TABLE       Default: events_v2
@@ -38,6 +40,7 @@ Environment variables:
 
 Notes:
   - The script assumes ClickHouse writes come only from ingestor-service.
+  - By default it runs clickhouse-client inside the Docker container named by CLICKHOUSE_CONTAINER.
   - event-api can stay online; RabbitMQ will buffer events while ingestor-service is paused.
   - Review the printed plan first, then rerun with --execute.
 EOF
@@ -86,6 +89,8 @@ CLICKHOUSE_HOST="${CLICKHOUSE_HOST:-localhost}"
 CLICKHOUSE_PORT="${CLICKHOUSE_PORT:-9000}"
 CLICKHOUSE_USER="${CLICKHOUSE_USER:-}"
 CLICKHOUSE_PASSWORD="${CLICKHOUSE_PASSWORD:-}"
+CLICKHOUSE_CONTAINER="${CLICKHOUSE_CONTAINER:-clickhouse}"
+CLICKHOUSE_USE_DOCKER="${CLICKHOUSE_USE_DOCKER:-auto}"
 
 CH_ARGS=(
   --host "$CLICKHOUSE_HOST"
@@ -109,7 +114,54 @@ require_command() {
   fi
 }
 
-require_command clickhouse-client
+docker_available=0
+native_clickhouse_available=0
+
+if command -v docker >/dev/null 2>&1; then
+  docker_available=1
+fi
+
+if command -v clickhouse-client >/dev/null 2>&1; then
+  native_clickhouse_available=1
+fi
+
+case "$CLICKHOUSE_USE_DOCKER" in
+  auto)
+    if [[ $docker_available -eq 1 ]]; then
+      CLICKHOUSE_EXEC_MODE="docker"
+    elif [[ $native_clickhouse_available -eq 1 ]]; then
+      CLICKHOUSE_EXEC_MODE="native"
+    else
+      echo "Neither docker nor clickhouse-client is available on this host." >&2
+      exit 1
+    fi
+    ;;
+  1|true|yes|docker)
+    if [[ $docker_available -eq 0 ]]; then
+      echo "Docker is required but not available." >&2
+      exit 1
+    fi
+    CLICKHOUSE_EXEC_MODE="docker"
+    ;;
+  0|false|no|native)
+    if [[ $native_clickhouse_available -eq 0 ]]; then
+      echo "clickhouse-client is required but not available." >&2
+      exit 1
+    fi
+    CLICKHOUSE_EXEC_MODE="native"
+    ;;
+  *)
+    echo "Unsupported CLICKHOUSE_USE_DOCKER value: $CLICKHOUSE_USE_DOCKER" >&2
+    exit 1
+    ;;
+esac
+
+if [[ "$CLICKHOUSE_EXEC_MODE" == "docker" ]]; then
+  if ! docker inspect "$CLICKHOUSE_CONTAINER" >/dev/null 2>&1; then
+    echo "ClickHouse container not found: $CLICKHOUSE_CONTAINER" >&2
+    exit 1
+  fi
+fi
 
 if [[ $SKIP_PM2 -eq 0 ]]; then
   require_command pm2
@@ -117,7 +169,11 @@ fi
 
 run_sql() {
   local sql="$1"
-  clickhouse-client "${CH_ARGS[@]}" --query "$sql"
+  if [[ "$CLICKHOUSE_EXEC_MODE" == "docker" ]]; then
+    docker exec -i "$CLICKHOUSE_CONTAINER" clickhouse-client "${CH_ARGS[@]}" --query "$sql"
+  else
+    clickhouse-client "${CH_ARGS[@]}" --query "$sql"
+  fi
 }
 
 print_sql_block() {
@@ -206,6 +262,10 @@ printf 'Backup table: %s\n' "$BACKUP_TABLE"
 printf 'Current month for cutover: %s\n' "$CURRENT_MONTH"
 printf 'Historical months to backfill: %s\n' "${historical_months[*]:-(none)}"
 printf 'PM2 control: %s\n' "$([[ $SKIP_PM2 -eq 0 ]] && echo enabled || echo skipped)"
+printf 'ClickHouse execution mode: %s\n' "$CLICKHOUSE_EXEC_MODE"
+if [[ "$CLICKHOUSE_EXEC_MODE" == "docker" ]]; then
+  printf 'ClickHouse container: %s\n' "$CLICKHOUSE_CONTAINER"
+fi
 printf 'Mode: %s\n' "$([[ $DRY_RUN -eq 0 ]] && echo execute || echo dry-run)"
 
 print_sql_block "Create destination table" "$create_sql"