03 Managed Postgres CDC
สร้าง Postgres ที่ ClickHouse จัดการให้และ ClickPipe ด้วย clickhousectl แล้วป้อนแถวสดเข้าตารางแท็กซี่
ผลลัพธ์
ในเวลาประมาณ 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.pemworkshop_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