Case 05. High-volume Event Archive¶
Практикум · Связанная теория · Редакционный стандарт
Тип материала — практический архитектурный кейс. HYPOTHETICAL — все численные параметры, сценарий и схемы. INFERENCE — выбор и критерии. UNKNOWN — фактическая производительность и параметры, которые предстоит согласовать.
1. Business problem¶
Хранить большой поток для дешёвого replay, расследования и ad hoc queries при ограничениях object storage и catalog.
2. Functional requirements¶
Писать Parquet, хранить schema IDs и source offsets, сжимать, публиковать manifests, compact small files и удалять по policy.
3. Non-functional requirements¶
Объём и RTO replay измеряются отдельно от query latency. Reader видит целиком approved generation. Retention зависит от purpose и legal hold.
4. Assumptions и вопросы заказчику¶
Assumption — raw log нужен три дня, архив 90 суток, compressed ratio 4:1. Спросить scan patterns, cardinality tenants, timezone, evolution policy, egress и deletion SLA. UNKNOWN — реальная compression и cloud тарифы.
5. Оценка нагрузки и объёма данных¶
HYPOTHETICAL. Средняя скорость 22000 events/s, пик 44000 events/s, payload mean/p95/p99 800/1500/3000 B. Перцентили заданы отдельно для тестового профиля, среднее используется для объёма. Суточный профиль упрощён до постоянного среднего, накладные расходы протокола, индексов и WAL исключены.
| Метрика | Формула и подстановка | Результат |
|---|---|---|
| Объём событий | 22000 × 86 400 | 1900800000 событий/сутки |
| Сырые данные | 1900800000 × 800 B | 1520.64 GB/сутки |
| Retention без сжатия | 1520.64 GB × 3 суток | 4561.92 GB |
| Broker copies при RF=3 | 4561.92 GB × 3 | 13685.76 GB, из них 9123.84 GB дополнительные копии |
| Producer bandwidth, среднее | 22000 × 800 × 8 / 10⁶ | 140.8 Mbit/s |
| Producer bandwidth, пик | 44000 × 800 × 8 / 10⁶ | 281.6 Mbit/s |
| Partitions при 30% headroom | max(ceil(44000 × 1,3 / 1 500), ceil(44000 × 800 × 1,3 / 1 800 000)) | 39 partitions |
| Consumer parallelism | ceil(44000 × 1,3 / 1 500) | 39 workers на группу при принятой производительности |
| Backfill одних суток при 3× средней capacity и живом среднем потоке | (22000 × 86 400) / (3 × 22000 − 22000) | 43 200 с = 12 ч |
GB и Mbit здесь десятичные. 1 500 events/s на partition/worker и 1,8 MB/s на partition — допущения теста. Для варианта без брокера строки RF/partitions относятся к альтернативному потоку или downstream outbox. RF не моделирует egress каждого consumer: добавьте по одной копии трафика на активную группу и репликационный трафик до RF−1 дополнительных копий. Пересчитайте отдельно при catch-up на пике, skew и p99 payload. Если capacity ≤ live rate, конечного времени восстановления нет.
Архив HYPOTHETICAL: 22 000 × 800 × 86 400 = 1 520,64 GB/сутки. При 4:1 получаем 380,16 GB/сутки, за 90 суток 34 214,4 GB. При 256 MB compressed на файл нижняя оценка ceil(380 160/256) = 1 485 файлов/сутки до дробления по partition. Cost = stored GB × тариф + requests × тариф + scanned GB × тариф + egress + compute. Compaction добавляет временные копии и I/O. RF строки выше относятся к Kafka, storage tier требует собственного overhead.
6. Варианты архитектуры¶
A — append objects по часу и topic с manifest. B — transactional table format поверх объектов с catalog snapshots и compaction. C — raw blobs на событие с простым writer.
7. Сравнение вариантов и выбор¶
Выбрать B при concurrent readers, compaction и schema evolution. A дешевле по метаданным, если один writer и простые queries. C создаёт высокую стоимость запросов и мелких файлов.
8. Component / data-flow¶
Иллюстративная схема выбранного варианта.
flowchart LR
A["Kafka log"] --> B["Partitioned Parquet writer"]
B --> C["Object storage and manifests"]
C --> D["Query and replay jobs"]
9. Normal processing sequence¶
sequenceDiagram
participant A as Kafka log
participant B as Partitioned Parquet writer
participant C as Object storage and manifests
participant D as Query and replay jobs
A->>B: Send identified input
B->>C: Publish files for durable offset interval
C-->>B: Return verified manifest generation
B->>D: Advance only with durable evidence
Buffer по partition/time bucket. Записать Parquet и checksum, проверить source range, затем publish manifest с compare-and-set. Commit offsets после durable evidence либо связывать restart с manifest.
10. Failure / recovery sequence¶
sequenceDiagram
participant B as Partitioned Parquet writer
participant C as Object storage and manifests
participant O as Recovery owner
B->>C: Attempt write or advance
Note over B,C: Writer dies after object upload before manifest
O->>C: Reconcile immutable files and commit generation
C-->>O: Durable outcome or explicit gap
Crash после upload оставляет orphan objects. Новый writer читает committed manifest, повторяет тот же range с deterministic object identity или пишет новую generation. Cleanup только после проверки, что файл вне reachable snapshots и retention window.
11. Data model и contracts¶
Envelope содержит topic, partition, offset, source schema, event time, ingest date и payload. Manifest содержит contiguous offset ranges, file checksum, counts, schema versions и writer generation.
12. Consistency boundaries¶
Object PUT относится к одному объекту. Согласованность многих объектов задаётся publish protocol. Catalog commit и Kafka offsets сверяются отдельно. Reader фиксирует один manifest на запрос.
13. Scaling и capacity planning¶
Для managed S3 посчитать тарифы хранения, запросов и egress. Для MinIO дополнительно оценить диски, сеть, compute, операторское время и запас на rebuild. Коэффициент overhead зависит от фактической схемы защиты данных. Сравнивать варианты на одинаковом retention и тесте восстановления.
Partition по date/hour и ограниченному hash bucket, избегать player/tenant как отдельной директории для sparse workloads. Tune row-group и file size по scan economics. Отдельно измерить compaction headroom.
14. Observability¶
Small-file rate, manifest lag, orphan count, compression ratio, scan amplification, replay capacity и storage growth.
15. Data Quality и reconciliation¶
Сравнить source range coverage без дыр и перекрытий, проверить checksums, counts, field compatibility и selective replay.
16. Security и compliance¶
Разграничить writer, reader и cleanup roles. Encryption, scoped keys, retention, legal hold и доступ к raw PII. Удаление включает backups и catalog snapshots согласно policy.
17. Implementation roadmap¶
Начать с single-writer archive, проверить offset oracle, добавить compaction, lifecycle и периодический restore drill.
18. Testing и acceptance criteria¶
Убить writer между upload и publish, повторить batch, подать evolution с несовместимым типом, проверить orphan cleanup и replay. Критерий — один verified offset range и полное восстановление выбранного cut.
19. Trade-offs и ограничения¶
Большие файлы уменьшают request cost, но повышают задержку закрытия и повтор при сбое. Time partitions ускоряют типовые scans, а skew создаёт малые файлы в редких buckets.
20. Interview questions¶
Почему высокая object-store consistency не решает publication? Публикация многих файлов требует единицы видимости. Когда нужен compaction? Когда фактическая стоимость планирования и мелких запросов превышает стоимость переписывания и storage overlap.
Первичные источники¶
Проверка источников: 2026-11-03. Документация описывает свойства компонентов. Результаты испытаний выбранной системы требуют отдельного evidence.