RAID (mdadm) - จะเกิดอะไรขึ้นถ้าไดรฟ์มีขนาดไม่ตรงกัน


15

คำถามที่ 1 - ก่อนที่คุณจะตอบด้วย "ใช้เพียงดิสก์ที่เล็กกว่า" ได้ยินฉันเร็ว ๆ WD Reds 3TB ของฉันมีขนาด 3001 GB สมมติว่าฉันติดตั้งกระจกเงาผ่าน mdadm สำหรับ sdb1 และ sdc1 ซึ่งครอบคลุม 100% ของไดรฟ์ แต่ทันใดนั้นหนึ่งในไดรฟ์ล้มเหลว การเปลี่ยนเป็น 3TB ชั่งน้ำหนักที่ 3000 GB จะเกิดอะไรขึ้นเมื่อฉันใส่ไดรฟ์ที่เล็กกว่าที่มีอยู่ในอาเรย์ ฉันรู้ว่าด้วยอาร์เรย์ใหม่ที่ใช้ 3000 vs 3001 มันจะสร้างอาร์เรย์เป็น 3000 แต่อย่างที่ฉันพูดแล้วอาร์เรย์ @ 3001 ปัจจุบันกับฉันจะเพิ่มไดรฟ์ขนาดเล็กลงได้อย่างไร มันจัดโครงสร้างใหม่ในระหว่างการสร้างใหม่ให้มีขนาด 3,000 GB หรือไม่?

คำถามที่ 2 - ในกรณีที่ฉันไม่สามารถเพิ่ม 3000 GB ลงในอาร์เรย์ด้วย 3001 GB ที่มีอยู่และเพียงลดขนาดเป็น 3000 ... ฉันสามารถปรับขนาด 3001 ลงเล็กน้อยได้หรือไม่

คำถามที่ 3 - หรือเป็นความคิดที่ดีกว่า ถ้าฉันลดขนาดไดรฟ์ 3TB เป็น 2999 GB ด้วยวิธีนี้ไม่ว่าจะเป็นไดรฟ์สั้น 1 MB, 1 ไบต์, 10 KB ไม่ว่าจะเป็นอะไรก็ตามมันจะรับไดรฟ์ "เล็ก" ที่ 2999 GB เสมอ

คำตอบ:


28

ฉันเจอคำตอบนี้โดยไม่ตั้งใจ แต่ในกรณีที่ใครอยากรู้อยากเห็นนี่เป็นคำตอบที่ได้รับการสนับสนุนจากการทดลอง

เวอร์ชั่นสั้น

คำถามโบนัส: ฉันสามารถสร้างmd(4)อาร์เรย์ RAID จากอุปกรณ์บล็อกที่มีขนาดไม่เท่ากันได้หรือไม่ ใช่ แต่อาร์เรย์ RAID จะมีขนาดของอุปกรณ์บล็อกที่เล็กที่สุด (บวกค่าโสหุ้ยบางอย่างสำหรับการดูแลทำความสะอาดของตัวเอง) หากขนาดอุปกรณ์ไม่อยู่ในระยะ 1% ของกันและกันคุณจะได้รับคำเตือน

คำถามที่ 1: ฉันสามารถเพิ่มmd(4)อาเรย์ RAID ที่มีอยู่ในอุปกรณ์ที่เล็กกว่าสมาชิกปัจจุบันที่เล็กที่สุดได้หรือไม่? ไม่ขอโทษ mdadmจะไม่ยอมทำเช่นนั้นเพื่อปกป้องข้อมูลของคุณ

คำถามที่ 2: คุณสามารถปรับขนาดอาร์เรย์ md ที่มีอยู่ได้หรือไม่ ใช่ (อ่านmdadmmanpge!) แต่อาจไม่คุ้มค่ากับความพยายาม คุณจะต้องสำรองข้อมูลทุกอย่างจากนั้นปรับขนาดเนื้อหาของอุปกรณ์ RAID จากนั้นปรับขนาดอุปกรณ์เอง - ทั้งหมดนี้มีแนวโน้มที่จะเกิดข้อผิดพลาดการคำนวณผิดและสิ่งอื่น ๆ ที่จะทำให้คุณเสียค่าใช้จ่าย .

มันไม่คุ้มกับความเสี่ยงและความพยายาม หากคุณมีดิสก์เปล่าใหม่นี่คือวิธีการปรับขนาดและเก็บระหว่างสำเนาข้อมูลทั้งหมดของคุณหนึ่งถึงสองครั้งตลอดเวลา (สมมติว่าคุณมี RAID1 2 ดิสก์):

  1. สร้างmd(4)อาร์เรย์ใหม่ในนั้น (โดยไม่มีดิสก์หนึ่งแผ่น)
  2. สร้างโครงสร้างของเนื้อหาอาเรย์อีกครั้ง (Crypto, LVM, ตารางพาร์ทิชั่น, การรวมกันใด ๆ ของมัน, ไม่ว่าเรือของคุณจะลอย)
  3. คัดลอกข้อมูลจากดิสก์ที่มีอยู่ไปยังดิสก์ใหม่
  4. รีบูตโดยใช้ดิสก์ใหม่
  5. เช็ดตารางพาร์ติชันของดิสก์เก่า (หรือศูนย์md(4)superblock) ถ้าจำเป็นให้สร้างพาร์ติชันที่จำเป็นเพื่อให้ตรงกับโครงร่างบนเขาใหม่ดิสก์
  6. เพิ่มดิสก์เก่าลงในอาร์เรย์ใหม่
  7. รอให้สมาชิกอาร์เรย์ทำการซิงค์ มีกาแฟบ้าง บินไปละตินอเมริกาและเลือกเมล็ดกาแฟของคุณเองสำหรับเรื่องนั้น :) (หากคุณอาศัยอยู่ในละตินอเมริกาบินไปแอฟริกาแทน)

หมายเหตุ: ใช่นี่เป็นเทคนิคเดียวกัน 0xC0000022L ที่อธิบายไว้ในคำตอบของเขา

คำถาม 3.จะเกิดอะไรขึ้นถ้าไดรฟ์สั้น 1G :) ไม่ต้องกังวลกับมัน โอกาสที่คุณจะเปลี่ยนไดรฟ์จะใหญ่ขึ้น อันที่จริงแล้วด้วยกลยุทธ์อย่างที่กล่าวมาข้างต้นจะจ่ายให้กับไดรฟ์ที่ใหญ่กว่าที่ถูกกว่าเมื่อใดก็ตามที่ล้มเหลว (หรือสำหรับการอัพเกรดที่ถูกกว่า) คุณสามารถรับการอัพเกรดแบบโปรเกรสซีฟได้

หลักฐานการทดลอง

การตั้งค่าการทดลอง

อันดับแรกให้ปลอมอุปกรณ์บล็อกบางอย่าง เราจะใช้/tmp/sdxและ/tmp/sdy(แต่ละ 100M) และ/tmp/sdz(99M)

cd /tmp
dd if=/dev/zero of=sdx bs=1M count=100
sudo losetup -f sdx
dd if=/dev/zero of=sdy bs=1M count=100
sudo losetup -f sdy
dd if=/dev/zero of=sdz bs=1M count=99  # Here's a smaller one!
sudo losetup -f sdz

ชุดนี้ขึ้นสามไฟล์เป็นอุปกรณ์สามย้อนกลับบล็อก: /dev/loop0, /dev/loop1และ/dev/loop2การทำแผนที่การsdx, sdyและsdzตามลำดับ ตรวจสอบขนาด:

sudo grep loop[012] /proc/partitions
   7        0     102400 loop0
   7        1     102400 loop1
   7        2     101376 loop2

ตามที่คาดไว้เรามีอุปกรณ์ลูปสองอุปกรณ์ที่มีขนาด 100M (102400 KiB = 100 MiB) และหนึ่งใน 99M (99 99 1024 1024 บล็อก K) อย่างแน่นอน

การสร้าง RAID Array จากอุปกรณ์ที่มีขนาดเหมือนกัน

ไปที่นี่:

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop1
mdadm: array /dev/md100 started.

ตรวจสอบขนาด:

sudo grep md100 /proc/partitions
   9      100     102272 md100

นี่คือprecicelyสิ่งที่เราคาดหวัง: หนึ่งดูที่คู่มือ mdadm เตือนเราว่ารุ่น 1.2 เมตาดาต้าที่ใช้เวลาถึง 128K: 128 + 102,272 = 102400. ตอนนี้เรามาทำลายมันในการเตรียมการสำหรับการทดสอบที่สอง

sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1

การสร้าง RAID Array จากอุปกรณ์ที่มีขนาดไม่เท่ากัน

คราวนี้เราจะใช้อุปกรณ์บล็อกเล็ก ๆ

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop2
mdadm: largest drive (/dev/loop0) exceeds size (101248K) by more than 1%
Continue creating array? y
mdadm: array /dev/md100 started.

เราได้รับคำเตือนแล้ว แต่มีการจัดเรียง ตรวจสอบขนาด:

sudo grep md100 /proc/partitions
   9      100     101248 md100

สิ่งที่เราได้มาที่นี่คือ 101,248 ช่วงตึก 101248 + 128 = 101376 = 99 × 1024 พื้นที่ใช้งานได้คืออุปกรณ์ขนาดเล็กที่สุด (รวมทั้งข้อมูลเมตาของ RAID 128K) ลองนำมาลงทั้งหมดอีกครั้งสำหรับการทดสอบครั้งล่าสุดของเรา:

sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2

และสุดท้าย: การเพิ่มอุปกรณ์ขนาดเล็กลงใน Running Array

อันดับแรกให้สร้างอาร์เรย์ RAID1 ที่มีเพียงหนึ่งในดิสก์ 100M อาร์เรย์จะลดลง แต่เราไม่สนใจจริงๆ เราแค่ต้องการอาเรย์เริ่มต้น missingคำหลักที่เป็นตัวยึดที่กล่าวว่า 'ผมไม่ได้มีอุปกรณ์สำหรับคุณยังเริ่มต้นอาร์เรย์ตอนนี้เขาและฉันจะเพิ่มหนึ่งในภายหลัง'

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 missing

ตรวจสอบขนาดอีกครั้ง:

sudo grep md100 /proc/partitions
   9      100     102272 md100

แน่นอนมันสั้น 128K ของ 102400 บล็อก การเพิ่มดิสก์ขนาดเล็ก:

sudo mdadm  --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array

บูม! มันจะไม่ยอมให้เราและความผิดพลาดนั้นชัดเจนมาก


Synology Hybrid RAID (SHR) แก้ปัญหานี้ได้
เดนิสเดนิซอฟ

1

มีหลายวิธีในการตั้งค่าmdXอุปกรณ์ วิธีนี้จะใช้gdisk(หรือsgdiskหากคุณต้องการรุ่นบรรทัดคำสั่งเท่านั้น) เพื่อแบ่งพาร์ติชันเป็น GPT หากคุณต้องการบูตจากอาร์เรย์สร้าง "BIOS Boot Partition" ef02รหัสประเภท สิ่งนี้จำเป็นเฉพาะถ้าคุณต้องการที่จะปิดอาร์เรย์นี้มิฉะนั้นไม่จำเป็นต้องสนใจ จากนั้นสร้างพาร์ติชันที่มีขนาดเดียวกันหรือเล็กกว่าดิสก์ที่เล็กที่สุดที่จะเพิ่มลงในอาร์เรย์ สุดท้าย แต่ไม่ท้ายสุดคัดลอกข้อมูล GPT ไปยังดิสก์อื่น (เมนูผู้เชี่ยวชาญในgdiskใช้xและจากนั้นuระบุอุปกรณ์เป้าหมาย) นี่เป็นกระบวนการทำลายล้าง

มันควรจะเป็นไปได้ - หากระบบไฟล์อนุญาต - ปรับขนาดพาร์ติชันที่มีอยู่ให้เล็กลงแล้วใช้วิธีการเดียวกันเพื่อคัดลอกข้อมูล GPT อย่างไรก็ตามสิ่งนี้ทำให้คุณกลายเป็น kerfuffle เพราะตอนนี้คุณมีดิสก์สองตัว แต่ยังไม่มีmdXอุปกรณ์ หนึ่งในนั้นจะต้องมีการจัดเตรียมให้เป็นmdXทั้งพาร์ทิชันที่ชาญฉลาด (ซึ่งฉันส่อให้เห็นข้างต้น) หรือดิสก์ที่ชาญฉลาด) จากนั้นข้อมูลจะต้องถูกย้ายจากดิสก์ที่มีอยู่ไปยังที่

ดังนั้น:

  1. ดิสก์ขนาดใหญ่ ( /dev/sda) มีข้อมูลข้อมูลมีขนาดเล็กกว่า 3001 GB พาร์ติชั่นไม่ใช่
  2. ดิสก์ขนาดเล็ก/dev/sdbถูกเพิ่มเข้ากับระบบ
  3. คุณแบ่งพาร์ติชัน/dev/sdbด้วยgdisk
  4. คุณสร้างอาร์เรย์จากแต่ละพาร์ติชัน ( mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2)
  5. คุณสร้างระบบไฟล์ในอาร์เรย์ใหม่
  6. คุณคัดลอกข้อมูลทั้งหมดไปตรวจสอบให้แน่ใจว่าระบบของคุณพร้อมที่จะเรียกใช้ดิสก์ GPT และทำให้ GRUB2 เข้าใจถึงผลกระทบ (ดูด้านล่าง)
  7. คุณคัดลอกข้อมูลการแบ่งพาร์ติชัน GPT จาก/dev/sdbไปเป็น/dev/sda
  8. คุณเพิ่มพาร์ติชัน "ดิบ" จาก/dev/sdaลงในอาร์เรย์ที่มีอยู่
  9. คุณรอที่/proc/mdstatจะแสดงให้คุณเห็นว่าการซิงค์เสร็จสิ้นแล้ว

หากคุณทำตามทุกขั้นตอนคุณควรจะสามารถบูตระบบใหม่จากอาร์เรย์ mdX ได้แล้ว อย่างไรก็ตามเก็บซีดีกู้คืนหรือตัวเลือกการบูต PXE สะดวกในกรณี


GRUB2 จะไม่สามารถจดจำการตั้งค่าได้ด้วยมือ ดังนั้นคุณต้องมี "เวทมนต์" นี่คือหนึ่งซับ:

for i in /dev/disk/by-id/md-uuid-*; do DEV=$(readlink $i); echo "(${DEV##*/}) $i"; done|sort|tee /boot/grub/devicemap

หรือให้รายละเอียดเพิ่มเติม:

for i in /dev/disk/by-id/md-uuid-*
do
  DEV=$(readlink $i)
  echo "(${DEV##*/}) $i"
done|sort|sudo tee /boot/grub/devicemap

สิ่งนี้จะสร้าง (หรือเขียนทับ) ค่าเริ่มต้น/boot/grub/devicemapด้วยอันที่บอก GRUB2 ว่าจะค้นหาดิสก์แต่ละแผ่นได้ที่ใด ผลลัพธ์ที่ได้จะเหมือนกับรายการนี้:

(md0) /dev/disk/by-id/md-uuid-...
(md2) /dev/disk/by-id/md-uuid-...
(md3) /dev/disk/by-id/md-uuid-...
(md4) /dev/disk/by-id/md-uuid-...

หากคุณใช้ GRUB ดั้งเดิมคุณต้องสร้าง "BIOS Boot Partition" ด้วย meta-data เวอร์ชั่น 0.9 การใช้mdadm -e 0 ...และกระบวนการจะแตกต่างกัน แต่ฉันก็ไม่ได้ทำแบบนั้น


1
ขอบคุณสำหรับการตอบกลับของคุณ. อาร์เรย์นี้มีไว้สำหรับการจัดเก็บข้อมูลดิบบนเซิร์ฟเวอร์ของฉันดังนั้นจึงไม่สามารถจัดการการบูทหรืออะไรทำนองนั้น ฉันแค่กังวลเกี่ยวกับการมิกซ์และจับคู่ฮาร์ดไดรฟ์ขนาดต่าง ๆ ในภายหลังในเกม ฉันหมายถึงอะไรจะเกิดขึ้นถ้าฉันมี sdb1 @ 3001 GB และ sdc1 @ 3001 GB แต่ sdc1 ตายและการเปลี่ยนเป็น 3000 GB? sdb1 ลดขนาดลงเป็น 3,000 หรือไม่ อาร์เรย์ @ / dev / md0 ลดขนาดลงเหลือ 3,000 GB หรือไม่ ยิ่งฉันคิดถึงมันมากเท่าไหร่ก็ยิ่งมีเหตุผลมากขึ้นที่จะออกจากห้องตอนท้ายเช่น 2999 ตัวอย่างด้านบน - ด้วยวิธีนี้มันควรจะปวดหัวแบบนั้น ถ้าฉันไม่ได้ทำอะไร
JaSauders

1
ที่จริงแล้วสมมติว่าระดับ RAID 1 ที่นี่mdadmจะปฏิเสธที่จะสร้างอาร์เรย์ในสถานที่แรกถ้ามันเข้ากันไม่ได้ ใน RAID 5 คุณจะต้องการดิสก์เพิ่มในที่สุดและใน RAID 0 คุณจะไม่สนใจมันซึ่งเป็นเหตุผลที่ฉันสันนิษฐานว่า RAID 1 ดังนั้นใช่มันสมเหตุสมผลแล้วที่จะออกจากห้อง
0xC0000022L

ฉันไม่ได้ตั้งใจจะเอาชนะม้า แต่ฉันไม่แน่ใจเกี่ยวกับคำสั่ง "ไม่เข้ากัน" ที่คุณทำ อะไรจะเข้ากันไม่ได้? คุณอ้างถึงความแตกต่างของขนาดในแง่ของ 3000 GB เทียบกับ 3001 GB ในตัวอย่างของฉันหรือไม่? ไม่ว่าจะด้วยวิธีใดฉันก็วิ่งอาเรย์ของฉันโดยแต่ละพาร์ติชันมี 2999 GB แม้ว่าแต่ละดิสก์จะมีขนาด 3001 GB นี่ควรลบอาการปวดหัวใด ๆ ที่เกิดขึ้นในกรณีที่ฉันไม่สามารถเปลี่ยนไดรฟ์เหมือนกันได้ ขอบคุณความเข้าใจของคุณ!
JaSauders

@JaSauders: ฉันคิดว่าหนึ่ง GiB มากกว่าหรือน้อยกว่าจะเข้ากันไม่ได้ แต่ค่อนข้างตรงไปตรงมาฉันไม่รู้ว่าขีด จำกัด อยู่ที่ไหน อย่างไรก็ตามฉันรู้ว่าขนาดที่แตกต่างกันเล็กน้อยนั้นจะยอมรับได้ สำหรับทุกสิ่งทุกอย่างคุณต้องโยกย้ายในลักษณะที่คล้ายกับที่ฉันระบุไว้
0xC0000022L

@ 0xC0000022L: mdadmยอมรับความแตกต่างของขนาด 1% ของสมาชิกอาเรย์
Alexios
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.