ZFS: คุณจะกู้คืนจำนวนสำเนาที่ถูกต้องได้อย่างไรหลังจากสูญเสียไดรฟ์


12

ด้วย zfs หากคุณมีcopies=2แล้วคุณสูญเสียไดรฟ์ที่มีสำเนาเหล่านั้นคุณจะบอกระบบว่าควรทำสำเนาบล็อกข้อมูลใหม่สำหรับไฟล์ที่ได้รับผลกระทบอย่างไร หรือ zfs เพิ่งเริ่มเพิ่มบล็อคข้อมูลสำหรับสำเนาเพิ่มเติมทันทีที่พบข้อมูลบล็อกข้อมูลที่ไม่ดี?

สครับจะทำเช่นนี้?

(v0.6.0.56-rc8, ZFS พูลเวอร์ชั่น 28, ระบบไฟล์ ZFS เวอร์ชั่น 5, Ubuntu 11.10)

คำตอบ:


10

"copy = 2" (หรือ 3) ได้รับการออกแบบให้ใช้กับพูลที่ไม่มีความซ้ำซ้อน (ดิสก์หรือแถบเดียว) เป้าหมายคือสามารถกู้คืนความเสียหายของดิสก์รองได้ไม่ใช่ความล้มเหลวของอุปกรณ์ทั้งหมด ในกรณีหลังสระว่ายน้ำไม่สามารถถอดออกได้ดังนั้นจึงไม่มีการฟื้นฟูบล็อกเหมือนกัน

หากคุณมีความซ้ำซ้อน (การทำมิเรอร์ / raidz / raidz2 / raidz3) บล็อก ditto จะไม่แตกต่างจากบล็อกอื่น ๆ และการถู / การ resilvering จะสร้างขึ้นใหม่


สิ่งนี้ขัดแย้งโดยตรงกับสิ่งที่ @Redmumba พูดถึง - และ Redmumba มีลิงก์ไปยังรหัส คุณสามารถอ้างอิงแหล่งที่มาของสิ่งที่คุณพูดได้ไหม โดยเฉพาะอย่างยิ่งฉันชอบที่จะเห็นการอ้างอิงที่ดีว่าเพราะเหตุใดคุณจึงคิดว่าสำเนา = N จะไม่รับมือกับความล้มเหลวของอุปกรณ์ทั้งหมด - ซึ่งไม่ตรงกับสิ่งที่ฉันได้อ่าน
James Moore

1
@ James Moore หลังจากความล้มเหลวของอุปกรณ์ทั้งหมดจะไม่มีการเขียนบล็อกที่เหมือนกันบนดิสก์นั้น ไม่มีความซ้ำซ้อนที่ระดับพูลดังนั้นจึงไม่มีวิธีการแทนที่ดิสก์ที่ผิดพลาดด้วยดิสก์ใหม่ วิธีเดียวที่จะกู้คืนสถานการณ์ได้อย่างถูกต้องคือทำการสำรองข้อมูลทั้งหมดของพูลสร้างอุปกรณ์นั้นใหม่และกู้คืนจากการสำรองข้อมูลในขณะที่ตรวจสอบให้แน่ใจว่าไม่มีการรีบูตโดยไม่ตั้งใจก่อนที่จะทำการสำรองข้อมูลครั้งแรกเสร็จสิ้น มิฉะนั้นพูลอาจไม่สามารถอิมพอร์ตได้และข้อมูลสูญหาย นี่เป็นภาระเมื่อเทียบกับพูลซ้ำซ้อนซึ่งการกู้คืนดิสก์ที่ไม่ดีเสร็จสิ้นในบรรทัดและยังมีการรีบูตเครื่อง
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แล้วคุณอาจต้องการ resilver / rescrub หลังจากนั้น - ซึ่งจะสร้างอินสแตนซ์เหล่านี้ แต่ @jilliagre นั้นถูกต้อง: บล็อก ditto ไม่ถือเป็นการกำหนดค่าที่ซ้ำซ้อน ไม่มีการรับประกันว่าบล็อกจะถูกตั้งค่าในอุปกรณ์อื่นแม้ว่าคุณจะมีอุปกรณ์หลายเครื่องในพูล
แอนดรูว์เอ็ม

1
คุณลักษณะ "คัดลอก = N โดยที่ N> 1" ไม่ได้มีไว้เพื่อเพิ่มความซ้ำซ้อน มีวัตถุประสงค์เพื่อแก้ไขข้อมูลเสียหาย ทุกอย่างที่เขียนไปยัง zfs นั้นจะถูกตรวจสอบหรือถูกแฮช เมื่ออ่านแล้วจะมีการตรวจสอบ checksum / hash ถ้า N = 1 แสดงว่าการตรวจสอบล้มเหลวในการตรวจสอบ / แฮชทำให้เกิดข้อผิดพลาดกลับไปที่แอพ ถ้า N> 1 คุณสามารถปรึกษากับสำเนาอื่นหนึ่งชุดเพื่อใช้ในการซ่อมแซมสำเนาอื่น ๆ ทั้งหมด
longneck

9

ฉันพบคำถามนี้ที่น่าสนใจจริง ๆ และหลังจากใช้เวลาหนึ่งชั่วโมงเพื่อเทเอกสารฉันพุ่งเข้าไปในรหัส นี่คือสิ่งที่ฉันพบ

ก่อนอื่นคำศัพท์บางคำ บล็อก Ditto (ซึ่งเป็นสิ่งที่สำเนาเหล่านี้ตรงข้ามกับมิเรอร์) จะถูกสร้างขึ้นโดยอัตโนมัติในการเขียน แต่อาจหรือไม่อาจอยู่ในอุปกรณ์เสมือน (vdev) เดียวกันกับสำเนาต้นฉบับ ในทางกลับกันบล็อกที่ทำมิเรอร์จะถูกสะท้อนไปยังอุปกรณ์เสมือนอื่นเสมอ

อย่างไรก็ตามรหัสหมายถึงบล็อกทั้งสองประเภทเป็นลูก คุณจะเห็นที่นี่ว่าบล็อกที่เหมือนกันเป็นเพียงเด็ก ๆ ที่มีio_vd == NULL(นี่คือในฟังก์ชั่นการเขียน) สำหรับบล็อกที่มิร์เรอร์io_vdจะถูกตั้งค่าเป็นอุปกรณ์เสมือนที่สอดคล้องกัน (ตัวอย่างเช่นดิสก์ที่สองของคุณ)

โดยที่ในใจเมื่อได้รับไปยังส่วนการอ่าน , การปฏิบัติต่อเด็กทุกคน (ไม่ว่าจะเป็นกระจกหรือบล็อกเหมือนกัน) ขณะที่อาจไม่ปลอดภัยถ้ามันไม่ได้มีความคาดหวังgood_copiesและปรับเปลี่ยนได้ตามต้องการ ดังนั้นดูเหมือนว่าคำตอบสำหรับคำถามของคุณคือ - ใช่มันจะเขียนใหม่เมื่อคุณมีสำเนาที่ดีอย่างน้อยหนึ่งสำเนาและอย่างใดอย่างหนึ่งต่อไปนี้:

  • ข้อผิดพลาดที่ไม่คาดคิดเมื่อคุณพยายามอ่านข้อมูล
  • คุณกำลัง resilvering หรือ
  • คุณกำลังขัดผิว

วุ้ย บางทีใครบางคนสามารถชี้ให้เห็นข้อบกพร่อง แต่ฉันสนุกกับการเรียนรู้เกี่ยวกับ ZFS ผ่านการออกกำลังกายเล็ก ๆ นี้และฉันหวังว่านี่จะช่วยได้!


1
ปัญหาอยู่ในคำตอบของ @ jlliagre - พูลเสียชีวิตหากสูญเสียอุปกรณ์ใด ๆ ความจริงที่ว่าสระว่ายน้ำยังคงมีบล็อกเหมือนกันมากพอดูเหมือนจะไม่สำคัญ มีวิธีไหนบ้าง?
James Moore

4
@JamesMoore คุณสามารถบังคับให้อาร์เรย์ออนไลน์อยู่ในสถานะเสื่อมโทรมได้หากคุณมีอุปกรณ์ 1MB แรกที่ล้มเหลว สันนิษฐานว่าคุณเพียงแค่ต้องการข้อมูลเมตาจากอุปกรณ์ที่ล้มเหลว ฉันได้ทดสอบสิ่งนี้ด้วยสวนสัตว์สไตล์ jbod และใช้งานได้: การกู้คืนฉลากที่ใช้งานไม่ได้ของRaidz ฉันทำ md5sum ก่อนและหลังฉันทำลาย zpool และเฉพาะระบบไฟล์ copy = 1 ที่เสียหายหลังจากการนำเข้า การคัดลอก = 2 และคัดลอก = 3 ระบบแฟ้มเข้าคู่กันอย่างสมบูรณ์
โจดี้ซี

2

@jlliagre และคนอื่น ๆ ที่ดูเหมือนว่าคิดว่าสวนสัตว์ทั้งหมดตายถ้ามันเป็นหนึ่งในดิสก์ (vdevs) ตาย แต่สระว่ายน้ำไม่ซ้ำซ้อน (mirror / raidz) นี่ไม่เป็นความจริง; ดิสก์หลายสระว่ายน้ำจะเสมออยู่รอดความล้มเหลวของดิสก์เดียวที่สมบูรณ์แม้ว่าจะไม่ได้เป็นกระจกหรือ RAIDZ

ข้อมูลเมตา ZFS จะถูกคัดลอกอย่างน้อย 2 ครั้งเสมอดังนั้นความล้มเหลวทั้งหมดของดิสก์ที่สมบูรณ์ (หรือส่วนใดส่วนหนึ่งของมัน) จะไม่ทำให้ระบบไฟล์ล้มเหลว นอกจากนี้ไฟล์จำนวนมากโดยเฉพาะไฟล์ที่มีขนาดเล็กกว่าจะไม่ถูกกระจายไปทั่วดิสก์ทั้งหมดและดังนั้นจึงไม่จำเป็นต้องมีความผิดพลาดจากความล้มเหลวของดิสก์ OP กำลังถามถึงกรณีของmulti-disk pool โดยใช้ ditto blocks (สำเนาข้อมูลผู้ใช้> 1) ที่นี่ความล้มเหลวของดิสก์ที่สมบูรณ์เดียวไม่ควรทำให้ข้อมูลสูญหายZFS จะพยายามวางบล็อกที่เหมือนกันอยู่ห่างจากบล็อกเดิมเสมอและสำหรับกลุ่มที่มี vdev หลายตัวสิ่งนี้จะหมายถึง vdev อื่นเสมอ (ข้อยกเว้นอาจเป็นที่หนึ่ง vdev> 50% ของพูลซึ่งจะผิดปกติมาก) . ข้อมูลเมตาของระบบไฟล์จะถูกคัดลอกมากกว่าหรือสูงกว่าระดับ ditto 1 ถึง 2 เท่าดังนั้นจึงจะสามารถอยู่รอดดิสก์ที่ล้มเหลวได้เสมอ นอกจากนี้หากคุณมีพูลมากกว่าสามดิสก์คุณควรจะสามารถสูญเสียได้ถึงครึ่งของดิสก์โดยไม่ทำให้ข้อมูลสูญหาย ZFS เก็บบล็อกที่เหมือนกันบนดิสก์แผ่นถัดไปตราบใดที่คุณไม่เคยสูญเสียดิสก์ที่อยู่ติดกันสองแผ่นคุณจะไม่สูญเสียข้อมูล (สาม adjecent ดิสก์ล้มเหลวสำหรับ ditto = 2)

เมื่อมีสำเนาของข้อมูลเพียงพอที่จะเข้าถึงไฟล์ (ไม่ว่าสำเนาเหล่านั้นมาจากบล็อกที่เหมือนกัน, มิเรอร์หรือ raidz) จากนั้นสำเนาข้อมูลที่หายไปทั้งหมดจะได้รับการซ่อมแซมเมื่อเข้าถึงไฟล์ นี่คือจุดประสงค์ของการขัดผิว อ่านข้อมูลทั้งหมดและแก้ไขสิ่งที่ไม่ดีโดยใช้สำเนาที่ซ้ำซ้อน ดังนั้นเพื่อตอบคำถาม OP โดยตรงคุณเพียงแค่ต้องทำการขัดหลังจากเปลี่ยนไดรฟ์ที่ล้มเหลวและสำเนาทั้งหมดจะถูกกู้คืน

เช่นเคยคุณสามารถทดลองกับแนวคิดได้อย่างง่ายดายโดยการสร้างพูลที่ vdevs สำหรับที่เก็บข้อมูลสำรองเป็นเพียงไฟล์กระจัดกระจายธรรมดา ด้วยการลบหรือทำลายไฟล์ vdev คุณสามารถจำลองความล้มเหลวใด ๆ และสามารถตรวจสอบความถูกต้องของพูลระบบไฟล์และข้อมูลได้ตลอดทาง

แก้ไข: หลังจากทดลองดูเหมือนว่า zfs จะล้มเหลวในพูลหากดิสก์ล้มเหลวในพูลที่ไม่ใช่ดิสก์ซ้ำซ้อนหลายดิสก์พร้อมสำเนา> = 2 ความเสียหายของข้อมูลส่วนบุคคลในดิสก์หนึ่งแผ่นขึ้นไปควรอยู่รอดและควรได้รับการแก้ไขโดยการขัด


สิ่งที่น่ากลัวเกี่ยวกับการทดลองประเภทนี้คือมันยอดเยี่ยมมากที่บอกฉันว่าการตั้งค่าจะล้มเหลวทันทีหรืออย่างน้อยก็เร็ว พวกเขาไม่ค่อยดีนักที่บอกฉันว่าการตั้งค่าจะล้มเหลวเป็นครั้งคราว ไม่ว่าในกรณีใดมันไม่ชัดเจนว่าคุณจะนำพูลที่มีความล้มเหลวกลับมาได้อย่างไร ฉันพยายามตั้งค่าพูลแบบนี้ด้วยไฟล์สามไฟล์หร็อมแหร็มและการลบไฟล์ที่กระจัดกระจายหนึ่งไฟล์ดูเหมือนว่าจะร้ายแรงถึงพูลทั้งหมด zpool replace จะไม่แทนที่ไฟล์ที่ล้มเหลว zpool scrub stalls ที่ 5% (และเหล่านี้เป็นพูลขนาดเล็กมาก) และหน้าข้อผิดพลาดที่illumos.org/msg/ZFS-8000-5Eไม่ได้มองในแง่ดี
James Moore

ฉันมีผลลัพธ์ที่คล้ายกันกับ experiements ของฉันทำหลังจากคำตอบของฉัน ปกติแล้วฉันจะใช้ Raidz และตอบโดยอ้างอิงจากข้อมูลที่ฉันเชื่อว่าเป็นแหล่งข้อมูลที่น่าเชื่อถือ (บล็อกของ Oracle) ฉันไม่เชื่ออีกต่อไปว่าพูประเภท JBOD หลายดิสก์ที่มีการคัดลอก> 1 สามารถรอดชีวิตจากความล้มเหลวของดิสก์ได้
Aaron B
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.