Delegating durability  / field guide
Practitioner field guide · September 2026

The disks never disappear: what "diskless" systems actually delete

Since 2023 a generation of production systems has replaced replicated local disks with object storage as the durability layer: Kafka-compatible streams, serverless Postgres, search engines, observability stores. This guide reconstructs the shape they converge on, the argument the Kafka community had about it for ten and a half months, what it costs, and where it has already broken in production.

30 primary sources 9 production systems 4 postmortems Evidence through September 2026 Read: ~22 min
01

The territory

Keeping bytes alive when machines die, priced two ways, and the pattern that moved the answer into someone else's building.

24×
S3 vs the EBS it replaces, per stored GiB after replication
~400ms
p99 of one 4 MiB S3 PUT; the default produce latency of a diskless stream
Inter-AZ replication fees alone vs the entire diskless replacement's infrastructure, in one published TCO
100%
Of R2 writes failing for 67 minutes when one rotation flag was omitted

Strip the technology names and the problem is old: data must survive the death of the machine that wrote it. The classical answer is three copies on three disks in three failure domains, maintained by the database itself. In the cloud, that answer bills you twice. The disks cost roughly four times what the equivalent object storage does before you even triple them (EBS gp3 at $0.08/GiB-month against S3's $0.02 post-replication, per WarpStream's 2023 analysis), and the replication traffic between availability zones is metered per gigabyte. WarpStream's published TCO worksheet makes the second charge vivid: a 3-AZ open-source Kafka cluster at $20,252 a month, of which $14,765 is inter-zone networking, nearly five times the $2,961 their entire replacement runs on.

So a generation of systems stopped maintaining the three copies and handed the job to the provider's object store, which already keeps them. WarpStream shipped a Kafka-compatible service with no data-path disks in 2023; Confluent's Freight clusters followed with a direct-write mode in 2024; Aiven's KIP-1150 put the same idea into Apache Kafka itself, surviving a ten-and-a-half-month argument to a 9-binding-vote acceptance on March 2, 2026. Outside streaming the same move shows up in Neon's Postgres storage, turbopuffer's search engine, Datadog's Husky, and SlateDB, an embedded LSM whose only storage is a bucket. The sources use three names for one pattern: "Zero Disk Architecture", "diskless", "object-storage-native". This guide calls it delegating durability, because that is the actual transaction.

The finding this guide leads with

Read the designs side by side and the disks never disappear. Every system in the public record that "deleted its disks" kept a small, strongly consistent ordering core, and it is usually the most conventional component imaginable. Aiven's diskless Kafka is leaderless at the data layer, and its FAQ then says the quiet part plainly: "there is still a central coordinator, specifically the 'Batch Coordinator,' for metadata management, which is currently backed by PostgreSQL." To remove Kafka's disks, they added a relational database. What the pattern deletes is the fleet of data-path disks; what remains is coordination, and that remainder sets the latency floor, the availability ceiling, and more of the bill than the marketing suggests.

Figure 1 · Who has delegated durability, and for what

Embedded engines

Search and observability

Transactional Postgres

Event streaming

data path

data path

data path

history only,
never the commit

data + consensus
via CAS

data path

everything,
manifest included

WarpStream (2023)

Kafka diskless topics
KIP-1150 (accepted 2026)

Confluent Freight (2024)

Neon / Lakebase

turbopuffer

Datadog Husky

SlateDB

Object storage
S3 / GCS / Azure Blob

Embedded engines

Search and observability

Transactional Postgres

Event streaming

data path

data path

data path

history only,
never the commit

data + consensus
via CAS

data path

everything,
manifest included

WarpStream (2023)

Kafka diskless topics
KIP-1150 (accepted 2026)

Confluent Freight (2024)

Neon / Lakebase

turbopuffer

Datadog Husky

SlateDB

Object storage
S3 / GCS / Azure Blob

Every arrow replaces a set of replicated local disks. Every system on the left also kept a consistent coordinator that does not appear in its headline. Sources: WarpStream, KIP-1150, Confluent, Neon, turbopuffer, Datadog, SlateDB.
Diagram source

Scope. This guide covers systems that make object storage the primary durability layer for live, online writes: streams, OLTP, search, observability. It deliberately excludes lakehouse table formats and their query engines (Iceberg, Delta), tiered storage that only moves cold data, multi-region and multi-cloud designs, and self-hosted object stores. It also stays on the write and coordination paths; read-path cache design gets one section-worth of attention, not the full treatment it deserves.

02

How it is actually built

Four components recur in every published implementation. Three are celebrated. The fourth is the one that pages you.

Figure 2 · The reference shape

Stateless data plane

one PUT per batch

commit batch
coordinates

find batches

merge small objects,
restore locality

Clients

Writer
buffers ~250 ms / 8 MB

Reader
AZ-local cache

Object store
merged multi-partition objects

Ordering core
SQL DB / state machine /
disk quorum / manifest CAS

Compactor, async

Stateless data plane

one PUT per batch

commit batch
coordinates

find batches

merge small objects,
restore locality

Clients

Writer
buffers ~250 ms / 8 MB

Reader
AZ-local cache

Object store
merged multi-partition objects

Ordering core
SQL DB / state machine /
disk quorum / manifest CAS

Compactor, async

Reconstructed from Inkless's architecture doc, WarpStream's docs, Husky's deep dive and SlateDB's design overview. The ordering core is the component each system implements differently; section 03 is about that box.
Diagram source

The stateless data plane. Because no node owns any data, any node can serve any partition. WarpStream's agents are explicitly "stateless and leaderless"; any agent can sequence for any topic or coordinate any consumer group. Datadog's Husky readers "are stateless and can be scaled up or down without issues". The operational dividend is real and measured: ShareChat reports running WarpStream with plain autoscaling and no StatefulSets, and puts the migration's savings at 58-60% against multi-AZ Kafka in their joint case study. Node replacement stops being a data operation; Inkless notes a returning broker is "immediately back in ISR" because there is nothing to catch up.

The batching buffer. Object stores price by request, so nobody writes records; everybody writes merged batches. Inkless flushes every 250 ms or 8 MB, whichever comes first, and combines produce requests from many clients, and many partitions, into one object. WarpStream's default batch timeout is likewise 250 ms. SlateDB's RFC 0008 states the reason at the level of principle: "Group commit is essential." This buffer is not an optimisation of the design. It is the design; every latency and cost property downstream is set by it, which is why section 03 treats the flush interval as a first-class architectural decision.

The ordering core. An object store will keep your bytes but it will not tell two writers who came first at any useful rate. Every system therefore keeps a strongly consistent component that assigns order, and the four published implementations span an entire design space. Inkless commits batch coordinates "in a linear order" to PostgreSQL. WarpStream runs a proprietary replicated state machine in its control plane, and its docs are precise about the consequence: after the S3 upload succeeds, "the file does not exist in WarpStream until this step is completed even though the data has already been made durable in object storage." Neon refuses to put even that much on the write path: a commit is a Paxos quorum of safekeepers on NVMe, and object storage only ever receives history asynchronously. And since AWS shipped conditional writes (If-None-Match, August 2024), the store itself can be the coordinator: SlateDB fences writers through compare-and-swap on a manifest, and turbopuffer "even drives consensus with object storage through conditional writes", per their CMU talk. The catch is throughput: turbopuffer measured a single contended object at roughly 5 compare-and-swap writes per second, since strong consistency forces each ~200 ms operation to be non-overlapping in time.

The async compactor. Batching for cheap writes means one object carries many partitions, which is a terrible layout for reading one partition. Every system runs a background process that re-merges objects into read-friendly ones: Inkless brokers merge recent objects "to improve the locality of data in each partition", Husky's compactors do streaming k-way merges over fragments, SlateDB compacts its L0 into sorted runs. Compaction is where the read path's economics are actually decided, and it is also a second full client of both the object store and the ordering core.

One more element is easy to miss because it lives in client configuration rather than in a service: zone-aware routing. Inkless hashes each partition to one broker per availability zone and steers clients to their local zone, because a diskless cluster that lets clients talk across zones has quietly reinstated the per-gigabyte bill it was built to remove. The cross-zone charge does not go away; it goes to whoever stops paying attention to it.

Where implementations genuinely diverge: Neon is the documented dissent. Its founding decision was to split the WAL service (consensus, disks, quorum) from the page service, and its Lakebase-era write-up keeps the boundary sharp: "queries do not read object storage", and a read from it "can take hundreds of milliseconds", so S3 appears only inside the pageserver when reconstructing history. Snowflake's NSDI '20 paper is the ancestor of the whole pattern, S3 for persistence with local ephemeral storage recovering the performance, and Confluent's Kora paper documents the half-step, tiering cold segments to object storage while the write path stays on replicated disks. The 2023-2026 wave is best read as those two ideas colliding on the write path itself.

03

The decisions that matter

Three forks recur in every design record, and the Kafka community spent most of 2025 arguing all three in public.

Decision 1: where does a write become durable?

Chosen (diskless camp)
  • Ack only after the object store accepts the batch. WarpStream, Inkless, Freight, SlateDB's default all wait for the PUT.
  • Why: zero data-path disks, zero inter-AZ replication, durability inherited from the store's own multi-AZ replication.
Rejected (by them; chosen by Neon)
  • Replicate to a quorum of your own disks first, drain to the store later. Neon's safekeepers, AutoMQ's EBS WAL, Slack's KIP-1176.
  • Their stated reason for rejecting it: it keeps the stateful fleet and the replication bill the pattern exists to delete.
Flips when
  • The p99 write budget drops below ~100 ms. AutoMQ ships both and quotes the spread: S3 WAL ~500 ms end-to-end, EBS WAL sub-10 ms.
  • The workload is an OLTP commit path. Neon's refusal is not conservatism; it is the same cost-benefit run with a different latency constraint.

Decision 2: who assigns order?

Chosen (multi-writer systems)
  • A dedicated coordinator: PostgreSQL (Inkless), a replicated state machine (WarpStream), a Kafka-internal topic (KIP-1164's plan), a metadata store (Husky).
Rejected for the general case
  • Compare-and-swap directly on the store. Loses at scale: ~5 sequenced writes per second per contended object, by turbopuffer's measurement.
Flips when
  • There is one writer, or ordering traffic is rare. Then S3's own conditional writes suffice: SlateDB's manifest fencing, Morling's leader election, turbopuffer's queue file. Since August 2024 the external coordinator is a throughput decision, no longer an existence requirement.

Decision 3: how often do you flush?

Chosen
  • ~250 ms / 8 MB, the default in both Inkless and WarpStream, giving p99 produce latencies in the 400 ms range on standard S3.
Rejected
  • Flushing at disk-like cadence. Aiven's FAQ: below ~10 ms intervals and ~100 KB objects "cost grows exponentially, and can exceed the cost of Classic topics."
Flips when
  • The economics of the fast tier move. S3 Express One Zone PUTs are ~1/5th the price of standard PUTs, and April 2025 cut its storage 31% and GETs 85%; WarpStream measured 33 ms median produce on it. The right flush interval is a function of the provider's current price sheet, so it has a revision date.
Latency is priced in dollars here

On replicated disks, latency is an engineering property; you buy better hardware once and tune. On object storage, producer latency is a metered rate: halving the flush interval doubles the PUT count, which WarpStream's own tuning docs describe plainly as "a tradeoff between cost and latency". Budget latency like a line item, and re-quote it whenever the provider's request pricing changes, as it did in April 2025.

The third decision has a public history worth reading in full, because it is rare to watch an open-source community adjudicate an architecture in writing. KIP-1150 was published in April 2025; within months Slack's KIP-1176 proposed the opposite shape (keep leaders, push the active segment to fast storage), AutoMQ's KIP-1183 proposed a third, and the discussion stalled badly enough that an August 2025 wiki document, "The Path Forward for Saving Cross-AZ Replication Costs KIPs", existed just to summarise the deadlock. Jack Vanlightly's October 2025 essay called it what it was: "the Kafka project finds itself at a fork in the road where choosing the right path forward for implementing S3 topics has implications for the long-term success of the project." The resolution was synthesis rather than victory: KIP-1150's second revision absorbed KIP-1176's idea by delegating long-term storage to the existing tiered-storage abstraction, KIP-1183's authors withdrew in its favour, and the vote passed in March 2026 with the implementation KIPs (1163, 1164) still being argued. Note what the accepted KIP also rejected, in writing: dropping classic topics entirely, because low-latency workloads still need disks, and the do-nothing option, because the cross-AZ bill is the dominant complaint of cloud Kafka operators.

Figure 3 · Three years of argument, compressed

2023
WarpStream ships zero-disk
Kafka-compatible service

2024
Confluent Freight adds
direct-write mode

Apr 2025
KIP-1150 Diskless Topics
published by Aiven

Mid 2025
KIP-1176 (Slack) and
KIP-1183 (AutoMQ) compete

Aug 2025
Deadlock. A 'Path Forward' doc
summarises three stalled KIPs

Oct 2025
KIP-1150 v2 absorbs tiered storage,
KIP-1183 withdraws

Mar 2026
Vote passes, 9 binding votes.
KIP-1163 / 1164 still open

2023
WarpStream ships zero-disk
Kafka-compatible service

2024
Confluent Freight adds
direct-write mode

Apr 2025
KIP-1150 Diskless Topics
published by Aiven

Mid 2025
KIP-1176 (Slack) and
KIP-1183 (AutoMQ) compete

Aug 2025
Deadlock. A 'Path Forward' doc
summarises three stalled KIPs

Oct 2025
KIP-1150 v2 absorbs tiered storage,
KIP-1183 withdraws

Mar 2026
Vote passes, 9 binding votes.
KIP-1163 / 1164 still open

The pattern shipped commercially two and a half years before the open-source community accepted its direction, and the implementation is still being debated after acceptance. Sources: Aiven, Vanlightly, Instaclustr.
Diagram source
DecisionChosenRejectedBecauseFlips whenEvidence
Durability pointAck after object-store PUTQuorum of own disks firstDeletes stateful fleet + inter-AZ feesp99 budget < ~100 ms; OLTP commit pathKIP-1150, Neon
OrderingDedicated coordinatorCAS on the storeCAS caps at ~5 writes/s per objectSingle writer or rare ordering opsturbopuffer, Inkless FAQ
Flush cadence~250 ms / 8 MBDisk-like cadenceCost grows exponentially below ~10 msFast-tier pricing moves (Apr 2025)Inkless FAQ, AWS
Storage tierStandard S3S3 Express One ZoneSingle-AZ durability; storage premiumLatency-sensitive WAL only; post-cut pricingVanlightly 2023, WarpStream 2024
Long-term layoutDelegate to tiered-storage abstractionNew compaction subsystem in KIP-1150 v1Reuse beat reinvention in reviewYou are not inside Kafka; then you own compactionVanlightly
Client routingZone-aware, deterministic per-AZ ownerAny client, any brokerOtherwise cross-AZ fees return via clientsSingle-AZ deploymentsInkless
Coordinator placement3 AZs, replicated, alwaysCoordinator in one zone"You still need at least three AZs" for brokers and coordinatorNever, per every published designInkless FAQ

Figure 4 · Choosing a durability point, as a decision tree

500 ms is fine

~50-100 ms

< 10 ms

yes

no

p99 write budget?

Direct to standard S3
batch ~250 ms
(WarpStream, Inkless, Freight)

single-AZ durability
acceptable for the WAL?

Disk or quorum WAL in front
(Neon safekeepers, AutoMQ EBS WAL,
classic Kafka topics)

Low-latency object tier
(S3 Express One Zone,
WarpStream: 33 ms median)

500 ms is fine

~50-100 ms

< 10 ms

yes

no

p99 write budget?

Direct to standard S3
batch ~250 ms
(WarpStream, Inkless, Freight)

single-AZ durability
acceptable for the WAL?

Disk or quorum WAL in front
(Neon safekeepers, AutoMQ EBS WAL,
classic Kafka topics)

Low-latency object tier
(S3 Express One Zone,
WarpStream: 33 ms median)

Derived from the flips-when columns above; every terminal is a configuration someone runs in production today (AutoMQ's pluggable WAL ships three of them behind one API).
Diagram source
04

What broke in production

Four failure classes cover every published incident this hunt found, and none of them is "the object store lost my bytes".

The striking absence first: no public postmortem in this corpus attributes an incident to data loss inside the delegated layer, an object acknowledged and later gone. Every published failure is an availability or coordination failure. That reads two ways, either the durability delegation genuinely works, which the providers' design points support, or such loss would be silent and nobody would have noticed, which Inkless concedes in its FAQ ("data would indeed be lost"). Both readings argue for the same control: an independent reconciliation job that compares the ordering core's index against what is actually in the bucket. Nobody's architecture page shows that job. Build it anyway.

What does break is instructive, because it maps exactly onto what the pattern kept and what it newly depends on. A sequence view of the common write path shows the seam every incident below runs through:

Figure 5 · The write path, and the seam it fails along

Ordering coreObject storeStateless agentProducerOrdering coreObject storeStateless agentProducerbuffer ~250 ms / 8MBbytes durable, order unassigned,ack withheldalt[coordinator healthy][coordinator unreachable]produce(records)PUT merged object200 OK, durable (~400 ms p99)commit batch coordinatesoffsets assignedacktimeoutretriable error / backpressure
Ordering coreObject storeStateless agentProducerOrdering coreObject storeStateless agentProducerbuffer ~250 ms / 8MBbytes durable, order unassigned,ack withheldalt[coordinator healthy][coordinator unreachable]produce(records)PUT merged object200 OK, durable (~400 ms p99)commit batch coordinatesoffsets assignedacktimeoutretriable error / backpressure
Durability and existence are separate steps: the batch can be safely in the bucket while the system cannot admit it exists. Reconstructed from WarpStream's architecture docs; their delayed sequencing work exists precisely to soften this seam.
Diagram source

Class 1 · The provider's control plane is your data plane

Postmortem

One abuse ticket disabled the storage layer

AssumptionThe object store is a constant; only its data plane can fail.
What happenedDuring routine abuse remediation of one phishing URL, a Cloudflare operator's action disabled the entire R2 Gateway service instead of the offending bucket.
Blast radius59 minutes, all of R2, plus every product built on it: Stream and Images at 100% failure.
FixThe ability to disable systems was removed from the abuse-review tooling; API-level restrictions on internal accounts.
Design ruleDelegated durability inherits the provider's human processes, not just its hardware. Your replication factor is irrelevant to an operator's dropdown. Decide in advance whether a one-hour total storage outage is survivable, and if not, that is the multi-bucket or multi-provider requirement, stated honestly.
Postmortem

A rotation missed one flag; writes failed for 67 minutes

AssumptionCredential rotation is maintenance, not a deploy.
What happenedNew R2 Gateway credentials went to a development environment because "--env production" was omitted; the old production credentials were then deleted per procedure.
Blast radius1h07m: 100% of R2 writes, ~35% of reads, globally. Root cause found 58 minutes in.
FixTwo-engineer sign-off on high-impact credential changes; health validation before deleting the old credential.
Design ruleThe credential with which you reach the durability layer is part of the durability design. Rotate like you deploy: canary, validate the new path end to end, then revoke. This is the machine-identity failure mode wearing a storage costume.

Class 2 · The coordinator you kept

Postmortem

The metadata store's DNS emptied itself

AssumptionThe managed coordination store (DynamoDB, for many such systems) is more available than anything we could run.
What happenedA latent race between two DNS Enactor automations let a stale plan overwrite a newer one; cleanup then deleted the active plan, wiping DynamoDB's regional endpoint records.
Blast radius~3 hours of DynamoDB unavailability in us-east-1, ~15 hours of cascade through EC2 and dependent services, on October 19-20, 2025.
FixAWS disabled the DNS automation worldwide pending safeguards against stale-plan application.
Design ruleIn a zero-disk system the ordering core is the availability bottleneck; the bucket being up is necessary and nowhere near sufficient. Either engineer an ack mode that tolerates coordinator absence (WarpStream's delayed sequencing acks after durability, sequences later) or write the correlated-outage assumption into your SLO maths.
Postmortem

The 2017 warning: S3's own index was the coordinator

AssumptionRemoving a bit of capacity is routine; subsystems restart cleanly.
What happenedA playbook command with a mistyped input removed too many servers, taking down the index subsystem that "manages the metadata and location information of all S3 objects in the region"; a full restart was required.
Blast radiusRoughly four hours of S3 unavailability in us-east-1, February 28, 2017, including AWS's own status dashboard. Subsystems that size had not been fully restarted "for many years".
FixCapacity-removal tooling gained rate limits and minimum-capacity floors; cell-based partitioning of the index accelerated.
Design ruleEven the delegated layer is itself a metadata service in front of disks; you inherit its regional blast radius. Know your behaviour during a multi-hour regional storage outage: how long can writers buffer in memory, and do you degrade to read-only deliberately (SlateDB's max_unflushed_bytes does exactly this) or by surprise?

Class 3 · The quota you cannot see

Account

Throttled by a neighbour prefix you never wrote to

AssumptionS3 scales transparently; the documented 3,500 PUT/s per prefix is a floor you get immediately.
What happenedRate limits start bucket-wide; S3 partitions a hot prefix onto its own capacity only after sustained load, returning 503 SlowDown while it repartitions. One practitioner account documents a high-traffic workflow degraded exactly this way, with low-traffic prefixes throttled by a hot neighbour.
Blast radiusElevated 503s and latency for the duration of the ramp; no fixed number, which is the point: the quota and its warm-up are invisible.
FixGradual ramp-up, key layouts that spread load across prefixes, exponential backoff treated as backpressure rather than error.
Design ruleObject key layout is capacity planning. A zero-disk system's partition-to-prefix mapping decides its burst headroom, and a load test that starts cold tells you nothing about steady state, or vice versa.
SourcePractitioner account; limits per AWS docs

Class 4, recorded but not yet public: quiet cost regressions

The fourth class appears in design docs as a fear rather than in postmortems as an event: the configuration change that multiplies request count without breaking anything. Aiven documents the cliff (sub-10 ms intervals, sub-100 KB objects, cost "can exceed the cost of Classic topics"); SlateDB's RFCs treat PUT cost as a failure mode to design against. No one has published the incident review for a surprise six-figure request bill, which almost certainly means it is being written up as a finance story, not an engineering one. Treat request-count-per-byte as an SLI with an alert, the way you treat error rate.

Sources: Inkless FAQ, SlateDB RFC 0008

05

Numbers you can plan against

Everything quantitative this hunt produced, with status: measured, claimed, or derived. Prices move; every row carries its date.

MetricValueStatusContextAs ofSource
S3 Standard storage$0.023/GB-moVendor priceus-east-1, first 50 TB; already replicated2026-09AWS pricing
S3 Standard PUT$0.005/1,000Vendor priceThe unit your flush interval buys2026-09AWS pricing
EBS gp3 storage$0.08/GiB-moReportedPre-replication; x3 for a replicated system2023WarpStream
Inter-AZ share of Kafka TCO$14,765 of $20,252/moClaimed (worked example)3-AZ OSS Kafka; replacement infra $2,961/mo2023WarpStream TCO
Produce p99, standard S3~400 msReported4 MiB PUT p99; default 250 ms batching2024WarpStream docs
Produce, S3 Express One Zone33 ms med / 50 ms p99Vendor benchmarkLowest-latency configuration2024WarpStream
End-to-end, S3 WAL vs EBS WAL~500 ms vs <10 msVendor figureSame system, pluggable WAL backends2025AutoMQ docs
S3EOZ price cuts-31% / -55% / -85%Vendor priceStorage / PUT / GET, effective 2025-04-102025-04AWS
CAS throughput on one object~5 writes/sMeasured~200 ms/op, non-overlapping by consistency2025turbopuffer
Warm vs cold queryp50 8 ms vs p90 444 msReportedNVMe/RAM cache hit vs S3 read, 1M vectors2025turbopuffer
Migration savings58-60% / 21-27%Case studyvs multi-AZ / single-AZ Kafka, logging workload2025ShareChat
Per-prefix request ceiling3,500 PUT / 5,500 GET per sVendor documentedAfter S3 partitions the prefix; gradual2026-09AWS docs
Cost of halving flush interval~2x PUT spendDerivedPUT count scales inversely with interval2026-09arithmetic below

A model small enough to keep in your head. One writer flushing every 250 ms makes 4 PUTs a second, about 10.5 million a month, which at $0.005 per thousand is roughly $52 a month (derived; 4 x 2,629,800 seconds x $0.000005). Drop the interval to 25 ms for snappier producers and the same writer costs ~$520 a month before it has stored a byte; run 40 such writers and the request bill alone clears $20k a year. The two variables that dominate everything are flush interval and writer count; storage volume, the number everyone models first, is usually third. What this model excludes: GET traffic (read-path and compaction), the ordering core's own infrastructure, and cross-AZ charges you reintroduce through careless client routing.

Read these carefully

The 24x and 5x headline ratios and the TCO worksheet are WarpStream's own, published while selling the alternative; no independent replication of that worksheet exists in the public record. ShareChat's percentages are the strongest cost evidence here because a customer put their name on them. The latency figures are consistent across three independent implementations (WarpStream, AutoMQ, Aiven's defaults), which is why this guide treats "hundreds of milliseconds on standard S3" as corroborated rather than claimed.

06

The evidence wall

Every source behind this page, graded. The full ledger with per-claim quotes ships alongside as sources.md.

Postmortem Cloudflare2025-03

Cloudflare incident on March 21, 2025

Credential rotation for the R2 Gateway deployed to the wrong environment; 100% of writes and ~35% of reads failed for 1h07m. Root cause: one omitted CLI flag.

Carry forwardRotation of the credentials that reach your storage layer is a production deploy; validate the new path before revoking the old.
blog.cloudflare.com/cloudflare-incident-march-21-2025
Postmortem Cloudflare (via InfoQ)2025-02

R2 Gateway disabled during abuse remediation

An operator action against one phishing report disabled the whole R2 Gateway for 59 minutes; every R2-dependent product went with it.

Carry forwardThe provider's internal tooling is part of your failure model; replication factor does not cover it.
infoq.com/news/2025/03/cloudflare-incident-r2
Postmortem AWS2025-10

DynamoDB service disruption, us-east-1

A race between DNS automation instances emptied DynamoDB's endpoint records: ~3h of metadata-store unavailability, ~15h cascade. The exact failure shape a zero-disk system's ordering core is exposed to.

Carry forwardModel the coordinator's outage separately from the bucket's; they fail independently and the coordinator fails more.
aws.amazon.com/message/101925
Postmortem AWS2017-03

S3 service disruption, us-east-1

A mistyped capacity-removal command took out the index subsystem holding metadata for every object in the region; recovery required restarts not exercised for years.

Carry forwardYou inherit the store's regional blast radius; decide your buffering and read-only behaviour for a multi-hour outage in advance.
aws.amazon.com/message/41926
Source Aiven / Inkless2025-2026

Inkless FAQ and architecture docs

The KIP-1150 reference implementation's own docs: PostgreSQL batch coordinator, 250 ms / 8 MB batching, three-AZ DR requirement, and the exponential cost cliff below 10 ms flush intervals.

Carry forward"Leaderless" describes the data path only; the metadata path has a leader and a database.
github.com/aiven/inkless/docs/inkless/FAQ.md
Source Apache Kafka dev list2025-08

[DISCUSS] The Path Forward for Saving Cross-AZ Costs KIPs

The recorded argument: three simultaneous KIPs, a two-month stall, and the thread that forced a synthesis. The closest thing this domain has to a rejected-PR record.

Carry forwardWhen three teams propose three architectures for one bill, the bill is the requirement; read all three rejection rationales.
mail-archive.com/dev@kafka.apache.org/msg151181
Source SlateDB2025

PR #260: the durability-semantics review

The transactions RFC whose review thread surfaced the commit-vs-durability split on object storage and spawned RFC 0008.

Carry forwardOn object storage, "committed" and "durable" separate cleanly; decide which your ack means before users decide for you.
github.com/slatedb/slatedb/pull/260
ADR Apache Kafka2025-04

KIP-1150: Diskless Topics

The accepted proposal, with rejected alternatives recorded: dropping classic topics (low-latency workloads still need disks), per-cluster diskless, doing nothing.

Carry forwardEven the diskless camp's own ADR keeps disks for latency-critical topics; the pattern is a per-workload choice, not a platform migration.
cwiki.apache.org/.../KIP-1150
ADR Slack / Apache Kafka2025

KIP-1176: Tiered Storage for Active Log Segment

The competing design: keep partition leaders and replication semantics, route the active segment through fast shared storage so followers stop crossing AZs. ~40% claimed savings.

Carry forwardYou can attack the cross-AZ bill without going leaderless; the flip is how much of Kafka's semantics you need to keep.
cwiki.apache.org/.../KIP-1176
ADR SlateDB2025

RFC 0008 (sync commit) and RFC 0009 (separate WAL store)

Two records of the same physics: S3's floor latency defeats any flush interval, so RFC 0009 adds a second, faster object store for the WAL alone; RFC 0008 designs the buffering and read-only fallback for when the store misbehaves.

Carry forward"Even if flush_interval is set to an extremely low value, it can't overcome the inherent latency of the underlying object store."
github.com/slatedb/slatedb/rfcs/0009-separate-wal.md
Case study ShareChat2025

Cost-effective logging at scale

A named customer's measured outcome: 58-60% cheaper than multi-AZ Kafka, 21-27% cheaper than single-AZ, with autoscaled stateless agents replacing StatefulSets.

Carry forwardThe realistic savings band for a latency-tolerant workload is 20-60%, not the 10x of vendor headlines; the spread is your AZ topology.
warpstream.com/blog/cost-effective-logging-at-scale
Blog WarpStream2023-2025

Cloud disks are expensive; TCO breakdown; delayed sequencing

The cost case (24x storage ratio, the $20,252 worksheet) and the availability refinement: ack after durability, sequence lazily, so the metadata store leaves the critical path.

Carry forward"The file does not exist... until this step is completed even though the data has already been made durable."
warpstream.com/blog/warpstream-benchmarks-and-tco
Blog Neon2025

WAL + S3: Lakebase storage

The documented dissent: commits are a Paxos quorum of NVMe safekeepers; object storage holds history and is never on the query path, because its reads take hundreds of milliseconds.

Carry forwardFor OLTP, delegate the archive, not the commit; the same cost analysis with a 10 ms budget yields the opposite architecture.
neon.com/blog/wal-s3-lakebase-storage-for-the-era-of-agents
Blog turbopuffer2025

A distributed queue in a single JSON file on object storage

The measured ceiling of store-as-coordinator: ~5 conditional writes per second on one object at ~200 ms each, and the stateless-broker design that recovered 10x tail latency.

Carry forwardS3 CAS is a real consensus primitive with a hard ~5 ops/s/key budget; spend it on fencing and manifests, not on per-record ordering.
turbopuffer.com/blog/object-storage-queue
Blog Datadog2022-2023

Husky: the same shape at observability scale

Writers upload to blob storage then commit to a metadata store that is "the strongly consistent source of truth"; readers and compactors are stateless around it.

Carry forwardConvergent evolution across four domains is the strongest evidence the reference shape is real and not one vendor's story.
datadoghq.com/blog/engineering/husky-deep-dive
Blog Jack Vanlightly2023-2025

A fork in the road; S3EOZ, not quite what I hoped for; Neon analysis

The independent analyst's through-line: the 2023 disappointment with Express One Zone's pricing, the mechanics of Neon's quorum, and the 2025 essay framing the Kafka KIP contest as a fork with project-level stakes.

Carry forwardFollow one rigorous outsider across a domain and you get the connective tissue no vendor will write.
jack-vanlightly.com/.../a-fork-in-the-road
Blog Gunnar Morling2024-08

Leader election with S3 conditional writes

Within weeks of the If-None-Match launch: a working lock and leader-election scheme on bare S3, correctness argued from strong read-after-write consistency.

Carry forwardThe August 2024 header quietly deleted a whole component class (external lock services) from new designs at low coordination rates.
morling.dev/blog/leader-election-with-s3-conditional-writes
Blog Olsen Budanur2024

S3 is lying to you: hidden rate limits

First-person account of the per-prefix quota's warm-up behaviour degrading a high-traffic workflow: limits start bucket-wide, isolation arrives only after S3 repartitions.

Carry forwardDesign the key space for the request rate you will have, not the one you launch with.
medium.com/@olsenbudanur/s3-is-lying-to-you
Paper Snowflake / Cornell2020

Building an Elastic Query Engine on Disaggregated Storage (NSDI '20)

The ancestor: persistent data on S3, described as reliable and cheap but not fast, with local ephemeral storage recovering performance. The 2023-2026 wave applies the same bargain to the write path.

Carry forwardThe cache tier is not an optimisation of this pattern; it is the other half of it.
usenix.org/conference/nsdi20/presentation/vuppalapati
Paper Confluent2023

Kora: A Cloud-Native Event Streaming Platform for Kafka (VLDB '23)

The half-step, documented rigorously: write to local disks, tier aging segments to object storage, shrink local volumes to ease rebalancing. Best industry paper.

Carry forwardTiering fixes elasticity and storage cost but not the replication bill; that gap is why direct-write architectures exist.
vldb.org/pvldb/vol16/p3822-povzner.pdf
Talk turbopuffer / CMU2026-03

Object storage-native database for search (CMU DB seminar)

Eskildsen on the full design: consensus through conditional writes, tiered NVMe/RAM cache for sub-10 ms warm queries, and the economics that make search viable at trillion-document scale.

Carry forwardThe claimed scale figures (1T+ documents) are the vendor's own; the architecture reasoning stands independently of them.
youtube.com/watch?v=pqoRNwNaxfs
Talk ShareChat / Current 20252025

Cost-effective logging at scale (conference session)

The case study presented by the team that ran the migration, with the operational detail (agent roles, autoscaling behaviour) the written version compresses.

Carry forwardCustomer conference talks are the audit trail for vendor case studies; watch for what the blog post left out.
youtube.com/watch?v=4FCuYXTgLrI
Vendor AWS2024-2025

Conditional writes; S3EOZ price cuts; performance guidance

The three provider moves that reshaped this space: If-None-Match (Aug 2024), the April 2025 Express One Zone cuts, and the documented per-prefix request model.

Carry forwardThis architecture's decision table has a dependency on the provider's roadmap; date every choice you derive from it.
aws.amazon.com/.../amazon-s3-conditional-writes
Vendor Confluent2025

Freight clusters are generally available

Kora evolved to a direct-write mode, bypassing local storage and broker replication, sold as "up to 90% cheaper" for relaxed-latency workloads. A claim, not a measurement, and labelled as such here.

Carry forwardWhen the incumbent that published the tiered-storage paper ships direct-write two years later, the argument has been conceded.
confluent.io/blog/freight-clusters-are-generally-available
07

Build a miniature, then productionise it

Seven rungs from an evening toy to something with the production pattern's actual failure modes. Any S3-compatible store works; real S3 teaches the real latency.

Feel the floor

A key-value store that PUTs and GETs single JSON objects, timing every operation and printing a running histogram.

Done when: you have a day of p50/p99 numbers for 1 KB and 4 MB objects.  Teaches: the latency floor no flush interval can beat, per SlateDB RFC 0009.

Batch, and meter the bill

A write-ahead log that buffers records and flushes every N ms or M bytes. Emit a counter of PUTs and compute the monthly dollar cost at list price alongside your latency histogram.

Done when: one chart shows cost and p99 moving oppositely as you sweep N from 1000 ms to 10 ms.  Teaches: latency as a line item, the pattern's central trade.

Fence with conditional writes

Two competing writer processes, one manifest object, If-None-Match and If-Match arbitrating which one holds the pen. Kill and restart them randomly.

Done when: an hour of kill-loops produces zero interleaved writes, and you can state the CAS ops/sec you achieved.  Teaches: the store as coordinator, and its ~5 ops/s ceiling.

Add the ordering core

Multiple writers upload batches concurrently; a coordinator (SQLite or Postgres) assigns offsets to uploaded objects in commit order. Now kill a writer after its PUT succeeds but before its commit lands.

Done when: your reconciler finds the orphaned object and either admits or deletes it, deterministically.  Teaches: durable-but-nonexistent, the seam in figure 5.

Build the read path's cache

A reader that serves from a local disk cache, fetching misses from the store with readahead. Measure cold-start against warm steady state.

Done when: you can show the cold/warm gap (expect two orders of magnitude, per turbopuffer's 8 ms vs 444 ms).  Teaches: why cache eviction policy is availability policy here.

Hurt it

A proxy in front of the store that injects 503 SlowDown bursts, 5-minute total outages, and latency spikes. Watch your buffer grow; implement the bounded-buffer to read-only degradation SlateDB's RFC 0008 specifies.

Done when: a 5-minute store outage loses zero acknowledged writes and recovers unattended.  Teaches: that your real durability guarantee is buffer-depth times outage-length.

Run the compactor, close the loop

A background merger that rewrites small multi-stream objects into per-stream sorted ones, updating the coordinator transactionally, while writes continue. Then re-run rung 6's chaos against it.

Done when: read amplification drops measurably and chaos still loses nothing.  Teaches: compaction as a second full tenant of both store and coordinator.

08

Keep hunting

The queries that found this material, grouped by what they surface. The domain vocabulary ("diskless", "zero disk", "batch coordinator") is the key that opens it.

Designs and their arguments

  • KIP-1150 diskless topics rejected alternatives
  • "batch coordinator" PostgreSQL diskless kafka
  • site:github.com slatedb rfcs synchronous commit durability
  • safekeepers why not write WAL directly to S3
  • "zero disk architecture" S3 inter-AZ cost

Failure and limits

  • S3 "SlowDown" 503 rate limit prefix production "we"
  • cloudflare R2 outage postmortem credential rotation
  • "aws.amazon.com/message" outage summary DynamoDB DNS
  • object storage queue conditional writes "writes per second"

Costs with numbers attached

  • warpstream TCO "inter-zone networking" breakdown
  • S3 Express One Zone price reduction PUT request
  • kafka "cost calculator" cross-AZ replication brutal

Practitioner accounts

  • sharechat warpstream logging case study savings
  • husky datadog object storage metadata store compaction
  • turbopuffer CMU talk object storage search
09

References

  1. WarpStream, Cloud Disks are (Really!) ExpensiveWarpStream blog, 2023. Checked 2026-09-03.
  2. WarpStream, How WarpStream Reduces Kafka Infrastructure Costs: A TCO BreakdownWarpStream blog, 2023. Checked 2026-09-03.
  3. WarpStream, ArchitectureWarpStream docs, 2024. Checked 2026-09-03.
  4. WarpStream, Low Latency ClustersWarpStream docs, 2024. Checked 2026-09-03.
  5. WarpStream, The Art of Being Lazy(log)WarpStream blog, 2025. Checked 2026-09-03.
  6. WarpStream, S3 Express One Zone Benchmark and TCOWarpStream blog, 2024. Checked 2026-09-03.
  7. WarpStream and ShareChat, Cost-Effective Logging at ScaleCase study, 2025. Checked 2026-09-03.
  8. ShareChat, Cost-Effective Logging at Scale (Current 2025 session)Confluent Current, 2025. Checked 2026-09-03.
  9. Apache Kafka, KIP-1150: Diskless TopicsApache wiki, 2025-04-16, accepted 2026-03-02. Checked 2026-09-03.
  10. Apache Kafka, KIP-1176: Tiered Storage for Active Log SegmentApache wiki, 2025. Checked 2026-09-03.
  11. Apache Kafka, The Path Forward for Saving Cross-AZ Replication Costs KIPsApache wiki, 2025-08. Checked 2026-09-03.
  12. dev@kafka.apache.org, [DISCUSS] The Path Forward for Saving Cross-AZ Costs KIPsMailing list, 2025-08-05. Checked 2026-09-03.
  13. Aiven, KIP-1150 Accepted, and the Road AheadAiven blog, 2026-03. Checked 2026-09-03.
  14. Aiven, The Hitchhiker's Guide to Diskless KafkaAiven blog, 2025. Checked 2026-09-03.
  15. Aiven, Diskless 2.0: Unified, Zero-Copy Apache KafkaAiven blog, 2025. Checked 2026-09-03.
  16. Aiven, Inkless FAQGitHub, 2025-2026. Checked 2026-09-03 (raw fetch).
  17. Aiven, Inkless ArchitectureGitHub, 2025-2026. Checked 2026-09-03 (raw fetch).
  18. SlateDB, RFC 0008: Synchronous Commit and DurabilityGitHub, 2025. Checked 2026-09-03 (raw fetch).
  19. SlateDB, RFC 0009: Separate Object Store for WALGitHub, 2025. Checked 2026-09-03 (raw fetch).
  20. SlateDB, An Object-Native LSM for Online Systemsslatedb.io, 2024. Checked 2026-09-03.
  21. SlateDB, PR #260: transactions RFC and durability discussionGitHub, merged 2025-07-10. Checked 2026-09-03.
  22. Neon, WAL + S3: Lakebase storage for the era of agentsNeon blog, 2025. Checked 2026-09-03.
  23. Neon, Architecture decisions in NeonNeon blog, 2022. Checked 2026-09-03.
  24. Jack Vanlightly, Neon: Serverless PostgreSQL (ASDS ch. 3)jack-vanlightly.com, 2023-11-15. Checked 2026-09-03.
  25. Jack Vanlightly, A Fork in the Road: Deciding Kafka's Diskless Futurejack-vanlightly.com, 2025-10-22. Checked 2026-09-03.
  26. Jack Vanlightly, S3 Express One Zone, not quite what I hoped forjack-vanlightly.com, 2023-11-29. Checked 2026-09-03.
  27. turbopuffer, fast search on object storageturbopuffer blog, 2023, updated. Checked 2026-09-03.
  28. turbopuffer, How to build a distributed queue in a single JSON file on object storageturbopuffer blog, 2025. Checked 2026-09-03.
  29. Simon Eskildsen, turbopuffer: Object Storage-native Database for SearchCMU Database Group seminar, 2026-03-09; companion post at turbopuffer.com. Checked 2026-09-03.
  30. Datadog, Introducing HuskyDatadog engineering, 2022. Checked 2026-09-03. See also the ingestion deep dive and compaction post.
  31. Povzner et al., Kora: A Cloud-Native Event Streaming Platform for KafkaVLDB 16(12), 2023. Checked 2026-09-03.
  32. Vuppalapati et al., Building an Elastic Query Engine on Disaggregated StorageUSENIX NSDI, 2020; talk at YouTube. Checked 2026-09-03.
  33. AWS, Amazon S3 adds new functionality for conditional writesAWS What's New, 2024-08. Checked 2026-09-03.
  34. AWS, Up to 85% price reductions for Amazon S3 Express One ZoneAWS News Blog, 2025-04. Checked 2026-09-03.
  35. AWS, Amazon S3 pricingaws.amazon.com, current. Checked 2026-09-03.
  36. AWS, Best practices design patterns: optimizing Amazon S3 performanceAWS docs, current. Checked 2026-09-03.
  37. Olsen Budanur, S3 is Lying to You: The Hidden Rate Limits That Degraded a High-Traffic WorkflowMedium, 2024. Checked 2026-09-03.
  38. AWS, Summary of the Amazon S3 Service Disruption in the Northern Virginia (US-EAST-1) Regionaws.amazon.com, 2017-03. Checked 2026-09-03.
  39. AWS, Summary of the Amazon DynamoDB Service Disruption in US-EAST-1aws.amazon.com, 2025-10. Checked 2026-09-03.
  40. Cloudflare, Cloudflare incident on March 21, 2025Cloudflare blog, 2025-03. Checked 2026-09-03.
  41. InfoQ, Cloudflare R2 incident of February 6, 2025InfoQ, 2025-03, reporting Cloudflare's incident report. Checked 2026-09-03.
  42. Gunnar Morling, Leader Election With S3 Conditional Writesmorling.dev, 2024-08. Checked 2026-09-03.
  43. AutoMQ, WAL StorageAutoMQ docs, 2025. Checked 2026-09-03. Analysis: KIP-1150 and a better solution.
  44. Confluent, Freight Clusters are Generally AvailableConfluent blog, 2025. Checked 2026-09-03.
  45. Stanislav Kozlovski, How KIP-1150 Diskless Topics makes Kafka stateless2minutestreaming, 2025. Checked 2026-09-03.
  46. Instaclustr, Kafka "Diskless": Proposals, Status and InsightsInstaclustr docs, 2026. Checked 2026-09-03.