ClickhouseProblem & solution
A Quadrillion Rows across three Clouds: scaling LogHouse
Summary
LogHouse now stores 431 PiB of uncompressed data across 1.59 quadrillion rows, spans more than 30 regions across three cloud providers, and serves typical queries in a few hundred milliseconds. The platform grew 23x from 19 PiB in two years, while peak ingestion reached 80 GiB/s and 190 million rows per second. Its write architecture uses local geosharding, multiple cells in busy regions, and ClickHouse Async Inserts to combine small incoming writes into larger parts without overwhelming merges. On the read side, a single Distributed table hides the cell topology, while unavailable shards remain visible by default rather than producing silently incomplete results. Current work includes reducing index and metadata memory, improving async-insert durability, collecting system data from object storage, and expanding OpenTelemetry traces and metrics.
Context
LogHouse’s original model used one ClickHouse instance per region and direct regional connections. That model became difficult to manage as the platform expanded from 19 PiB on a handful of AWS regions to 431 PiB across more than 30 regions and three cloud providers. The write path also faced peaks of 80 GiB/s and 190 million rows per second, while many producers generated small inserts that could create excessive data parts and trigger TOO_MANY_PARTS errors.
Approach / What changed
Writes remain local to their arrival region through geosharding, with additional cells added to busy regions and the source Kubernetes cluster used as a secondary sharding key. ClickHouse Async Inserts buffer rows server-side and flush them as larger parts. A read layer presents the cells through a single Distributed table, concealing the underlying topology; skip_unavailable_shards remains off by default. Planned changes include acknowledged async inserts, adaptive granularity, primary key caching, object-storage-based SysEx scraping, and broader OpenTelemetry ingestion.
Takeaways
Geosharding keeps writes local, avoids cross-region egress costs, and lets regions scale independently; additional cells also limit the blast radius of operational failures.
Async Inserts coalesced roughly 24 otel_logs client inserts into each part and reduced part creation from 290,284 to 12,082 per hour during the stated peak-hour comparison.
The read layer favors complete results by leaving skip_unavailable_shards disabled by default, accepting query failure when a cell is unavailable instead of silently returning incomplete data.
Source and freshness
- Source
- clickhouse.com
- Published
- Added to Yomu
- Last updated
Summaries are generated from the original by a language model. Check the original before relying on it.
Keep reading
Related reading
The Good Stuff
Paid picks we use ourselves. Links carry a referral code — a subscription through one earns us a commission at no extra cost to you.
The best engineering reads, once a week
One useful email. Unsubscribe anytime.