mdadm सिंगल चंक / सेक्टर की मरम्मत करता है


0

मैं एक NAS का निर्माण करना चाहता हूँ mdadm के लिए RAID और btrfs को बिट्रोट डिटेक्शन के लिए। मेरे पास एक काफी बुनियादी सेटअप है, 3 1TB डिस्क को mdadm के साथ एक RAID5 से जोड़कर, उसके ऊपर btrfs की तुलना में।

मुझे पता है कि mdadm बिट्रोट की मरम्मत नहीं कर सकता है। यह केवल मुझे बता सकता है जब मिसमैच होते हैं लेकिन यह नहीं जानता कि कौन सा डेटा सही है और कौन सा दोषपूर्ण है। जब मैं बिटड्रॉम का अनुकरण करने के बाद अपने md0 को सुधारने के लिए mdadm बताता हूं, तो यह हमेशा समता का पुनर्निर्माण करता है। Btrfs चेकसम का उपयोग करता है इसलिए यह जानता है कि कौन सा डेटा दोषपूर्ण है, लेकिन यह डेटा की मरम्मत नहीं कर सकता क्योंकि यह समता नहीं देख सकता है।

मैं हालांकि एक btrfs स्क्रब चला सकता हूं और डेटा के ऑफसेट को प्राप्त करने के लिए syslog को पढ़ सकता हूं जो उसके चेकसम से मेल नहीं खाता। फिर मैं इस ऑफसेट को डिस्क पर और उस डिस्क पर एक ऑफसेट का अनुवाद कर सकता हूं, क्योंकि मुझे पता है कि डेटा md0 (2048 * 512), चंक आकार (512K) और लेआउट (बाएं-सममित) की ऑफसेट शुरू होता है। लेआउट का मतलब है कि मेरी पहली परत में समता तीसरी डिस्क पर, दूसरी डिस्क पर दूसरी परत में और तीसरी परत पहली डिस्क पर है।

डिस्क-प्रारूप ज्ञान पर इस सभी डेटा और कुछ और btrfs को मिलाकर, मैं ठीक से गणना कर सकता हूं कि किस डिस्क का कौन सा हिस्सा दोषपूर्ण है। हालाँकि, मैं mdadm को इस विशिष्ट प्रकार की मरम्मत के लिए बताने का कोई तरीका नहीं खोज सकता।

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

मेरा सवाल यह है: क्या एक एकल चंक (जो समता नहीं है) की मरम्मत के लिए mdadm को बताने का कोई तरीका है और संभवतः एक डिस्क क्षेत्र को भी खराब मान सकता है? शायद एक io त्रुटि बना?

(और मुझे पता है कि ZFS यह सब अपने आप कर सकता है, लेकिन मैं ECC मेमोरी का उपयोग नहीं करना चाहता)

संपादित करें: यह सवाल / जवाब है कि कैसे btrfs RAID6 अस्थिर है और ZFS कितना अधिक स्थिर / प्रयोग करने योग्य है। यह मेरे प्रश्न को संबोधित नहीं करता है कि mdadm के साथ एक ही ज्ञात दोषपूर्ण चंक को कैसे ठीक किया जाए।


1
आपको ZFS का उपयोग करने के लिए ECC मेमोरी की आवश्यकता नहीं है .... मैं आपको ZFS का उपयोग करने की सलाह दूंगा।
Attie

1
" ... मैं फिर इस डिस्क को डिस्क पर और उस डिस्क पर एक ऑफसेट का अनुवाद कर सकता हूं ... " - आप भंडारण के साथ बहुत दूर हाथ होने की योजना बना रहे हैं ... यह शायद गलत होगा।
Attie

अगर मैं ECC के बिना ZFS का उपयोग करता हूं, तो मैं बिट्रो प्रोटेक्शन के बारे में चिंता नहीं कर सकता। दोनों बहुत ही दुर्लभ त्रुटियों को रोकते हैं, लेकिन मैं यह अधिकार करना चाहता हूं। जैसा कि बहुत हाथों पर होने के कारण, आप सही हैं। लेकिन मुझे कोई बेहतर रास्ता नहीं दिख रहा है। मुझे पता है कि यह संभव है, netgear की रेडीनास और सिनाल्ोलॉजी ने mdadm और btrfs को संयोजित किया है, और अभी भी बिट्रोट सुरक्षा बनाए रखते हैं।
user10186803

1
आप न केवल बिट रोट के खिलाफ की रक्षा कर रहे हैं, बल्कि अन्य चीजें जैसे पढ़ना / लिखना त्रुटियों (जैसे: उच्च लिखना)। जेडएफएस / ईसीसी मुद्दा बेहद अतिरंजित और गलत समझा गया है - हां एक चल रही मशीन ईसीसी से लाभान्वित हो सकती है, लेकिन डेटा के लिए कई दुर्लभ मुद्दों को सही तरीके से सामना करना होगा। आप उस स्थिति के लिए ZFS का उपयोग करने से बेहतर होंगे जो आपने रेखांकित की है ... ECC के बिना BTRFS + MDADM + लिपियों का उपयोग करना ECC के बिना ZFS की तुलना में किसी समस्या से कम कैसे होगा?
Attie

1
हालांकि पूछा गया सवाल mdadm raid6 पर Btrfs जैसा नहीं है ? , यह एक XY समस्या है जो अन्य प्रश्न और उत्तर द्वारा पूरी तरह से संबोधित की जाती है ।
13

जवाबों:


1

मुझे इस विशिष्ट चंक की मरम्मत के लिए mdadm बताने का कोई तरीका नहीं मिल रहा है।

ऐसा इसलिए है क्योंकि जब मौन डेटा भ्रष्टाचार होता है, तो md के पास यह जानने के लिए पर्याप्त जानकारी नहीं होती है कि कौन सा ब्लॉक चुपचाप भ्रष्ट है।

मैं आपको प्रश्न 4 परmd अपना उत्तर पढ़ने के लिए आमंत्रित करता हूं (" अमान्य डेटा वाले उपकरण का उपयोग क्यों जारी रखता है?") , जो इसे और विस्तार से बताता है।

अपने प्रस्तावित लेआउट के लिए मामलों को बदतर बनाने के लिए, यदि एक समता ब्लॉक मूक डेटा भ्रष्टाचार से ग्रस्त है, तो ऊपर Btrfs परत इसे नहीं देख सकती है! जब संबंधित डेटा ब्लॉक वाली डिस्क विफल हो जाती है और आप इसे बदलने का प्रयास करते हैं, तो md दूषित डेटा का उपयोग करेगा और अपरिवर्तनीय रूप से आपके डेटा को दूषित करेगा। केवल जब वह डिस्क विफल हो जाएगी तो Btrfs भ्रष्टाचार को पहचान लेंगे, लेकिन आपने पहले ही डेटा खो दिया है।

ऐसा इसलिए है क्योंकि md समता खंडों से नहीं पढ़ता है जब तक कि सरणी को नीचा नहीं किया जाता है।


तो क्या किसी भी chunk (जो समता नहीं है) को ठीक करने के लिए mdadm बताने का कोई तरीका है और संभवतः एक डिस्क सेक्टर को भी खराब मान सकता है? शायद एक io त्रुटि बना?

बुरे क्षेत्रों के लिए जो हार्ड ड्राइव का पता लगा लेता है, md उस आसानी से सामना कर सकता है क्योंकि खराब सेक्टर को md के लिए पहचाना जाता है।

आप तकनीकी रूप से एक बुरा क्षेत्र बना सकते हैं hdparm --make-bad-sector, लेकिन आप कैसे जानते हैं कि किस डिस्क ने मूक डेटा भ्रष्टाचार से प्रभावित किया है?

इस सरलीकृत उदाहरण पर विचार करें:

समानता सूत्र: PARITY = DATA_1 + DATA_2

+--------+--------+--------+
| DATA_1 | DATA_2 | PARITY |
+--------+--------+--------+
|      1 |      1 |      2 | # OK
+--------+--------+--------+

अब प्रत्येक ब्लॉक को मान के साथ चुपचाप भ्रष्ट करते हैं 3:

+--------+--------+--------+
| DATA_1 | DATA_2 | PARITY |
+--------+--------+--------+
|      3 |      1 |      2 | # Integrity failed – Expected: PARITY = 4
|      1 |      3 |      2 | # Integrity failed – Expected: PARITY = 4
|      1 |      1 |      3 | # Integrity failed – Expected: PARITY = 2
+--------+--------+--------+

यदि आपके पास देखने के लिए पहली तालिका नहीं थी, तो आपको कैसे पता चलेगा कि कौन सा ब्लॉक दूषित था?
आप निश्चित रूप से नहीं जान सकते।

यही कारण है कि Btrfs और ZFS दोनों चेकसम ब्लॉक। यह थोड़ा अधिक डिस्क स्थान लेता है, लेकिन यह अतिरिक्त जानकारी स्टोरेज सिस्टम को पता लगाने देती है कि कौन सा ब्लॉक झूठ बोल रहा है।

से जेफ़ बोनविक के ब्लॉग लेख "RAID-जेड" :

जब भी आप एक RAID-Z ब्लॉक पढ़ते हैं, ZFS इसकी चेकसम के खिलाफ तुलना करता है। यदि डेटा डिस्क ने सही उत्तर नहीं दिया है, तो ZFS समता को पढ़ता है और फिर कॉम्बीनेटरियल पुनर्निर्माण को यह पता लगाने के लिए करता है कि कौन सा डिस्क खराब डेटा लौटाता है।

Md पर Btrfs के साथ ऐसा करने के लिए, आपको प्रत्येक ब्लॉक को पुनर्गणना करने की कोशिश करनी होगी, जब तक कि Btrfs में चेकसम मैच न हो जाए, एक समय लेने वाली प्रक्रिया जिसमें उपयोगकर्ता / स्क्रिप्ट के संपर्क में कोई आसान इंटरफ़ेस न हो।


मुझे पता है कि ZFS यह सब अपने आप कर सकता है, लेकिन मैं ECC मेमोरी का उपयोग नहीं करना चाहता

Md पर न तो ZFS और न ही Btrfs ईसीसी मेमोरी पर निर्भर है या इसके बारे में भी नहीं जानते हैं। ECC मेमोरी केवल मेमोरी में मूक डेटा भ्रष्टाचार को पकड़ती है, इसलिए यह भंडारण प्रणाली-अज्ञेय है।

मैं mdadm raid6 पर Btrfs से पहले RAID-5 और RAID-6 (क्रमशः ZFS RAID-Z और RAID-Z2 के अनुरूप) के लिए Btrfs पर ZFS की सिफारिश की है? और md RAID में विफल डिवाइस जब एटीए जवाब देना बंद कर देता है , लेकिन मैं ZFS के कुछ और फायदों को रेखांकित करने का यह अवसर लेना चाहूंगा:

  • जब ZFS मूक डेटा भ्रष्टाचार का पता लगाता है, तो यह बिना किसी मानवीय हस्तक्षेप के मौके पर स्वचालित रूप से और तुरंत सही हो जाता है।
  • यदि आपको एक संपूर्ण डिस्क को फिर से बनाने की आवश्यकता है, तो ZFS पूरे ब्लॉक डिवाइस पर अनावश्यक रूप से चलने के बजाय केवल वास्तविक डेटा को "रिवाइवर" करेगा।
  • ZFS तार्किक वॉल्यूम और फाइल सिस्टम का एक ऑल-इन-वन समाधान है, जो इसे md के शीर्ष पर Btrfs की तुलना में प्रबंधित करने के लिए कम जटिल बनाता है।
  • RAID-Z और RAID-Z2 इसके विपरीत विश्वसनीय और स्थिर हैं
    • Md RAID-5 / RAID-6 पर Btrfs, जो केवल चुपचाप दूषित डेटा ब्लॉक पर त्रुटि का पता लगाने की पेशकश करता है (इसके अलावा चुपचाप खराब हो चुके समता ब्लॉक बहुत देर हो चुकी है) तक जा सकते हैं और त्रुटि सुधार करने का कोई आसान तरीका नहीं है, और
    • Btrfs RAID-5 / RAID-6, जिसमें " इसमें कई गंभीर डेटा-हानि बग हैं "।
  • अगर मैंने चुपचाप ZFS RAID-Z2 के साथ एक पूरी डिस्क को दूषित कर दिया, तो मुझे कोई डेटा नहीं खोना होगा जबकि md RAID-6 पर, मैं वास्तव में 455,681 इनकोड खो दिया हूं

-1

मुझे mdadm के लिए रीड एरर बनाने का एक तरीका मिला।

Dmsetup से आप तालिकाओं से तार्किक उपकरण बना सकते हैं।

डिवाइस एक तालिका लोड करके बनाए जाते हैं जो प्रत्येक सेक्टर के लिए एक लक्ष्य निर्दिष्ट करता है (512 बाइट्स)

प्रेषक: मैनपेज

इन तालिकाओं में आप उन ऑफसेटों को निर्दिष्ट कर सकते हैं जिन्हें एक IO त्रुटि वापस करनी चाहिए, उदाहरण के लिए:

0 4096 linear /dev/sdb 0
4096 1 error
4097 2093055 linear /dev/sdb 4097

यह ऑफसेट 4096 * 512 पर एक त्रुटि के साथ एक डिवाइस (1 जीबी) बनाता है।


पृथ्वी पर आप ऐसा क्यों करेंगे? जानबूझकर अक्षम्य त्रुटियों के साथ एक md डिवाइस बनाना सफल सरणी को फिर से स्थापित करता है, और बड़ी तस्वीर में, इस तरह से हैक पर फिक्सिंग डेटा अखंडता के प्रवाह के खिलाफ जाता है, और सुरंग दृष्टि दुर्घटनाओं की ओर जाता है। आपने उल्लेख किया, " मैं यह अधिकार करना चाहता हूं ", इसलिए आपको वास्तव में एक दशक तक स्थापित समाधान, जेडएफएस का उपयोग करना चाहिए।
डेल्टीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.