पाठ 14 / 25

Retention और Log Compaction

डेटा कितनी देर रहे यह नियंत्रित करें और "प्रति key ताज़ा मान" topics के लिए compaction उपयोग करें।

उम्र से हटाएँ या ताज़ा रखें

डिफ़ॉल्ट cleanup.policy=delete के साथ पुराने log segments retention.ms (डिफ़ॉल्ट 7 दिन) के बाद या partition के retention.bytes पार करने पर हटाए जाते हैं। cleanup.policy=compact के साथ Kafka कम से कम हर key का ताज़ा record रखता है और अंततः पुराने हटाता है; key वाला और null value वाला record (एक "tombstone") उस key को हटाता है। Compaction स्थिति-जैसे topics (user profiles, configuration, किसी table का changelog) के लिए ठीक है। Retention प्रति topic है और kafka-configs.sh से कभी भी बदली जा सकती है। याद रखें: storage = प्रतिदिन डेटा × retention दिन × replication factor।

Retention बदलना और compacted topic बनाना, चलाकर

मैंने ये असली broker पर चलाए। पहला orders पर 24 घंटे की retention तय करता है; दूसरा cleanup.policy=compact के साथ user-profile बनाता है और describe output पुष्टि करता है।

kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics \
  --entity-name orders --alter --add-config retention.ms=86400000
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name orders --describe

kafka-topics.sh --bootstrap-server localhost:9092 --create --topic user-profile \
  --partitions 1 --replication-factor 1 --config cleanup.policy=compact

Output:

Completed updating config for topic orders.
Dynamic configs for topic orders are:
  retention.ms=86400000 sensitive=false synonyms={DYNAMIC_TOPIC_CONFIG:retention.ms=86400000}
Created topic user-profile.

Compaction क्या रखती है, और storage का आकार, चलाकर

Compaction प्रति key ताज़ा मान रखती है और जिन keys का ताज़ा मान tombstone (None) है उन्हें हटाती है: यहाँ u2 हटता है और u1, u3 अपने आख़िरी मान रखते हैं। आख़िरी पंक्ति: प्रतिदिन 40 GB, 7 दिन, 3 replicas के लिए 840 GB चाहिए।

from collections import OrderedDict
log = [("u1", "a"), ("u2", "b"), ("u1", "c"), ("u3", "d"), ("u2", None), ("u1", "e")]
latest = OrderedDict()
for k, v in log:
    latest.pop(k, None)
    latest[k] = v
print({k: v for k, v in latest.items() if v is not None})

daily_gb, days, rf = 40, 7, 3
print(daily_gb * days * rf, "GB")

Output:

{'u3': 'd', 'u1': 'e'}
840 GB

त्वरित जाँच: Compacted topic पर key और null value वाला record क्या करता है?

  • कुछ नहीं करता
  • Key की प्रतिलिपि बनाता है
  • Topic हटाता है
  • उस key को हटाने के लिए चिह्नित करता है (tombstone)
Answer

उस key को हटाने के लिए चिह्नित करता है (tombstone) — Tombstone compaction को बताता है कि अंततः उस key को पूरी तरह हटाना है।