RAID पर पुनर्विचार
जब मैं एक novice service tech था और system administration के बारे में बहुत कम जानता था, उन कुछ topics में से एक जिन्हें हमसे हमेशा ठीक से जानने की उम्मीद की जाती थी वह था RAID – Redundant Array of Inexpensive Disks। यह हमारी सभी storage समस्याओं का उत्तर था। RAID के साथ हम अपने filesystems को बड़ा कर सकते थे, बेहतर throughput पा सकते थे और यहाँ तक कि redundancy भी जोड़ सकते थे जिससे हम एक disk के नुकसान से बच सकते थे जो विशेष रूप से उन दिनों काफी नियमित रूप से होता था। NAS और SAN storage appliances के उदय के साथ physical storage स्तर तक नीचे जाने और system की जरूरतों को पूरा करने के लिए इसे tweak करने की skill set तेजी से गायब हो रही है। यह अच्छी बात नहीं है। सिर्फ इसलिए कि हम storage को external devices पर offload कर रहे हैं, यह तथ्य नहीं बदलता कि हमें मूल रूप से अपने storage को समझना और इसे अपने systems की specific जरूरतों को पूरा करने के लिए configure करना होगा।
एक गलत धारणा जो पिछले पाँच से दस वर्षों में इस क्षेत्र में आई है वह यह विश्वास है कि RAID किसी तरह एक system backup का प्रतिनिधित्व करता है। यह नहीं करता। RAID एक प्रकार की fault tolerance है। Backup और fault tolerance वैचारिक रूप से बहुत अलग हैं। Backup को एक disaster होने के बाद recover करने की अनुमति देने के लिए design किया गया है। Fault tolerance को पहली जगह disaster की संभावना को कम करने के लिए design किया गया है। Fault tolerance को एक cliff के ऊपर बाड़ बनाने के रूप में और backup को उसके नीचे hospital बनाने के रूप में सोचें। आप वास्तव में कभी भी ऐसी स्थिति में नहीं रहना चाहते जहाँ बाड़ और hospital दोनों न हों, लेकिन वे निश्चित रूप से अलग-अलग चीजें हैं।
एक बार जब हम अपने drives के लिए RAID implement कर रहे हैं, चाहे locally attached हो या SAN जैसे remote appliance पर, हमारे पास आज व्यवसाय के लिए चार key RAID solutions हैं जिनमें से चुनना है: RAID 1 (mirroring), RAID 5 (striping with parity), RAID 6 (striping with double parity) और RAID 10 (mirroring with striping।) अन्य भी हैं, जैसे RAID 0, जिनका उपयोग केवल दुर्लभ परिस्थितियों में किया जाना चाहिए जब आप वास्तव में अपनी drive subsystem जरूरतों को समझते हों। RAID 50 और 51 का भी उपयोग किया जाता है लेकिन बहुत कम सामान्य रूप से और वे उतने प्रभावी नहीं हैं। दस साल पहले RAID 1 और RAID 5 सामान्य थे, लेकिन आज हमारे पास अधिक options हैं।
आइए options के माध्यम से चलें और कुछ बुनियादी numbers पर चर्चा करें। हमारे उदाहरणों में हम n का उपयोग हमारे array में drives की संख्या को represent करने के लिए करेंगे और हम s का उपयोग किसी भी individual drive के size को represent करने के लिए करेंगे। इनका उपयोग करके हम एक array के usable storage space को express कर सकते हैं जिससे storage capacity के संदर्भ में comparisons आसान हो जाती हैं।
RAID 1: इस RAID type में drives को mirror किया जाता है। आपके पास दो drives हैं और वे एक साथ सब कुछ करती हैं, इसलिए "mirroring"। Mirroring अत्यंत stable है क्योंकि process इतनी सरल है, लेकिन इसके लिए आपको उतनी drives खरीदनी होती हैं जितनी आपको RAID का उपयोग न करने पर खरीदनी पड़ती, दोगुनी, क्योंकि आपकी दूसरी drive redundancy के लिए dedicated है। लाभ यह है कि आपके पास यह assurance है कि आप disk पर जो भी bit लिखते हैं वह आपकी सुरक्षा के लिए दो बार लिखा जा रहा है। तो RAID 1 के साथ हमारी capacity (n*s/2) है। RAID 1 non-RAID drives पर minimal performance gains प्रदान करने से पीड़ित है। Write speeds non-RAID system के equivalent हैं जबकि read speeds अधिकांश situations में लगभग दोगुनी तेज हैं क्योंकि read operations के दौरान drives throughput बढ़ाने के लिए parallel में access कर सकती हैं। RAID 1 दो drive sets तक सीमित है।
RAID 5: Single Parity के साथ Striping, इस RAID type में data को array में सभी drives में एक complex stripe में लिखा जाता है जिसमें एक distributed parity block होता है जो सभी drives में मौजूद होता है। ऐसा करके RAID 5 तीन या अधिक disks के arbitrarily sized array का उपयोग करने में सक्षम है और केवल एक single disk के equivalent storage capacity को parity के लिए खोता है, हालाँकि parity distributed है और किसी एक physical disk पर solely exist नहीं करती। RAID 5 अक्सर इसकी cost effectiveness के कारण उपयोग किया जाता है क्योंकि large arrays में storage capacity loss कम होती है। Mirroring के विपरीत, parity के साथ striping के लिए disks में प्रत्येक write stripe के लिए एक calculation perform करने की आवश्यकता होती है और यह कुछ overhead बनाता है। इसलिए throughput हमेशा एक obvious calculation नहीं है और यह heavily उस system की computational power पर निर्भर करती है जो parity calculation कर रही है। RAID 5 capacity की गणना करना काफी आसान है क्योंकि यह simply ((n-1)*s) है। एक RAID 5 array array में किसी भी single disk के नुकसान से बच सकता है।
RAID 6: Double Parity के साथ Redundant Striping। RAID 6 practically RAID 5 के identical है लेकिन disk failure के खिलाफ additional protection के लिए प्रति stripe एक के बजाय दो parity blocks का उपयोग करता है। RAID 6 RAID family का एक नया member है जिसे अन्य levels के standardize होने के कई साल बाद जोड़ा गया था। RAID 6 विशेष है क्योंकि यह data loss के बिना एक array के भीतर किसी भी दो drives की failure की अनुमति देता है। लेकिन redundancy के अतिरिक्त level को accommodate करने के लिए एक RAID 6 array array में दो drives के equivalent storage capacity को खो देता है और minimum चार drives की आवश्यकता होती है। हम RAID 6 array की capacity ((n-2)*s) से calculate कर सकते हैं।
RAID 10: Mirroring plus Striping। Technically RAID 10 एक hybrid RAID type है जिसमें non-parity stripe (RAID 0) में RAID 1 mirrors का एक set शामिल है। कई vendors RAID 10 (या RAID 1+0) term का उपयोग केवल दो drives वाले array के लिए करते हैं लेकिन technically यह RAID 1 है क्योंकि striping तब तक नहीं हो सकती जब तक array में minimum चार drives न हों। RAID 10 के साथ drives को pairs में जोड़ा जाना चाहिए इसलिए array में केवल even number of drives हो सकती हैं। RAID 10 drives के total set के आधे तक के नुकसान से बच सकता है लेकिन प्रत्येक pair से maximum एक का नुकसान। RAID 10 में parity calculation शामिल नहीं है जिससे इसे RAID 5 या RAID 6 पर performance advantage मिलता है और array को drive करने के लिए कम computational power की आवश्यकता होती है। RAID 10 किसी भी common RAID type की greatest read performance deliver करता है क्योंकि array में सभी drives read operations में simultaneously उपयोग की जा सकती हैं हालाँकि इसकी write performance बहुत कम है। RAID 10 की capacity calculation RAID 1 के identical है, (n*s/2)।
आज के enterprise में यह दुर्लभ है कि किसी IT विभाग को यहाँ उल्लिखित चार के अलावा किसी भी drive configuration पर गंभीरता से विचार करने की वास्तविक आवश्यकता हो, चाहे software या hardware RAID implement किया जा रहा हो। परंपरागत रूप से RAID array निर्णय में सबसे बड़ी चिंता usable capacity के आसपास आधारित थी। यह इसलिए था क्योंकि drives महंगी और छोटी थीं। आज drives इतनी बड़ी हैं कि storage capacity शायद ही कभी एक मुद्दा होती है, कम से कम उतनी नहीं जितनी कुछ साल पहले थी, और लागतें इस हद तक गिर गई हैं कि बेहतर drive redundancy के लिए आवश्यक अतिरिक्त drives खरीदना आमतौर पर मामूली चिंता का विषय है। जब capacity प्रीमियम पर हो तो RAID 5 एक लोकप्रिय विकल्प है क्योंकि यह अन्य array types की तुलना में कम से कम storage capacity खोता है और large arrays में storage loss nominal है।
आज हमारे पास आमतौर पर अन्य चिंताएँ हैं, मुख्य रूप से data safety और performance। Data protection सुनिश्चित करने के लिए थोड़ा अतिरिक्त खर्च करना एक obvious विकल्प होना चाहिए। RAID 5 केवल एक single drive खो सकने से पीड़ित है। केवल तीन members के array में यह RAID 1 द्वारा प्रदान की गई protection से थोड़ा अधिक खतरनाक है। हम तीन में से किसी एक drive के नुकसान से बच सकते थे। दो में से किसी एक को खोने की तुलना में बहुत scary नहीं। लेकिन एक बड़े array के बारे में क्या, कहें सोलह drives। सोलह में से केवल एक drive को safely खो सकना हमें अपनी reliability पर थोड़ा अधिक thoroughly प्रश्न करना चाहिए।
यही वह जगह है जहाँ RAID 6 gap को भरने के लिए आया। RAID 6, जब एक large array में उपयोग किया जाता है, storage capacity और performance का बहुत कम नुकसान introduce करता है जबकि किसी भी दो drives को खो सकने का assurance प्रदान करता है। Parity के साथ striping camp के proponents अक्सर management को यह assure करने के लिए इन numbers को quote करेंगे कि RAID 5/6 storage subsystems में adequate "bang for the buck" प्रदान कर सकता है, लेकिन अन्य factors भी play में हैं।
RAID reliability की discussions में लगभग पूरी तरह से अनदेखा किया गया, एक बहुत कम चर्चा किया गया topic जैसा कि यह है, parity computation reliability का प्रश्न है। RAID 1 या RAID 10 के साथ parity के साथ stripe बनाने के लिए कोई "calculation" नहीं किया जाता। Data simply एक stable manner में लिखा जाता है। जब एक drive fail होती है तो उसका partner load उठाता है और drive performance थोड़ी कम हो जाती है जब तक partner को replace नहीं किया जाता। कोई rebuilding process नहीं है जो existing drive members को impact करे। Parity stripes के साथ ऐसा नहीं है।
Parity वाले RAID arrays में ऐसे operations होते हैं जिनमें यह calculate करना शामिल है कि drives पर क्या है और क्या होना चाहिए। जबकि यह calculation बहुत simple है, यह चीजों के गलत होने का अवसर प्रदान करती है। RAID 1 या RAID 10 के साथ fail होने वाला array controller, theoretically, drives की contents पर bad data लिख सकता है लेकिन कोई process नहीं है जिसके द्वारा controller अपने आप drive changes करता है इसलिए यह कभी भी होने की संभावना बेहद कम है क्योंकि mirror बनाने को छोड़कर कभी कोई "rebuild" process नहीं होती।
जब parity वाले arrays एक rebuild operation perform करते हैं तो वे एक complex process perform करते हैं जिसके द्वारा वे array के पूरे contents के माध्यम से step करते हैं और missing data को replaced drive पर वापस लिखते हैं। अपने आप में यह relatively simple है और चिंता का कोई कारण नहीं होना चाहिए। जो मैंने और अन्य ने first hand देखा है वह एक slightly different scenario है जिसमें disks शामिल हैं जिन्होंने array से loose connectors के कारण connectivity खो दी है। Drives आमतौर पर समय के साथ server में "shake" loose हो सकती हैं विशेष रूप से always-on system में कई वर्षों की service के बाद।
जो हो सकता है, extreme scenarios में, drives पर good data bad parity data द्वारा overwrite हो सकता है जब एक array controller मानता है कि एक या अधिक drives succession में fail हुई हैं और rebuild के लिए online वापस लाई गई हैं। इस case में drives themselves fail नहीं हुई हैं और कोई data loss नहीं है। बस जो आवश्यक है वह है कि drives को reseated किया जाए, theoretically। Hot swap systems पर drive rebuilding का management अक्सर failed drive के removal और replacement के आधार पर automatic होता है। इसलिए drive खोने और replace करने की यह process बिना किसी human intervention के हो सकती है – और एक rebuilding process शुरू हो सकती है। इस process के दौरान drive system खतरे में होता है और यदि यही event फिर से होता है तो drive array, drives की status के आधार पर, good filesystem को overwrite करते हुए drives में bad data stripe करना शुरू कर सकता है। यह एक server administrator के लिए सबसे depressing दृश्यों में से एक है जब बिना failed drives वाला system किसी unnecessary rebuild operation के कारण पूरा array खो देता है।
Theoretically इस प्रकार की situation नहीं होनी चाहिए और इससे बचाने के लिए safeguards मौजूद हैं लेकिन एक low level drive controller का वर्तमान और पूर्व में एक drive की status के बारे में और उस drive पर residing data की quality के बारे में determination उतनी simple नहीं है जितनी लग सकती है और mistakes होना possible है। जबकि यह situation unlikely है, यह होती है और यह RAID 5 और RAID 6 systems में एक nearly impossible to calculate risk जोड़ती है। हमें parity failure के risk पर विचार करना होगा, उस traditional risk के अतिरिक्त जो एक pool में से array जितनी drive losses survive कर सकता है उसके number से calculated होती है। जैसे-जैसे drives अधिक reliable होती जाती हैं, parity failure risk event का महत्व बढ़ता जाता है।
इसके अतिरिक्त, RAID 5 और RAID 6 parity parity calculation के कारण system overhead introduce करती है जिसे अक्सर dedicated RAID hardware के माध्यम से handle किया जाता है। यह calculation drive subsystem में latency introduce करती है जो hardware और software दोनों में implementation के अनुसार dramatically vary करती है जिससे एक दूसरे के खिलाफ RAID levels के performance numbers बताना impossible हो जाता है क्योंकि प्रत्येक implementation unique होगी।
आज RAID choices के साथ संभवतः सबसे बड़ी समस्या यह है कि जिस आसानी से storage efficiency और drive loss survivability के लिए metrics प्राप्त किए जा सकते हैं वे reliability और performance की बड़ी picture को mask करते हैं क्योंकि वे statistics लगभग पूरी तरह अनुपलब्ध हैं। Metrics के खतरों में से एक यह है कि लोग उन factors पर ध्यान केंद्रित करेंगे जिन्हें आसानी से measure किया जा सकता है और उनकी impact की संभावना की परवाह किए बिना उन्हें ignore करेंगे जिन्हें आसानी से measure नहीं किया जा सकता।
जबकि सभी modern RAID levels का अपना स्थान है, यह critical है कि उन्हें context में और risks के पूरे scope की समझ के साथ consider किया जाए। हमें अपनी industry को RAID 5 के default से RAID 10 के default में shift करने के लिए कड़ी मेहनत करनी चाहिए। Drives सस्ती हैं और data loss महंगी।
[संपादन: इसे initially लिखे जाने के वर्षों बाद एक rebuild operation के दौरान URE (Unrecoverable Read Errors) risks के उदय ने parity arrays के लिए primary risks को उल्लिखित से URE-related risks में shift कर दिया है।]
