ZFS: ड्राइव खोने के बाद आप सही संख्या में प्रतियां कैसे पुनर्स्थापित करते हैं?


12

Zfs के साथ, यदि आपके पास है copies=2और फिर आप उनमें से कुछ प्रतियों से युक्त एक ड्राइव खो देते हैं, तो आप सिस्टम को कैसे बताते हैं कि वह प्रभावित फ़ाइलों के लिए डेटा ब्लॉक की एक नई प्रतिलिपि बनाना चाहिए? या क्या zfs सिर्फ खराब डेटा ब्लॉक के बारे में पता चलते ही अतिरिक्त प्रतियों के लिए डेटा ब्लॉक जोड़ना शुरू कर देता है?

क्या स्क्रब ऐसा करेगा?

(v0.6.0.56-rc8, ZFS पूल संस्करण 28, ZFS फाइलसिस्टम संस्करण 5, उबंटू 11.10)

जवाबों:


10

"प्रतियां = 2" (या 3) अधिक डिज़ाइन किया गया है जिसका उपयोग बिना अतिरेक (एकल डिस्क या धारियों) के साथ पूल के साथ किया जाता है। लक्ष्य मामूली डिस्क भ्रष्टाचार को पुनर्प्राप्त करने में सक्षम होना है, न कि पूरी डिवाइस विफलता। बाद के मामले में, पूल बेशुमार है इसलिए कोई भी डिट्टो ब्लॉक पुनर्स्थापना नहीं हो सकती है।

यदि आपके पास अतिरेक है (मिररिंग / raidz / raidz2 / raidz3), तो डिट्टो ब्लॉक अन्य लोगों की तुलना में अलग नहीं हैं और स्क्रबिंग / रीसिल्वरिंग उन्हें फिर से बनाएंगे।


यह सीधे @Redmumba का कहना है के साथ संघर्ष - और Redmumba कोड के लिए लिंक प्रदान करता है। क्या आप कुछ स्रोतों का हवाला दे सकते हैं जो आप कह रहे हैं? विशेष रूप से, मुझे अच्छा उद्धरण देखने में अच्छा लगेगा कि क्यों आपको लगता है कि प्रतियां = N संपूर्ण डिवाइस विफलता का सामना नहीं कर रही हैं - जो कि हम कभी भी पढ़े जाने के साथ मेल नहीं खाते हैं।
जेम्स मूर

1
@ जेम्स मूर एक पूरी डिवाइस विफलता के बाद, उस डिस्क पर कोई डिट्टो ब्लॉक नहीं लिखा जाएगा। पूल स्तर पर कोई अतिरेक नहीं है, इसलिए दोषपूर्ण डिस्क को नए द्वारा बदलने का कोई तरीका नहीं है। उस स्थिति को ठीक से ठीक करने के लिए एकमात्र तरीका पूल का पूर्ण बैकअप करना होगा, इसे स्वस्थ उपकरणों के साथ फिर से बनाना होगा, और बैकअप से पुनर्स्थापित करना होगा जबकि यह सुनिश्चित करना होगा कि पहले बैकअप होने से पहले कोई अनजाने रिबूट न ​​हो। अन्यथा पूल आयात करने योग्य नहीं हो सकता है और इसका डेटा खो गया है। यह निरर्थक पूलों की तुलना में काफी बोझ है जहां एक खराब डिस्क को पुनर्प्राप्त किया जाता है जो ऑन-लाइन किया जाता है और रिबूट से बच जाता है।
22 अगस्त को jlliagre

1
यहाँ एक संदर्भ दिया गया है: docs.oracle.com/cd/E19082-01/817-2271/gbbvf/… For a device to be replaced, the pool must be in the ONLINE state. The device must be part of a redundant configuration, or it must be healthy (in the ONLINE state). मैं मानती हूं कि प्रतियां = 2 या 3 को अतिरेक विन्यास नहीं माना जाता है।
jlliagre

1
हालांकि, एक बात का ध्यान रखें, यदि आप मूल रूप से हैं copies=1और आपने इसे अपने नाम कर लिया है copies=2, तो आप शायद बाद में फिर से तैयार करना / फिर से शुरू करना चाहेंगे - जिससे ये उदाहरण बनेंगे। लेकिन @ जिलीग्रे सही है: डिट्टो ब्लॉक एक निरर्थक विन्यास का गठन नहीं करता है। कोई गारंटी नहीं है कि ब्लॉक किसी अन्य डिवाइस पर सेट हैं, भले ही आपके पास एक पूल में कई डिवाइस हों।
एंड्रयू एम।

1
"प्रतियां = एन जहां एन> 1" सुविधा का उद्देश्य अतिरेक जोड़ना नहीं है। इसका उद्देश्य डेटा भ्रष्टाचार को हल करना है। zfs को लिखी गई हर चीज़ को चेकसमेड या हैशेड किया जाता है। जब इसे वापस पढ़ा जाता है, तो चेकसम / हैश सत्यापित होता है। यदि N = 1 है, तो चेकसम / हैश सत्यापन विफलता ऐप में वापस आ जाती है। यदि N> 1 है, तो अन्य प्रतियों में से किसी एक को परामर्श दिया जा सकता है और अन्य सभी प्रतियों की मरम्मत के लिए उपयोग किया जा सकता है।
लॉन्गनेक

9

मुझे यह सवाल वास्तव में पेचीदा लगा, और प्रलेखन पर एक घंटे बिताने के बाद, मैंने कोड में डुबकी लगाई। यहाँ मैं क्या पाया है।

पहला, कुछ शब्दावली। Ditto ब्लॉक (जो कि ये प्रतियां हैं, दर्पणों के विपरीत) स्वचालित रूप से एक लेखन पर बनाई जाती हैं, लेकिन मूल प्रति के रूप में एक ही आभासी डिवाइस (vdev) में हो सकती हैं या नहीं भी हो सकती हैं। दूसरी ओर, प्रतिबिंबित ब्लॉक हमेशा एक और आभासी डिवाइस पर परिलक्षित होते हैं।

हालाँकि, कोड बच्चों के रूप में दोनों प्रकार के ब्लॉक को संदर्भित करता है। आप यहां देखेंगे कि डिट्टो ब्लॉक सिर्फ बच्चों के साथ है io_vd == NULL(यह लिखने के कार्य में है)। मिरर किए गए ब्लॉक के io_vdलिए, संबंधित वर्चुअल डिवाइस (आपकी दूसरी डिस्क, उदाहरण के लिए) पर सेट की जाएगी।

इसे ध्यान में रखते हुए, जब यह पढ़ने वाले हिस्से में पहुंच जाता है, तो यह सभी बच्चों के साथ व्यवहार करता है (जैसा कि वे दर्पण या डिट्टो ब्लॉक करते हैं) संभावित असुरक्षित के रूप में अगर इसमें अपेक्षित नहीं है good_copies, और आवश्यकतानुसार उन्हें फिर से लिखता है । तो ऐसा लगता है कि आपके प्रश्न का उत्तर है - हाँ, यह उन्हें फिर से लिखेगा जब आपके पास कम से कम एक अच्छी प्रतिलिपि होगी, और दोनों में से कोई एक:

  • जब आप डेटा को पढ़ने का प्रयास करते हैं, तो अप्रत्याशित त्रुटियां
  • आप resilvering कर रहे हैं, या
  • आप स्क्रबिंग कर रहे हैं।

ओह! हो सकता है कि कोई व्यक्ति दोषों को इंगित कर सकता है, लेकिन मुझे इस छोटे से व्यायाम के माध्यम से ZFS के बारे में जानने में मज़ा आया, और मुझे आशा है कि इससे मदद मिलेगी!


1
समस्या @ jlliagre के उत्तर में है - यदि कोई उपकरण खो देता है तो पूल मर जाता है। तथ्य यह है कि पूल में अभी भी पर्याप्त डिट्टो ब्लॉक हैं जो मायने नहीं रखते हैं। उस के आसपास कोई रास्ता?
जेम्स मूर

4
यदि आप डिवाइस का पहला 1MB विफल रहा है, तो @JamesMoore आप अपमानित अवस्था में ऑनलाइन सरणी को मजबूर कर सकते हैं। संभवतः आपको असफल डिवाइस से सिर्फ मेटाडेटा की आवश्यकता है। मैंने इसे एक jbod- शैली के ज़ूलप के साथ परीक्षण किया है और यह काम करता है: raidz टूटे हुए लेबल को पुनर्प्राप्त करना । मैंने पहले zd5 को तोड़ने के बाद और उसके बाद एक md5sum किया था, और आयात के बाद केवल प्रतियां = 1 फाइल सिस्टम टूट गया था। प्रतियां = 2 और प्रतियां = 3 फाइल सिस्टम पूरी तरह से मेल खाते हैं।
जोड़ी सी।

2

@jlliagre और अन्य जो यह सोचते हैं कि यदि एक डिस्क (vdevs) में से एक की मृत्यु हो जाती है, तो पूरा झोपड़ा मर जाता है, लेकिन पूल निरर्थक नहीं है (दर्पण / raidz)। यह सच नहीं है; एक मल्टी-डिस्क पूल हमेशा सिंगल कम्प्लीट डिस्क फेलियर से बचेगा, भले ही वह मिरर या रैडज़ न हो।

ZFS मेटाडाटा को हमेशा कम से कम 2 बार कॉपी किया जाता है ताकि एक पूर्ण डिस्क (या इसके किसी भी हिस्से) की कुल विफलता फ़ाइल सिस्टम को नीचे नहीं ले जाएगी। इसके अलावा, कई फाइलें, विशेष रूप से छोटे वाले, सभी डिस्क में नहीं फैलेगी और इसलिए डिस्क की खराबी से जरूरी नहीं होगा । ओपी, डिट्टो ब्लॉक (उपयोगकर्ता डेटा प्रतियां> 1) का उपयोग करके एक मल्टी-डिस्क पूल के मामले के बारे में पूछ रहा है । यहां, एक एकल पूर्ण डिस्क विफलता का परिणाम कभी भी किसी भी डेटा हानि में नहीं होना चाहिए ।ZFS हमेशा मूल ब्लॉक से दूर डिट्टो ब्लॉकों को रखने की कोशिश करेगा, और कई vdevs के साथ पूल के लिए, इसका हमेशा एक और vdev पर मतलब होता है (एक अपवाद हो सकता है जहां एक vdev है> पूल का 50%, जो बहुत असामान्य होगा । फ़ाइल सिस्टम मेटा डेटा भी हमेशा ditto स्तर की तुलना में +1 या +2 गुना अधिक कॉपी किया जाता है , इसलिए यह हमेशा डिस्क विफलता से बचेगा। इसके अलावा, यदि आपके पास तीन से अधिक डिस्क हैं, तो आपको बिना किसी डेटा हानि के उनमें से आधे तक खोने में सक्षम होना चाहिए; ZFS अगले डिस्क पर ditto ब्लॉक्स को स्टोर करता है, जब तक कि आप दो आसन्न डिस्क नहीं खोते हैं, तो आपके पास डेटा हानि कभी नहीं होती है। (डिट्टो = 2 के लिए तीन सहायक डिस्क विफलता)।

जब फ़ाइल तक पहुंचने के लिए डेटा की पर्याप्त प्रतियां होती हैं (चाहे वे प्रतियां डिट्टो ब्लॉक, मिरर या रेड्ज़ से हों), तो फ़ाइल के एक्सेस होने पर डेटा की सभी अनुपलब्ध प्रतियों की मरम्मत की जाती है। यह स्क्रब का उद्देश्य है; सभी डेटा को पढ़ें और किसी भी तरह से ठीक करें जो अनावश्यक प्रतियों का उपयोग करके खराब है। तो सीधे ओपी प्रश्न का उत्तर देने के लिए, आपको बस असफल ड्राइव को बदलने के बाद एक स्क्रब करने की आवश्यकता है, और सभी प्रतियां बहाल हो जाएंगी।

हमेशा की तरह, आप आसानी से पूल बनाकर उन अवधारणाओं का प्रयोग कर सकते हैं जिनके बैकिंग स्टोर के लिए vdevs सिर्फ साधारण विरल फाइलें हैं। वीवीडी फ़ाइलों को हटाने या भ्रष्ट करने से आप किसी भी प्रकार की विफलता का अनुकरण कर सकते हैं, और पूल, फ़ाइल सिस्टम, और डेटा की अखंडता को सत्यापित कर सकते हैं।

संपादित करें: प्रयोग करने के बाद, ऐसा लगता है कि यदि डिस्क मल्टी-डिस्क गैर-निरर्थक पूल में प्रतियां> = 2 के साथ विफल हो जाती है, तो zfs पूल को विफल कर देगा। एक या अधिक डिस्क्स पर पैतृक डेटा भ्रष्टाचार जीवित रहना चाहिए और इसे एक स्क्रब द्वारा तय किया जाना चाहिए।


उन प्रकार के प्रयोगों के बारे में डरावनी बात यह है कि वे मुझे यह बताने के लिए महान हैं कि सेटअप तुरंत या कम से कम जल्दी विफल हो जाएगा। वे मुझे यह बताने के लिए महान नहीं हैं कि एक सेटअप कभी-कभी विफल हो जाएगा। किसी भी मामले में, यह स्पष्ट नहीं है कि आप एक पूल कैसे लाते हैं जिसमें विफलता है; मैंने तीन विरल फ़ाइलों के साथ इस तरह एक पूल स्थापित करने की कोशिश की और विरल फ़ाइलों में से एक को हटाने से पूरे पूल के लिए घातक प्रतीत होता है। ज़ूलप रिप्लेस फेल फ़ाइल को नहीं बदलेगा, ज़ूलप स्क्रब स्टॉल 5% (और ये बहुत छोटे पूल हैं), और illumos.org/msg/ZFS-8000-5E पर त्रुटि पृष्ठ आशावादी नहीं है।
जेम्स मूर

मेरे एक्सपीरिएंस के समान परिणाम मेरे जवाब के बाद ही हुआ। मैं आम तौर पर केवल raidz का उपयोग करता हूं, और जो मुझे विश्वसनीय स्रोत (ओरेकल ब्लॉग) माना जाता था, उससे मिली जानकारी के आधार पर जवाब दे रहा था। मुझे अब विश्वास नहीं है कि प्रतियां> 1 के साथ एक मल्टी-डिस्क जेबीओडी टाइप पूल, डिस्क विफलता से बच सकता है।
आरोन बी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.