• डेटा recovery और regulatory compliance के लिए archived_at कॉलम-आधारित soft delete अक्सर इस्तेमाल किया जाता है, लेकिन समय के साथ इसकी जटिलता और अक्षमता बढ़ती जाती है
  • यह तरीका query, index, migration, और restore logic को जटिल बनाता है, और क्योंकि ज़्यादातर archived data फिर कभी पढ़ा नहीं जाता, यह database पर अनावश्यक load डालता है
  • विकल्प के तौर पर application event-आधारित archiving, trigger-आधारित archiving, और WAL(Change Data Capture)-आधारित archiving सुझाए गए हैं
  • हर तरीके में operational complexity, infrastructure requirements, और restore की आसानी के मामले में अंतर है, और खास तौर पर WAL-आधारित तरीके में Kafka जैसे external systems के साथ integration की ज़रूरत होती है
  • नए प्रोजेक्ट के लिए trigger-आधारित approach को सरलता और maintainability के लिहाज़ से सबसे संतुलित विकल्प माना गया है

Soft delete की समस्याएँ

  • आम तौर पर डेटा को logical रूप से delete करने के लिए deleted boolean या archived_at timestamp कॉलम का इस्तेमाल किया जाता है
    • अगर ग्राहक ने गलती से डेटा delete कर दिया हो तो recovery संभव रहती है
    • कुछ मामलों में regulatory या audit purposes के लिए data retention भी ज़रूरी होता है
  • लेकिन archived_at कॉलम query, operations, और application code में व्यापक जटिलता पैदा करता है
    • archived data का बड़ा हिस्सा दोबारा पढ़ा ही नहीं जाता
    • API behavior की समस्याओं या automation tools (Terraform आदि) की वजह से लाखों अनावश्यक rows जमा हो सकती हैं
  • अगर archived data cleanup का काम configure न किया जाए तो database backup और restore के समय performance गिरती है
  • query और index में archived data को filter करना पड़ता है, और data leak का जोखिम रहता है
  • migration के दौरान पुराने data को handle करना या default values बदलना मुश्किल हो जाता है
  • restore logic जटिल हो जाता है, और जहाँ external system calls की ज़रूरत हो वहाँ bug आने की संभावना रहती है
  • नतीजतन archived_at तरीका ऊपर से सरल दिखता है, लेकिन लंबी अवधि में इसकी maintenance cost ज़्यादा होती है

Application level archiving

  • delete के समय event publish किया जाता है, उसे SQS में भेजा जाता है, और दूसरी service उसे S3 में archive करती है
  • फायदे
    • primary database और application code दोनों सरल हो जाते हैं
    • external resource cleanup को asynchronous processing के ज़रिए संभालकर performance और reliability बेहतर की जा सकती है
    • JSON के रूप में serialize करके application-friendly structure में archive किया जा सकता है
  • नुकसान
    • application code में bug होने पर archived data loss हो सकता है
    • message queue जैसी operational infrastructure complexity बढ़ती है
    • S3 में रखा archived data इस्तेमाल करने के लिए search और restore tools की ज़रूरत होती है

Trigger-आधारित archiving

  • delete से पहले trigger row को अलग archive table में JSON रूप में copy कर देता है
    • उदाहरण table: archive(id, table_name, record_id, data, archived_at, caused_by_table, caused_by_id)
  • foreign key delete(cascade) के समय delete के कारण को track करने के लिए session variables(archive.cause_table, archive.cause_id) का इस्तेमाल होता है
    • इससे यह पता लगाया जा सकता है कि किस parent record ने child data को delete किया
  • फायदे
    • live tables साफ-सुथरे रहते हैं, archived_at कॉलम की ज़रूरत नहीं रहती
    • archive table cleanup (WHERE archived_at < NOW() - INTERVAL '90 days') सरल होता है
    • query और index की efficiency बनी रहती है, और migration सरल हो जाती है
    • backup का आकार कम होता है
  • archive tables को अलग tablespace या time partitioning के साथ manage किया जा सकता है

WAL(Change Data Capture)-आधारित archiving

  • PostgreSQL के WAL logs को पढ़कर delete events को external systems तक stream किया जाता है
    • प्रमुख tool: Debezium (Kafka के साथ integration)
    • उदाहरण path: PostgreSQL → Debezium → Kafka → Consumer → Archive Storage
  • हल्के विकल्प
    • pgstream: WAL को सीधे webhook या message queue तक भेजता है
    • wal2json: WAL को JSON में output करता है
    • pg_recvlogical: PostgreSQL का built-in logical replication tool
  • operational complexity
    • Kafka-आधारित setup में monitoring, incident response, और tuning की ज़रूरत होती है
    • अगर consumer धीमा हो जाए तो WAL files जमा हो सकती हैं → disk space खत्म होने का जोखिम
    • PostgreSQL 13+ में max_slot_wal_keep_size setting से इसे सीमित किया जा सकता है
    • replication slot lag की monitoring और alerts अनिवार्य हैं
  • फायदे
    • application code बदले बिना सभी changes capture किए जा सकते हैं
    • कई destinations(S3, data warehouse, search index) तक stream किया जा सकता है
    • primary database पर अतिरिक्त load नहीं पड़ता
  • नुकसान
    • operational complexity और infrastructure cost अधिक होती है
    • consumer lag होने पर data loss या re-synchronization की ज़रूरत पड़ सकती है
    • schema changes के समय source और consumer के बीच coordination ज़रूरी होता है

Deletes को handle न करने वाले replica का विचार

  • DELETE queries को ignore करने वाले PostgreSQL replica को बनाए रखने का विचार रखा गया है
    • delete न हुआ सारा data लगातार जमा करके archive किया जा सकता है
    • archived data पर सीधे query चलाई जा सकती है
  • संभावित समस्याएँ
    • delete information को अलग से पहचानना मुश्किल हो सकता है
    • migrations लागू करते समय conflict का जोखिम
    • storage space और operational cost बढ़ना

निष्कर्ष

  • नए प्रोजेक्ट्स में trigger-आधारित archiving सबसे व्यावहारिक विकल्प है
    • इसे configure करना आसान है, और live tables साफ रहते हैं
    • अलग infrastructure के बिना भी archived data को देखना और manage करना आसान है
  • अगर जटिल infrastructure पहले से मौजूद हो या multiple destinations पर streaming चाहिए, तो WAL-आधारित approach अधिक उपयुक्त है

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.