Current state: Discussion
Discussion thread: here
Vote thread: here
JIRA: KAFKA-19893
PR: https://github.com/apache/kafka/pull/20913
Currently, Kafka's tiered storage implementation uploads all non-active local log segments to remote storage immediately, even when they are still within the local retention period.
This results in redundant storage of the same data in both local and remote tiers.
When there is no requirement for real-time analytics or immediate consumption from remote storage. It has the following drawbacks:
1. Wastes storage capacity and costs: The same data is stored twice during the local retention window
2. Provides no immediate benefit: During the local retention period, reads prioritize local data, making the remote copy unnecessary
Example Scenario:
Consider a topic with:
- Local retention: 1 day (24 hours)
- Remote retention: 7 days (168 hours)
Currently, data is stored in both tiers for the first 24 hours, resulting in 24 hours of
redundant storage. With typical data volumes, this can lead to significant cost increases.
However, some users/topics rely on remote storage for real-time analytics and need the
latest data to be available as soon as possible. Therefore, this optimization should be
offered as an **optional configuration** rather than the default behavior.
This KIP introduces one new broker configuration property: remote.log.metadata.topic.min.isr
Type: short Default: 2 Valid Values: atLeast(1) Importance: LOW Documentation: The minimum number of replicas that must acknowledge a write to remote log metadata topic. |
When the __remote_log_metadata topic is created, the topic-level configuration (min.insync.replicas) will be set to the value of the configure.
You can refer to https://github.com/apache/kafka/pull/20811 for the detailed changes.
Configuration Loading:
public static final String REMOTE_LOG_METADATA_TOPIC_MIN_ISR_PROP = "remote.log.metadata.topic.min.isr"; public static final String REMOTE_LOG_METADATA_TOPIC_MIN_ISR_DOC = "The minimum number of replicas that must acknowledge a write to remote log metadata topic"; public static final short DEFAULT_REMOTE_LOG_METADATA_TOPIC_MIN_ISR = 2; |
The new configuration will be added to TopicBasedRemoteLogMetadataManagerConfig, the configuration will be validated to ensure it does not exceed the replication factor.
Topic Creation:
topicConfigs.put(TopicConfig.CLEANUP_POLICY_CONFIG, TopicConfig.CLEANUP_POLICY_DELETE); topicConfigs.put(TopicConfig.REMOTE_LOG_STORAGE_ENABLE_CONFIG, "false"); topicConfigs.put(TopicConfig.MIN_IN_SYNC_REPLICAS_CONFIG, Short.toString(rlmmConfig.metadataTopicMinIsr())); //add the configure return new NewTopic(rlmmConfig.remoteLogMetadataTopicName(), rlmmConfig.metadataTopicPartitionsCount(), rlmmConfig.metadataTopicReplicationFactor()).configs(topicConfigs); |
When TopicBasedRemoteLogMetadataManager creates the __remote_log_metadata topic, it will include the min.isr configuration:
Backward Compatibility
This change is fully backward compatible:
1. Existing Deployments: Clusters with an existing __remote_log_metadata topic will continue to operate unchanged. The topic's current min.insync.replicas setting (typically inherited from the broker default) will remain in effect.
2. New Deployments: Only clusters enabling Tiered Storage for the first time, after upgrading to the release containing this change will automatically receive min.isr=2 for the topic.
3. Protocol Compatibility: No changes
4. Rolling Upgrade: The cluster can be upgraded using standard rolling upgrade procedures without special considerations due to the topic only be created once.
Step 1: Check Current Configuration
kafka-configs.sh --bootstrap-server localhost:9092 --describe --topic __remote_log_metadata
Step 2: Update Configuration if need. The change takes effect immediately and requires no restart.
If the current min.isr is 1 and replication.factor is 3 or higher:
kafka-configs.sh --bootstrap-server localhost:9092 --alter --topic __remote_log_metadata --add-config min.insync.replicas=2
We can use follow tests to cover the change:
Unit Tests:
* Verify that NewTopic includes min.insync.replicas configuration
Integration Tests:
* Create __remote_log_metadata topic with default configuration
* Verify topic can be created with custom replication.factor and min.isr
This another approach is maintaining the current default of min.isr=1, It was rejected for the following reasons:
1. Security by Default Principle
Kafka should provide secure defaults for critical internal topics. The current default of min.isr=1 creates an unacceptable data loss risk that most users will not proactively address.
2. Inconsistency with other critical metadata topics
The __transaction_state topic explicitly sets min.isr=2 via transaction.state.log.min.isr, There is no justifiable reason for treating remote log metadata differently.