This episode covers tiered storage: separating hot and cold tiers, offloading old segments to object storage like S3 and GCS, remote storage manager configuration, local versus remote retention, and the cost benefits and read latency trade-offs.

Until now, all Kafka data has been stored on broker disks. Long-term retention meant keeping expensive disks and spreading capacity across many brokers. Tiered storage (KIP-405, introduced as early access in Kafka 3.6+) changes this model: older log segments are offloaded to much cheaper object storage.
The concept is simple: hot data that's newly written and frequently read stays on the broker disks (hot tier), while old, rarely accessed segments are moved to S3, GCS, or Azure Blob (cold tier). Consumers can still read cold segments — the broker fetches them from object storage transparently.
Episode 11 covers the hot and cold tier model, how to configure remote storage, local versus remote retention, and the benefits and trade-offs you need to weigh.
A partition has two storage layers:
Movement between tiers is automatic and asynchronous. The broker remains the only access point for clients — applications don't need to know whether data comes from disk or object storage.
Brokers mark closed segments as offload candidates based on their age. A background process copies the segments along with their indexes to object storage, then after successful verification deletes the local copy. If object storage hasn't received a segment yet, the data remains available from the hot tier — there's no availability gap.
With tiered storage, retention is no longer limited by disk cost. You can store years of data at cheap object storage prices and replay the full history whenever needed — something that was previously expensive or impossible. This drives Kafka's use as a long-term system of record.
To enable tiered storage, brokers need a RemoteStorageManager implementation. Kafka provides reference implementations for S3, GCS, and Azure Blob that can be configured via server.properties:
remote.log.storage.system.enable=true
remote.log.storage.manager.class.name=io.kafka.shaded.glue.remote.GlueRemoteStorageManager
remote.log.storage.manager.impl.prefix=remote.storage
remote.storage.bucket.name=my-kafka-logs
remote.storage.region=ap-southeast-1The configuration above uses the AWS Glue storage manager available in Confluent distributions; for open-source Kafka, you write or use a RemoteStorageManager plugin implementing the same interface. The remote.storage.bucket.name value points to the destination bucket, and the region determines the bucket location.
Retention can now be differentiated between local and remote:
local.retention.ms=604800000
remote.retention.ms=-1
log.retention.bytes=-1local.retention.ms=604800000 limits the data stored on broker disks (7 days), while remote.retention.ms=-1 means segments in object storage never expire. With this combination, brokers hold a week of hot data on disk and store the entire history in the cloud indefinitely.
Tiered storage can also be enabled per topic via kafka-configs.sh:
bin/kafka-configs.sh --bootstrap-server localhost:9092 \
--alter --entity-type topics --entity-name orders \
--add-config remote.storage.enable=true,local.retention.ms=86400000Enabling per topic is useful when only part of the data needs long retention — for example an audit topic kept forever, while a metrics topic only needs one day of local retention.
Tip
For workloads dominated by replay reads from cold segments, consider object storage request costs. Make sure remote retention policy aligns with audit and regulation needs, not just "store forever because it's cheap".
When a broker loses its disk or needs to reload data, cold segments aren't lost — the data is still in object storage. A new broker can pull those segments whenever needed, so recovery no longer means losing history. This makes tiered storage an important part of the disaster recovery strategy covered in episode 25.
In this episode 11 you've understood the hot and cold tier model, how to configure a remote storage manager and local versus remote retention, and the cost benefits and latency trade-offs of tiered storage.
The key takeaways:
RemoteStorageManager determines the object storage target (S3, GCS, Azure Blob).local.retention.ms limits data on disk; remote.retention.ms governs data in the cloud.kafka-configs.sh.In the next episode 12 we'll discuss Kafka Connect — a data integration framework for moving data between Kafka and other systems. You'll learn standalone and distributed worker architectures, source and sink connectors, converters and SMTs, and deployment via the REST API.