AI SREClickHouse Workshops

03 Managed Postgres CDC

สร้าง Postgres ที่ ClickHouse จัดการให้และ ClickPipe ด้วย clickhousectl แล้วป้อนแถวสดเข้าตารางแท็กซี่

Your computer
macOS terminal: Run workshop commands in Terminal using zsh or bash.

ผลลัพธ์

ในเวลาประมาณ 20 นาที การเดินทางสดจะไหล:

Postgres managed by ClickHouse → ClickPipe → default.realtime_trips
→ materialized view → nyc_tlc_data.taxi_trips → Ops dashboard

ข้อกำหนดเบื้องต้น: โมดูล 00–02 เสร็จแล้ว และเทอร์มินัลของคุณอยู่ใน ClickHouse_Demos/workshops/build_workshop/app

ขั้นที่ 1 — สร้าง Postgres แบบ managed ใน ClickHouse Cloud

ใช้ภูมิภาคเดียวกับเซอร์วิส ClickHouse ของคุณ:

clickhousectl cloud postgres create \
  --name my-workshop-postgres \
  --provider aws \
  --region ap-southeast-1 \
  --size c6gd.large \
  --pg-version 17 \
  --ha-type none

บันทึก Postgres ID, ชื่อโฮสต์ และรหัสผ่าน postgres แบบใช้ครั้งเดียวที่ได้กลับมา คำสั่ง list และ get ที่ยังเป็นเบต้าอาจคืนค่าว่างหรือ FORBIDDEN การตรวจสอบความพร้อม ที่จำเป็นคือ ./preflight.sh --require-postgres ในขั้นที่ 2

ถ้ารหัสผ่านหาย ให้สร้างใหม่:

clickhousectl cloud postgres reset-password <postgres-id>

ขั้นที่ 2 — เริ่มตัวเขียนข้อมูลการเดินทาง

ไม่มี Postgres ในเครื่องเป็นตัวสำรอง ใน .env.workshop ให้กรอกฟิลด์ PGHOST และ PGPASSWORD ที่ว่างอยู่ด้วยค่าที่ clickhousectl คืนมา และคง TLS ให้เป็นแบบบังคับ:

PGHOST=replace-with-hostname-from-clickhousectl
PGPORT=5432
PGDATABASE=postgres
PGUSER=postgres
PGPASSWORD=replace-with-one-time-password
PGSSLMODE=require
PG_PUBLICATION=pub_taxi

ตรวจสอบเอนด์พอยต์แบบ managed แล้วเริ่มตัวเขียนในเครื่องยิงไปที่มันและตาม log ของมัน:

cd "$(git rev-parse --show-toplevel)/workshops/build_workshop/app"
./preflight.sh --require-postgres
docker compose --profile cdc --env-file .env.workshop -f docker-compose.workshop.yml up -d pg-trip-writer
docker compose --profile cdc --env-file .env.workshop -f docker-compose.workshop.yml logs -f pg-trip-writer

การจัดเตรียมทรัพยากรอาจใช้เวลาสองสามนาที ทำต่อเมื่อ log วนซ้ำแบบนี้:

[loadgen] ensured realtime_trips table exists
[loadgen] created publication pub_taxi for public.realtime_trips
[loadgen] inserted 10 trips @ ...

กด Ctrl-C เพื่อหยุดตาม log คอนเทนเนอร์จะยังรันอยู่

ขั้นที่ 3 — สร้าง ClickPipe

แทนที่ service ID ของ ClickHouse และค่าของ Postgres:

ดาวน์โหลดใบรับรอง CA ของ Postgres ที่จัดการ

ดาวน์โหลดใบรับรอง CA เฉพาะอินสแตนซ์จาก Settings → Security → Download CA certificate แล้วบันทึกเป็น .work/managed-postgres-ca.pem.

mkdir -p .work
mv "$HOME/Downloads/<downloaded-ca-filename>" .work/managed-postgres-ca.pem
workshop_env() { sed -n "s/^$1=//p" .env.workshop | tail -n 1; }
PGHOST=$(workshop_env PGHOST)
PGPORT=$(workshop_env PGPORT)
PGDATABASE=$(workshop_env PGDATABASE)
PGUSER=$(workshop_env PGUSER)
PGPASSWORD=$(workshop_env PGPASSWORD)
PG_PUBLICATION=$(workshop_env PG_PUBLICATION)
unset -f workshop_env
PG_CA_CERT="$PWD/.work/managed-postgres-ca.pem"
test -s "$PG_CA_CERT" || { echo "Missing CA certificate: $PG_CA_CERT" >&2; exit 1; }

clickhousectl cloud clickpipe create postgres <clickhouse-service-id> \
  --name taxi-cdc \
  --host "$PGHOST" \
  --port "$PGPORT" \
  --pg-database "$PGDATABASE" \
  --username "$PGUSER" \
  --password="$PGPASSWORD" \
  --publication-name "$PG_PUBLICATION" \
  --ca-certificate "$PG_CA_CERT" \
  --replication-mode cdc \
  --table-mapping "public.realtime_trips:realtime_trips"

clickhousectl ไม่มีการถามรหัสผ่านแบบโต้ตอบสำหรับคำสั่งนี้ การอ่านค่า เข้าไปในตัวแปรชั่วคราวช่วยกันมันออกจากประวัติเชลล์ รูปแบบ --password=... ก็ ใช้ได้เมื่อรหัสผ่านที่สร้างขึ้นเริ่มด้วย - ค่านั้นยังมองเห็นได้ชั่วครู่โดย เครื่องมือตรวจสอบโปรเซสในเครื่องขณะที่คำสั่งกำลังรัน ดังนั้นให้ใช้เครื่องที่เชื่อถือได้และ unset มันทันทีตามที่แสดงไว้

ClickPipe ที่สร้างจาก CLI จะวางเป้าหมายนี้ไว้ที่ default.realtime_trips ตรวจสถานะของมัน:

clickhousectl cloud clickpipe list <clickhouse-service-id>
clickhousectl cloud clickpipe get <clickhouse-service-id> <clickpipe-id>

ทำต่อเมื่อไปป์รันอยู่และ snapshot เริ่มต้นได้สร้างตารางเป้าหมายแล้ว

ขั้นที่ 4 — สร้าง materialized view ของ CDC

ก่อนอื่นตรวจสอบตารางต้นทางที่แน่นอน:

clickhousectl cloud service query --id <clickhouse-service-id> --query "
  SELECT database, name, engine
  FROM system.tables
  WHERE name = 'realtime_trips'
"

คาดหวัง: default.realtime_trips ตอนนี้สร้าง incremental materialized view หนึ่งตัว ไม่มี ตัวเลือกให้เลือกหรือไฟล์ที่ต้องแก้:

clickhousectl cloud service query --id <clickhouse-service-id> --query "
CREATE MATERIALIZED VIEW IF NOT EXISTS nyc_tlc_data.realtime_trips_to_taxi_trips_mv
TO nyc_tlc_data.taxi_trips
AS
SELECT
  car_type,
  CAST(vendor_id AS UInt16) AS vendor_id,
  CAST(pickup_datetime AS DateTime('UTC')) AS pickup_datetime,
  CAST(dropoff_datetime AS DateTime('UTC')) AS dropoff_datetime,
  CAST(pickup_location_id AS UInt16) AS pickup_location_id,
  CAST(dropoff_location_id AS UInt16) AS dropoff_location_id,
  CAST(passenger_count AS UInt16) AS passenger_count,
  trip_distance,
  CAST(payment_type AS UInt16) AS payment_type,
  fare_amount,
  tip_amount,
  total_amount,
  'realtime_cdc' AS filename
FROM default.realtime_trips
WHERE _peerdb_is_deleted = 0
"

ใช้ best-practices skill ที่ติดตั้งไว้เพื่อตรวจการออกแบบ:

Use the ClickHouse best-practices skill to review this incremental materialized view.
Confirm why it processes inserted blocks and why FINAL is not part of this append-only path.

ขั้นที่ 5 — พิสูจน์ว่าแถวกำลังเคลื่อนที่

รันสิ่งนี้สองครั้ง ห่างกันประมาณ 15 วินาที:

clickhousectl cloud service query --id <clickhouse-service-id> --query "
  SELECT
    (SELECT count() FROM default.realtime_trips) AS clickpipe_rows,
    (SELECT count() FROM nyc_tlc_data.taxi_trips
      WHERE filename = 'realtime_cdc') AS dashboard_rows
"

ตัวนับทั้งสองควรเพิ่มขึ้น แล้วเปิด localhost:8080 ตั้ง ช่วงเวลาของแดชบอร์ด Ops เป็น 1m และ auto-refresh เป็น 5s

การตรวจสอบความสมบูรณ์

  • log ของตัวเขียนแสดงการ insert ซ้ำ ๆ
  • clickhousectl cloud clickpipe get ... รายงานว่าไปป์รันอยู่
  • ทั้ง default.realtime_trips และจำนวนแถวของแดชบอร์ดเพิ่มขึ้น
  • แดชบอร์ด Ops อัปเดตโดยไม่ต้องรีเฟรชเอง

ไปต่อที่ 04 ClickHouse Agents

ในหน้านี้

Track your progress?

Optional. We email a link to confirm your address; progress records once you open it.

Please use your work email address, not a personal one.

Progress tracking also requires accepting the current Terms of Service in Privacy settings.

TH