Kafka Tiered Storage Configuration
Tiered storage (KIP-405) enables Kafka to offload log segments to remote storage systems, enabling cost-effective long-term retention while maintaining local storage for recent data.
Version Requirement
Tiered storage is an early access feature in Apache Kafka 3.6+. Production readiness varies by release.
Architecture Overview
Section titled “Architecture Overview”Storage Tiers
Section titled “Storage Tiers”| Tier | Storage | Retention | Access Pattern |
|---|---|---|---|
| Local (Hot) | Broker disk | local.retention.ms | Frequent reads |
| Remote (Cold) | Object storage | retention.ms | Infrequent reads |
Enabling Tiered Storage
Section titled “Enabling Tiered Storage”Broker Configuration
Section titled “Broker Configuration”# Enable tiered storageremote.log.storage.system.enable=true
# Remote storage manager plugin (implementation-specific)remote.log.storage.manager.class.name=com.example.kafka.remote.RemoteStorageManagerremote.log.storage.manager.class.path=/opt/kafka/plugins/tiered-storage
# Remote log metadata managerremote.log.metadata.manager.class.name=org.apache.kafka.server.log.remote.metadata.storage.TopicBasedRemoteLogMetadataManager
# Metadata topic configurationremote.log.metadata.topic.num.partitions=50remote.log.metadata.topic.replication.factor=3
# Reader and copier threadsremote.log.reader.threads=10remote.log.copier.threads=10Topic Configuration
Section titled “Topic Configuration”# Enable tiered storage for topickafka-configs.sh --bootstrap-server kafka:9092 \ --entity-type topics \ --entity-name events \ --alter \ --add-config remote.storage.enable=true
# Configure local retention (hot tier)kafka-configs.sh --bootstrap-server kafka:9092 \ --entity-type topics \ --entity-name events \ --alter \ --add-config local.retention.ms=86400000 # 1 day local
# Configure total retention (including remote)kafka-configs.sh --bootstrap-server kafka:9092 \ --entity-type topics \ --entity-name events \ --alter \ --add-config retention.ms=2592000000 # 30 days totalRemote Storage Backends
Section titled “Remote Storage Backends”Plugin required
Apache Kafka does not ship an object store implementation. You must install a remote storage manager plugin and use its class name and config keys.
Amazon S3 (Vendor Plugin Example)
Section titled “Amazon S3 (Vendor Plugin Example)”# S3 Remote Storage Manager configurationremote.log.storage.manager.class.name=io.confluent.kafka.tiered.storage.s3.S3RemoteStorageManager
# S3 bucketremote.log.storage.s3.bucket.name=my-kafka-tiered-storageremote.log.storage.s3.region=us-east-1
# Authentication (use IAM roles when possible)remote.log.storage.s3.credentials.provider.class=com.amazonaws.auth.DefaultAWSCredentialsProviderChain
# Or explicit credentials (not recommended)# remote.log.storage.s3.access.key=AKIAXXXXXXXX# remote.log.storage.s3.secret.key=XXXXXXXX
# S3 settingsremote.log.storage.s3.endpoint.override= # For S3-compatible storageremote.log.storage.s3.path.style.access.enabled=falseGoogle Cloud Storage (Vendor Plugin Example)
Section titled “Google Cloud Storage (Vendor Plugin Example)”# GCS Remote Storage Manager configurationremote.log.storage.manager.class.name=io.confluent.kafka.tiered.storage.gcs.GCSRemoteStorageManager
# GCS bucketremote.log.storage.gcs.bucket.name=my-kafka-tiered-storageremote.log.storage.gcs.project.id=my-project
# Authenticationremote.log.storage.gcs.credentials.path=/etc/kafka/gcs-credentials.jsonAzure Blob Storage (Vendor Plugin Example)
Section titled “Azure Blob Storage (Vendor Plugin Example)”# Azure Blob Remote Storage Manager configurationremote.log.storage.manager.class.name=io.confluent.kafka.tiered.storage.azure.AzureBlobRemoteStorageManager
# Azure containerremote.log.storage.azure.container.name=kafka-tiered-storageremote.log.storage.azure.account.name=mystorageaccount
# Authenticationremote.log.storage.azure.account.key=XXXXX# Or use managed identityremote.log.storage.azure.use.managed.identity=trueTopic-Level Configuration
Section titled “Topic-Level Configuration”Retention Settings
Section titled “Retention Settings”| Setting | Description |
|---|---|
remote.storage.enable | Enable tiered storage for topic |
local.retention.ms | Time to retain locally before tiering |
local.retention.bytes | Size to retain locally per partition |
retention.ms | Total retention (local + remote) |
retention.bytes | Total size retention per partition |
Example Configurations
Section titled “Example Configurations”High-Volume Event Stream:
# 6 hours local, 90 days totalkafka-configs.sh --bootstrap-server kafka:9092 \ --entity-type topics \ --entity-name events \ --alter \ --add-config remote.storage.enable=true,\local.retention.ms=21600000,\retention.ms=7776000000Audit Log (Long Retention):
# 1 day local, 7 years totalkafka-configs.sh --bootstrap-server kafka:9092 \ --entity-type topics \ --entity-name audit-log \ --alter \ --add-config remote.storage.enable=true,\local.retention.ms=86400000,\retention.ms=220752000000Size-Based Tiering:
# 10GB local, 1TB total per partitionkafka-configs.sh --bootstrap-server kafka:9092 \ --entity-type topics \ --entity-name large-events \ --alter \ --add-config remote.storage.enable=true,\local.retention.bytes=10737418240,\retention.bytes=1099511627776Metadata Management
Section titled “Metadata Management”Tiered storage maintains metadata about remote segments in an internal Kafka topic.
Metadata Topic Configuration
Section titled “Metadata Topic Configuration”# Metadata topic settingsremote.log.metadata.topic.num.partitions=50remote.log.metadata.topic.replication.factor=3remote.log.metadata.topic.retention.ms=-1
# Metadata manager settingsremote.log.metadata.manager.listener.name=INTERNALremote.log.metadata.custom.metadata.max.bytes=1024Metadata Operations
Section titled “Metadata Operations”# Metadata initialization timeoutremote.log.metadata.manager.impl.prefix=rlmm.config.rlmm.config.remote.log.metadata.topic.replication.factor=3
# Metadata consumption settingsremote.log.metadata.consume.wait.ms=120000Performance Tuning
Section titled “Performance Tuning”Thread Configuration
Section titled “Thread Configuration”# Segment upload threads (per broker)remote.log.copier.threads=10
# Segment download threads (for consumer reads)remote.log.reader.threads=10
# Expiration threads (deleting expired remote segments)remote.log.manager.expiration.threads=10
# Task queue sizeremote.log.manager.task.queue.max.size=100
# Retry settingsremote.log.manager.task.retry.backoff.ms=100remote.log.manager.task.retry.max.attempts=5Upload Settings
Section titled “Upload Settings”# Minimum segment age before uploadremote.log.copy.segment.age.threshold.ms=30000
# Interval between upload checksremote.log.manager.copier.task.interval.ms=30000
# Upload batch sizeremote.log.segment.copy.max.batch.size=100Read Settings
Section titled “Read Settings”# Prefetch for remote readsremote.log.reader.fetch.max.bytes=52428800
# Cache for remote segments (optional, implementation-specific)remote.log.storage.cache.size.bytes=1073741824remote.log.storage.cache.dir=/var/kafka/remote-cacheMonitoring
Section titled “Monitoring”Key Metrics
Section titled “Key Metrics”| Metric | Description |
|---|---|
RemoteLogManager.RemoteCopyLagBytes | Bytes pending upload |
RemoteLogManager.RemoteCopyLagSegments | Segments pending upload |
RemoteLogManager.RemoteReadRequestsPerSec | Remote read rate |
RemoteLogManager.RemoteReadBytesPerSec | Remote read throughput |
RemoteLogManager.RemoteCopyBytesPerSec | Upload throughput |
RemoteLogManager.RemoteDeleteLagBytes | Bytes pending deletion |
JMX Beans
Section titled “JMX Beans”kafka.log.remote:type=RemoteLogManager,name=*kafka.log.remote:type=RemoteStorageManager,name=*kafka.log.remote:type=RemoteLogMetadataManager,name=*Alerting Thresholds
Section titled “Alerting Thresholds”| Metric | Warning | Critical |
|---|---|---|
RemoteCopyLagBytes | > 1GB | > 10GB |
RemoteCopyLagSegments | > 10 | > 100 |
RemoteReadRequestsPerSec | Baseline +50% | Baseline +100% |
Operational Considerations
Section titled “Operational Considerations”Storage Costs
Section titled “Storage Costs”| Storage Type | Cost Factor | Access Cost |
|---|---|---|
| Local SSD | High $/GB | None |
| S3 Standard | Low $/GB | Per request |
| S3 Infrequent Access | Lower $/GB | Higher per request |
| S3 Glacier | Lowest $/GB | High + retrieval time |
Migration Strategy
Section titled “Migration Strategy”- Enable on new topics first - Test with non-critical workloads
- Gradual rollout - Enable per topic, monitor impact
- Adjust local retention - Start conservative, reduce gradually
- Monitor consumer latency - Remote reads add latency
Limitations
Section titled “Limitations”| Limitation | Description |
|---|---|
| Compacted topics | Not supported with tiered storage |
| Consumer lag | Remote reads increase fetch latency |
| Transactions | Transactional data must complete before tiering |
| Partition reassignment | Remote segments must be considered |
Troubleshooting
Section titled “Troubleshooting”Common Issues
Section titled “Common Issues”| Issue | Cause | Solution |
|---|---|---|
| High copy lag | Slow uploads | Increase copier threads |
| Failed uploads | Network/permission issues | Check remote storage connectivity |
| Slow remote reads | High consumer lag | Add read threads, consider caching |
| Metadata issues | Metadata topic problems | Check replication, monitor topic |
Diagnostic Commands
Section titled “Diagnostic Commands”# Check remote log manager statuskafka-log-dirs.sh --bootstrap-server kafka:9092 \ --describe \ --topic-list events
# List remote segments (implementation-specific)# Check remote storage directly for segment inventoryLog Analysis
Section titled “Log Analysis”# Check for tiered storage errorsgrep -i "remote" /var/log/kafka/server.log | grep -i "error"
# Check upload progressgrep -i "RemoteLogManager" /var/log/kafka/server.logRelated Documentation
Section titled “Related Documentation”- Configuration Overview - Configuration guide
- Broker Configuration - Broker settings
- Topic Configuration - Topic settings
- Performance - Performance tuning
- Cloud Deployments - Cloud storage integration