OperasyonRunbook'lar
ClickHouse analitik deposu ve Kafka ingest
ADR-0026. İkisi de isteğe bağlıdır: ayarlanmadığında sistem Postgres + BullMQ ile eskisi gibi çalışır.
docs/adr/0026-olcek-mimarisi.md. İkisi de isteğe bağlıdır: ayarlanmadığında sistem Postgres + BullMQ ile
eskisi gibi çalışır.
ClickHouse'a geçiş
- Sunucu: yönetilen ClickHouse (Cloud, Altinity) veya kendi kümeniz; HTTP(S) arayüzü açık olmalı. Yerelde
npm run infra:install+npm run infra:up(26.8 LTS, http://127.0.0.1:8123). - Ayarlar (API ve worker):
CLICKHOUSE_URL,CLICKHOUSE_USER,CLICKHOUSE_PASSWORD(gizli),CLICKHOUSE_DATABASE. - Şema:
npm run ch:migrate(TTL'lerRETENTION_*_DAYSdeğerlerinden). Geri alma:npm run ch:migrate:down --workspace @pushizo/db. - Outbox'ı aç:
npm run ch:outbox:enable. Bu andan itibarendeliveries,delivery_events,events,conversionsdeğişikliklerianalytics_outbox'a yazılır; workeranalytics-syncişi (5 sn) ClickHouse'a aktarır. - Geçmiş veri:
npm run ch:backfill --workspace @pushizo/db -- --from=2026-07-01(saklama süresi kadar geriye). Gün gün outbox'a ekler ve aktarır; tekrar çalıştırmak güvenlidir (ReplacingMergeTree sürümü). - Karşılaştırma:
ANALYTICS_STORE=dual— raporlar iki depodan okunur, Postgres sonucu döner; fark %0,5'i aşarsaanalytics_store_mismatch_total{method,reason}artar ve uyarı loglanır. En az bir hafta sıfır fark beklenir. - Geçiş: org bazında
analytics.clickhousefeature flag'i (admin → Feature flag'ler) veya tümü içinANALYTICS_STORE=clickhouse. Geri dönüş:ANALYTICS_STORE=postgres(anında; veri Postgres'te de durur).
İzleme
| Sinyal | Eşik / anlam |
|---|---|
select count(*), min(enqueued_at) from analytics_outbox | Birikim; en eski satır > 30 sn ise aktarım geride (plan kabulü: p95 < 30 sn) |
Worker logu analytics-sync hataları | ClickHouse erişimi/parolası; satırlar outbox'ta bekler, kayıp yok |
analytics_store_mismatch_total | dual modunda sıfır olmalı |
ClickHouse system.mutations | Silme (KVKK, saklama) mutasyonlarının tamamlanması |
Silme ve saklama
- Kullanıcı/app silme, kuruluş saklama süresi ve olay tanımı saklaması Postgres'te
DELETEile yapılır; tetikleyici satırı outbox'a yazar, aktarım kaynakta bulamadığı satırı ClickHouse'tan da siler (lightweight DELETE). - Genel saklama süresi Postgres'te bölüm düşürülerek uygulanır (tetikleyici çalışmaz): bakım işi aynı kesimi ClickHouse'ta da uygular; tablolar ayrıca aynı değerde TTL taşır. Dönüşümler TTL'sizdir (gelir raporu; kullanıcı bağı anonimleştirilir).
Kafka ingest (isteğe bağlı)
- Küme: yönetilen Kafka (MSK, Confluent, Aiven) veya yerelde
npm run infra:install -- --kafka+npm run infra:up(Kafka 4.0 KRaft, 127.0.0.1:9092). - Ayarlar:
INGEST_BUS=kafka,KAFKA_BROKERS, gerekiyorsaKAFKA_SSL=true,KAFKA_SASL_MECHANISM,KAFKA_USERNAME,KAFKA_PASSWORD(gizli). Konu (KAFKA_EVENTS_TOPIC, varsayılanevents.raw) yoksaKAFKA_EVENTS_PARTITIONSbölümle oluşturulur; anahtarapp_id(app içi sıra korunur). - Davranış: API olayları konuya yazar ve 202 döner;
eventskuyruğunu işleyen worker grubu tüketir, Postgres'eon conflict do nothingile ekler, yeni olaylar için işleme işi ve canlı akış yayını yapar. Ofset Postgres yazımı başarılı olunca işlenir (en az bir kez; tekrar teslim idempotent). - İzleme:
ingest_events_total{result=inserted|invalid}, tüketici grubu gecikmesi (kafka-consumer-groups.sh --describe --group pushizo-events). - Geri dönüş:
INGEST_BUS=bullmqile API yeniden Postgres'e doğrudan yazar; konuda kalan mesajlar workerINGEST_BUS=kafkaile bir kez daha başlatılarak tüketilir (idempotent).
Hücreler (veri yerleşimi EU/TR): kurulum, bölge taşıma, temizlik, DR
ADR-0032. Hücre, kendi Postgres/Redis/ClickHouse/S3'ü ve API/worker dağıtımı olan tam bir Pushizo kurulumudur. Bir hücre (CONTROL_PLANE_MODE=true) aynı zamanda kontrol düzlemidir: org → hücre eşlemesi (org_regions),…
Go dispatcher
ADR-0026 §3. Push gönderimini (APNs, FCM, HMS, Web Push) Go servisine (services/dispatcher) taşır; render, sahiplenme ve sonuç uygulama worker'da kalır. İsteğe bağlıdır ve anında geri alınır: DISPATCHER_GO_CHANNELS…