Categories
Database Backup

> Discover why standard VM snapshots cause data corruption in transactional databases like PostgreSQL and SQL Server. Learn DBA best practices for application-consistent backups, avoiding VM stun, and ensuring data integrity with CloudSave.

DevOps इन्जिनियरहरू र प्रणाली प्रशासकहरूका लागि, भर्चुअल मेसिन (VM) स्न्यापसटहरू एक आधारभूत उपकरण हुन्। तिनीहरूले जोखिमपूर्ण प्याच, ठूलो कन्फिगरेसन परिवर्तन, वा एप्लिकेसन डिप्लोयमेन्ट अघि सर्भरको अवस्था क्याप्चर गर्न द्रुत र सुविधाजनक तरिका प्रदान गर्छन्। यदि केही गलत भयो भने, रोलब्याक गर्न केही सेकेन्ड मात्र लाग्छ।

यद्यपि, जब यही पद्धति ट्रान्ज्याक्सनल डाटाबेसहरू—जस्तै PostgreSQL, MySQL, Oracle, वा Microsoft SQL Server—मा लागू गरिन्छ, तब VM स्न्यापसटहरू सुरक्षा कवचबाट एक खतरनाक बममा परिणत हुन्छन्।

डाटाबेस ब्याकअपका लागि मानक हाइपरभाइजर स्न्यापसटहरूमा भर पर्नु डाटा करप्सन (data corruption), टर्न पेज (torn pages), र पुन: प्राप्ति गर्न नसकिने उत्पादन आउटेजको सबैभन्दा सामान्य कारणहरू मध्ये एक हो। यस लेखमा, हामी हाइपरभाइजर र डाटाबेस इन्जिनहरू बीचको वास्तुकलाको द्वन्द्व, स्न्यापसटको समयमा डाटा करप्सनको मेकानिक्स, र भर्चुअलाइज्ड डाटाबेसहरूलाई सुरक्षित रूपमा ब्याकअप गर्न आवश्यक इन्जिनियरिङ उत्तम अभ्यासहरू अन्वेषण गर्नेछौं।

वास्तुकलाको द्वन्द्व: हाइपरभाइजर बनाम डाटाबेस इन्जिनहरू

VM स्न्यापसटहरूले डाटाबेसलाई किन खतरामा पार्छन् भनेर बुझ्नको लागि, हामीले पहिले दुवै प्रणालीहरूले कसरी अवस्था (state) र I/O अपरेसनहरू व्यवस्थापन गर्छन् भनेर जाँच्नु पर्छ।

हाइपरभाइजरहरूले स्न्यापसटहरू कसरी कार्यान्वयन गर्छन्

जब एक हाइपरभाइजर (जस्तै VMware ESXi, Microsoft Hyper-V, वा KVM) ले स्न्यापसट लिन्छ, यसले डिस्कलाई प्रतिलिपि गर्दैन। यसको सट्टा, यसले हालको भर्चुअल डिस्क फाइल (जस्तै .vmdk वा .vhdx) लाई रिड-ओन्ली अवस्थामा फ्रिज गर्छ र नयाँ डेल्टा डिस्क (फरक डिस्क) सिर्जना गर्छ। त्यसपछिका सबै लेखाइहरू (writes) यस डेल्टा डिस्कमा निर्देशित हुन्छन्।

जब स्न्यापसट मेटाइन्छ, हाइपरभाइजरले डेल्टा डिस्कबाट डाटालाई बेस डिस्कमा कमिट (एकीकृत) गर्नुपर्छ। मानक स्न्यापसटहरू गेस्ट अपरेटिङ सिस्टम भित्र चलिरहेका एप्लिकेसनहरूप्रति पूर्ण रूपमा अनभिज्ञ हुन्छन्। तिनीहरूले डिस्कको अवस्थालाई त्यस माइक्रोसेकेन्डमा जस्तो छ, ठ्याक्कै त्यसरी नै क्याप्चर गर्छन्।

ट्रान्ज्याक्सनल डाटाबेसहरूले अवस्था कसरी व्यवस्थापन गर्छन्

ट्रान्ज्याक्सनल डाटाबेसहरू ACID गुणहरू (Atomicity, Consistency, Isolation, Durability) को वरिपरि डिजाइन गरिएका हुन्छन्। ACID अनुपालन कायम राख्दै उच्च प्रदर्शन प्राप्त गर्न, डाटाबेसहरूले प्रत्येक ट्रान्ज्याक्सनलाई तुरुन्तै डिस्कमा रहेका प्राथमिक डाटा फाइलहरूमा लेख्दैनन्। यसको सट्टा, तिनीहरूले एक जटिल, बहु-स्तरीय वास्तुकला प्रयोग गर्छन्:

  1. बफर पूल / सेयर बफर्स: डाटा प्रणाली मेमोरी भित्र पढिन्छ र परिमार्जन गरिन्छ।
  2. राइट-अहेड लग (WAL) / रिडू लगहरू: स्थायित्व सुनिश्चित गर्न परिवर्तनहरू डिस्कमा रहेको अत्यधिक अनुकूलित लग फाइलमा क्रमिक रूपमा लेखिन्छन्।
  3. चेकपोइन्टहरू / लेजी राइटर्स: समय-समयमा, डाटाबेसले मेमोरीबाट परिमार्जन गरिएका (डर्टी) पेजहरूलाई डिस्कमा रहेका वास्तविक डाटा फाइलहरूमा फ्लश गर्छ।

यस वास्तुकलाको कारणले, डिस्कमा रहेका भौतिक डाटा फाइलहरू लगभग सधैं डाटाबेसको वास्तविक अवस्थासँग सिंक बाहिर हुन्छन्। डाटाबेसको वास्तविक अवस्था डिस्कमा रहेका डाटा फाइलहरू, WAL/रिडू लगहरू, र हाल मेमोरीमा रहेको डाटाको संयोजनको रूपमा मात्र अवस्थित हुन्छ।

खतराको क्षेत्र: VM स्न्यापसटको समयमा के हुन्छ

जब तपाईं डाटाबेस सर्भरको मानक VM स्न्यापसट लिनुहुन्छ, तपाईंले क्र्यास-कन्सिस्टेन्ट (crash-consistent) अवस्था क्याप्चर गरिरहनुभएको हुन्छ।

क्र्यास कन्सिस्टेन्सी बनाम एप्लिकेसन कन्सिस्टेन्सी

क्र्यास-कन्सिस्टेन्ट स्न्यापसट भनेको भौतिक सर्भरबाट पावर कर्ड निकाल्नु बराबर हो। डिस्कको अवस्था क्याप्चर हुन्छ, तर मेमोरीमा जे थियो त्यो हराउँछ, र स्टोरेज कन्ट्रोलरमा जाँदै गरेको डाटा अचानक काटिन्छ।

यद्यपि आधुनिक डाटाबेसहरू राइट-अहेड लग रिप्ले गरेर अप्रत्याशित पावर लसबाट रिकभर हुन डिजाइन गरिएका हुन्छन्, तर क्र्यास रिकभरीलाई तपाईंको प्राथमिक ब्याकअप रणनीतिको रूपमा भर पर्नु अत्यन्त खतरनाक छ। यदि तपाईंको डाटाबेस धेरै भर्चुअल डिस्कहरूमा फैलिएको छ (जस्तै Drive D: मा डाटा फाइलहरू र Drive E: मा WAL), हाइपरभाइजरले दुवै डिस्कहरूलाई ठ्याक्कै एकै माइक्रोसेकेन्डमा स्न्यापसट नगर्न सक्छ। यदि WAL डिस्क स्न्यापसट डाटा डिस्क स्न्यापसटको केही सेकेन्ड पछि क्याप्चर भयो भने, डाटाबेसले रिस्टोर गर्दा अनुक्रम नम्बरहरू मिलाउन सक्दैन, जसले गर्दा घातक करप्सन हुन्छ।

उच्च-ट्रान्ज्याक्सन प्रणालीहरूमा “VM स्टन” को प्रभाव

स्न्यापसट सिर्जना प्रक्रिया—र अझ महत्त्वपूर्ण कुरा, स्न्यापसट कन्सोलिडेशन प्रक्रिया—ले “VM स्टन” भनिने घटना निम्त्याउँछ।

बेस डिस्कबाट डेल्टा डिस्कमा I/O लाई सुरक्षित रूपमा स्विच गर्न, हाइपरभाइजरले भर्चुअल मेसिनलाई छोटकरीमा पज (स्टन) गर्नुपर्छ। हल्का लोड भएको वेब सर्भरका लागि, यो स्टन १०-५० मिलिसेकेन्डसम्म रहन सक्छ र थाहा नहुन सक्छ। यद्यपि, ठूलो I/O भएको उच्च-थ्रुपुट डाटाबेसका लागि, ठूलो डेल्टा डिस्कलाई एकीकृत गर्दा VM लाई धेरै सेकेन्डसम्म स्टन गर्न सक्छ।

VM स्टनको समयमा:
* नेटवर्क जडानहरू टुट्छन्, जसले एप्लिकेसन टाइमआउट निम्त्याउँछ।
* उच्च-उपलब्धता क्लस्टरहरू (जस्तै SQL Server Always On, PostgreSQL Patroni, वा MySQL Galera) ले हार्टबिट चेकहरू मिस गर्छन्।
* क्लस्टरले स्टन भएको नोड मृत छ भनी सोच्न सक्छ, जसले अनावश्यक र विघटनकारी फेलओभर (स्प्लिट-ब्रेन परिदृश्य) ट्रिगर गर्छ।

टर्न पेज र I/O मिसअलाइनमेन्ट

डाटाबेस इन्जिनहरूले सामान्यतया विशिष्ट पेज साइजहरूमा (जस्तै PostgreSQL र SQL Server को लागि 8KB, InnoDB को लागि 16KB) डाटा लेख्छन्। यद्यपि, आधारभूत अपरेटिङ सिस्टम र स्टोरेज एरेहरूले साना ब्लकहरूमा (जस्तै 4KB वा 512 बाइट्स) I/O प्रशोधन गर्छन्।

यदि हाइपरभाइजरले डाटाबेसले 8KB पेज लेखिरहेको बेला ठ्याक्कै स्न्यापसट लियो भने, स्न्यापसटले नयाँ डाटाको पहिलो 4KB र पुरानो डाटाको अन्तिम 4KB क्याप्चर गर्न सक्छ। यसले टर्न पेज (torn page) सिर्जना गर्छ। जब तपाईं स्न्यापसट रिस्टोर गर्ने प्रयास गर्नुहुन्छ, डाटाबेसले पेज पढ्नेछ, चेकसम प्रमाणीकरणमा असफल हुनेछ, र डाटाबेसलाई करप्ट भनी चिन्ह लगाउनेछ।

विशिष्ट डाटाबेस इन्जिनहरूका लागि वास्तविक-विश्व परिणामहरू

विभिन्न डाटाबेस इन्जिनहरूले क्र्यास-कन्सिस्टेन्ट स्न्यापसटहरूमा विभिन्न तरिकाले प्रतिक्रिया दिन्छन्, तर उत्पादन वातावरणमा कसैले पनि यसलाई सहज रूपमा ह्यान्डल गर्दैनन्।

  • PostgreSQL: PostgreSQL ले pg_wal डाइरेक्टरीमा धेरै भर पर्छ। यदि स्न्यापसटले डाटा डाइरेक्टरी ($PGDATA) र WAL लाई सिंक बाहिर क्याप्चर गर्छ भने, PostgreSQL सुरु हुन असफल हुनेछ र PANIC: could not locate a valid checkpoint record त्रुटि देखाउनेछ।
  • MySQL/InnoDB: InnoDB ले टर्न पेजहरू रोक्न डबलराइट बफर प्रयोग गर्छ, जसले क्र्यास-कन्सिस्टेन्ट अवस्थाहरू विरुद्ध केही सुरक्षा प्रदान गर्दछ। यद्यपि, यदि ibdata1 फाइल र ib_logfile सिंक बाहिर क्याप्चर गरिएका छन् भने, रिकभरीमा InnoDB इन्जिन क्र्यास हुनेछ।
  • Microsoft SQL Server: SQL Server I/O फ्रिजिंगप्रति अत्यधिक संवेदनशील छ। उचित VSS (Volume Shadow Copy Service) एकीकरण बिना, मानक VM स्न्यापसटबाट SQL Server रिस्टोर गर्दा प्रायः शंकास्पद डाटाबेसहरू र बिग्रिएका लग चेनहरू निम्त्याउँछ, जसले तपाईंको पोइन्ट-इन-टाइम रिकभरी (PITR) क्षमताहरू नष्ट गर्छ।

भर्चुअलाइज्ड डाटाबेसहरू सुरक्षित रूपमा ब्याकअप गर्नका लागि उत्तम अभ्यासहरू

ट्रान्ज्याक्सनल डाटाबेसहरू सुरक्षित गर्न, तपाईंले क्र्यास-कन्सिस्टेन्ट ब्याकअपबाट एप्लिकेसन-कन्सिस्टेन्ट (application-consistent) ब्याकअपमा सर्नुपर्छ। यसका लागि ब्याकअप संयन्त्रले डाटाबेस इन्जिनसँग सञ्चार गर्न आवश्यक छ, जसले गर्दा स्न्यापसट लिँदा मेमोरीलाई डिस्कमा फ्लश गर्न र I/O अपरेसनहरूलाई क्षणभरका लागि पज गर्न बाध्य पार्छ।

१. एप्लिकेसन-अवेयर क्विजिंग (VSS र fsfreeze) को लाभ उठाउनुहोस्

Windows (SQL Server) को लागि:
सधैं सुनिश्चित गर्नुहोस् कि तपाईंको ब्याकअप समाधानले Microsoft Volume Shadow Copy Service (VSS) प्रयोग गर्दछ। जब VSS-अवेयर ब्याकअप ट्रिगर हुन्छ, SQL Server VSS Writer ले डाटाबेस I/O फ्रिज गर्छ, पेन्डिङ ट्रान्ज्याक्सनहरूलाई डिस्कमा फ्लश गर्छ, र स्न्यापसट पूर्ण रूपमा एप्लिकेसन-कन्सिस्टेन्ट छ भनी सुनिश्चित गर्छ।

Linux (PostgreSQL / MySQL) को लागि:
Linux सँग VSS को नेटिभ विकल्प छैन। एप्लिकेसन कन्सिस्टेन्सी प्राप्त गर्न, तपाईंले हाइपरभाइजरको गेस्ट टुलहरू (जस्तै VMware Tools) सँग संयोजनमा प्रि-फ्रिज र पोस्ट-थ (pre-freeze and post-thaw) स्क्रिप्टहरू प्रयोग गर्नुपर्छ।

यहाँ PostgreSQL 15+ को लागि VMware pre-freeze-script को उदाहरण छ जसले स्न्यापसटको लागि डाटाबेसलाई सुरक्षित रूपमा तयार गर्छ:

#!/bin/bash
# /usr/sbin/pre-freeze-script
# सुनिश्चित गर्नुहोस् कि यो स्क्रिप्ट एक्जिक्युटेबल (chmod +x) छ

# १. PostgreSQL लाई ब्याकअपको लागि तयार हुन भन्नुहोस्
su - postgres -c "psql -c "SELECT pg_backup_start('vm_snapshot', true);""

# २. फाइल सिस्टम बफरहरूलाई डिस्कमा फ्लश गर्नुहोस्
sync

# ३. फाइल सिस्टम फ्रिज गर्नुहोस् (डाटा /var/lib/pgsql मा छ भनी मान्दै)
fsfreeze -f /var/lib/pgsql

र अपरेसनहरू पुन: सुरु गर्नको लागि सम्बन्धित post-thaw-script:

#!/bin/bash
# /usr/sbin/post-thaw-script

# १. फाइल सिस्टम अनफ्रिज गर्नुहोस्
fsfreeze -u /var/lib/pgsql

# २. PostgreSQL लाई ब्याकअप पूरा भयो भनी भन्नुहोस्
su - postgres -c "psql -c "SELECT pg_backup_stop();""

२. नेटिभ डाटाबेस ब्याकअप उपयोगिताहरू प्रयोग गर्नुहोस्

एप्लिकेसन-कन्सिस्टेन्ट स्न्यापसटहरू मानक स्न्यापसटहरू भन्दा राम्रो भए तापनि, तिनीहरूमा अझै पनि VM स्टनको जोखिम हुन्छ। डाटाबेस ब्याकअपका लागि सबैभन्दा सुरक्षित दृष्टिकोण भनेको हाइपरभाइजरबाट स्वतन्त्र रूपमा काम गर्ने नेटिभ, स्ट्रिमिङ ब्याकअप उपयोगिताहरू प्रयोग गर्नु हो।

PostgreSQL (pg_basebackup):

pg_basebackup -h localhost -U replication_user -D /mnt/backups/pg_backup -Ft -z -P

MySQL/MariaDB (Percona XtraBackup / Mariabackup):
यी उपकरणहरूले डाटा फाइलहरू प्रतिलिपि गरेर र एकै साथ रिडू लगमा परिवर्तनहरू ट्र्याक गरेर हट, नन-ब्लकिङ ब्याकअपहरू लिन्छन्।

mariabackup --backup --target-dir=/mnt/backups/mysql_backup --user=root --password=SecurePass

SQL Server (T-SQL):

BACKUP DATABASE [ProductionDB] 
TO DISK = N'Z:BackupsProductionDB.bak' 
WITH NOFORMAT, NOINIT, NAME = N'ProductionDB-Full Backup', 
SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10;
GO

३. लग आर्काइभिङ मार्फत पोइन्ट-इन-टाइम रिकभरी (PITR) लागू गर्नुहोस्

दैनिक स्न्यापसट वा पूर्ण ब्याकअपले तपाईंलाई त्यो लिइएको समयसम्म मात्र सुरक्षा दिन्छ। यदि तपाईंको डाटाबेस दिउँसो ४:०० बजे क्र्यास भयो र तपाईंको अन्तिम स्न्यापसट बिहान २:०० बजे थियो भने, तपाईंले १४ घण्टाको ट्रान्ज्याक्सनल डाटा गुमाउनुहुन्छ।

साँचो इन्टरप्राइज लचिलोपन प्राप्त गर्न, तपाईंले पूर्ण एप्लिकेसन-कन्सिस्टेन्ट ब्याकअपहरूलाई निरन्तर लग आर्काइभिङ (WAL, रिडू लगहरू, वा ट्रान्ज्याक्सन लगहरू हरेक केही मिनेटमा ब्याकअप गर्ने) सँग जोड्नुपर्छ। यसले DBA हरूलाई विपद् हुनु अघिको विशिष्ट मिनेट वा विशिष्ट ट्रान्ज्याक्सन ID मा डाटाबेस रिस्टोर गर्न अनुमति दिन्छ।

CloudSave को साथ इन्टरप्राइज ब्याकअप रणनीतिहरू

दर्जनौं डाटाबेस सर्भरहरूमा कस्टम प्रि-फ्रिज स्क्रिप्टहरू, नेटिभ डम्पहरूका लागि क्रोन जबहरू, र लग शिपिंग व्यवस्थापन गर्नु DevOps टोलीहरूका लागि एक परिचालन दुःस्वप्न हो। यहाँ CloudSave जस्तो इन्टरप्राइज-ग्रेड प्लेटफर्म महत्त्वपूर्ण हुन्छ।

CloudSave ले भर्चुअलाइजेशन र डाटाबेस वास्तुकला बीचको खाडललाई पुर्छ। अन्धो हाइपरभाइजर स्न्यापसटहरूमा भर पर्नुको सट्टा, CloudSave ले एप्लिकेसन-अवेयर एजेन्टहरू प्रयोग गर्दछ जुन SQL Server, PostgreSQL, MySQL, र Oracle सँग नेटिभ रूपमा एकीकृत हुन्छन्।

जब CloudSave ले ब्याकअप सुरु गर्छ:
१. यसले नेटिभ API हरू (जस्तै Windows को लागि VSS वा Linux को लागि नेटिभ WAL स्ट्रिमिङ) मार्फत सिधै डाटाबेस इन्जिनसँग सञ्चार गर्छ।
२. यसले विघटनकारी VM स्टनहरू ननिम्त्याई मेमोरी बफरहरूलाई डिस्कमा फ्लश गर्ने कार्यलाई व्यवस्थित गर्छ।
३. यसले सुरक्षित रूपमा डाटा फाइलहरू क्याप्चर गर्छ र स्वचालित रूपमा ट्रान्ज्याक्सन लग ट्रन्केसन व्यवस्थापन गर्छ।
४. यसले निरन्तर ट्रान्ज्याक्सन लगहरू ब्याकअप गर्छ, जसले केही क्लिकहरूमा दानेदार पोइन्ट-इन-टाइम रिकभरी (PITR) सक्षम गर्छ।

एप्लिकेसन कन्सिस्टेन्सीको जटिलतालाई CloudSave मा अफलोड गरेर, DBA हरू र sysadmins ले आफ्नो उत्पादन क्लस्टरहरूको प्रदर्शन वा उपलब्धतामा सम्झौता नगरी डाटा अखण्डताको ग्यारेन्टी गर्न सक्छन्।

निष्कर्ष

भर्चुअल मेसिन स्न्यापसटहरू पूर्वाधार व्यवस्थापनका लागि एक अविश्वसनीय उपकरण हुन्, तर तिनीहरू मौलिक रूपमा ट्रान्ज्याक्सनल डाटाबेसहरूको ACID आवश्यकताहरूसँग असंगत छन्। क्र्यास-कन्सिस्टेन्ट हाइपरभाइजर स्न्यापसटहरूमा भर पर्दा तपाईंको संस्था टर्न पेजहरू, बिग्रिएका रेप्लिकेसन चेनहरू, र विनाशकारी डाटा नोक्सानको जोखिममा पर्छ।

तपाईंको मिसन-क्रिटिकल डाटा सुरक्षित गर्न, तपाईंले एप्लिकेसन-अवेयर क्विजिंग लागू गर्नुपर्छ, नेटिभ डाटाबेस ब्याकअप पद्धतिहरू प्रयोग गर्नुपर्छ, र निरन्तर ट्रान्ज्याक्सन लग आर्काइभहरू कायम राख्नुपर्छ। उद्देश्य-निर्मित इन्टरप्राइज ब्याकअप समाधानहरू अपनाएर, तपाईंले आफ्ना डाटाबेसहरू उच्च रूपमा उपलब्ध, पूर्ण रूपमा रिकभरेबल, र पूर्ण रूपमा सुरक्षित छन् भनी सुनिश्चित गर्न सक्नुहुन्छ।

वर्गहरू