Re: mdadm - level change from raid 1 to raid 5

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 3 Oct 2011 12:52:37 +0200 Dominique <dcouot@xxxxxxxxxxx> wrote:

> Well,...
> I thought I was not that stupid.
> But it seems I need more explanation/help. I just tried to change the 
> chunk size, but I got the weirdest answer of all:"mdadm: component size 
> 18919352 is not a multiple of chunksize 32k".
> 18919352 is indeed not a multiple of 32 or any other multiple of 8 for 
> that matter (up to 1024, after that I gave up). So what did I do wrong 
> in my setup.

When you convert a RAID1 to a RAID5 the RAID5 needs to have a chunk size that
exactly divides the size of the RAID1 - as a RAID5 needs to be a whole number
of stripes, so each device must be a whole number of chunks.

md tries for a 64K chunk size, but repeatedly halves it until the chunk size
divides into the device size.  Thus you got 8K chunks - the largest power of
2 that divides 18919352.

If you want to use a larger chunk size you will need to make your array
slightly smaller first.
  mdadm /dev/md2 --size=18918912
will shrink it to a multiple of 512K.  If the filesystem is bigger than that
(likely) you will need to shrink it first
  resize2fs /dev/md2 18918912

should do it, if it is ext2,3,4.

Then you can change the chunk size to something bigger.

I probably need to document that better, and provide a way to give an initial
chunk size of the RAID5....

NeilBrown


> 
> To be clear is what I did this morning:
> 1. Setup a new VM with 5HDD (20G each) under Ubuntu 11.10 server
> 2. Setup a RAID1 with 2 HDD (3 spares) md0 2GB (swap), md1 100 MB 
> (boot), md2 the rest (root)
> 3. Convert md2 from RAID1 to Raid5
> mdadm --grow /dev/md2 --level=5
> 4. Copied the content of sda to sdc, sdd and sde by doing
> sfdisk -d /dev/sda | sfdisk /dev/sdc --force (and so on for sdd and sde)
> 5. Then added and extended the various arrays
> mdadm --add /dev/md0 /dev/sdc1 /dev/sdd1 /dev/sde1
> mdadm --add /dev/md1 /dev/sdc2 /dev/sdd2 /dev/sde2
> mdadm --add /dev/md2 /dev/sdc3 /dev/sdd3 /dev/sde3
> mdadm --grow /dev/md0 --raid-devices=5
> mdadm --grow /dev/md1 --raid-devices=5
> mdadm --grow /dev/md2 --raid-devices=5
> on that last one, I got "mdadm: Need to backup 32K of critical section.."
> but a cat /proc/mdstat showed all arrays being reshaped without problems.
> At the end, a simple reboot and all was in order.
> So any idea where I went wrong ?
> 
> Dom
> 
> 
> On 03/10/2011 12:07, NeilBrown wrote:
> 
> > On Mon, 3 Oct 2011 10:53:50 +0200 Dominique<dcouot@xxxxxxxxxxx>  wrote:
> >
> >> Hi Neil,
> >>
> >> Followed your advice an tried a few things... RAID5 with 2HDD, seems to
> >> work well. After growing all arrays, I've got my 3 arrays working (2
> >> RAID1 and 1 RAID5), and I can boot. But I have one last question since
> >> the raid.wiki.kernel.org server seems to be down.
> >> What about chunk size. I let it go with default values - 8k (for not
> >> setting it before the --grow command). What is the optimal size...Is
> >> there a nice math formula to define its optimal size ? And can it be
> >> changed once the array is build ?
> > The default for chunksize should be 512K I thought..
> > I once saw a mathematical formula, but it was a function of the number of
> > concurrent accesses and the average IO size - I think.
> >
> > Big is good for large streaming requests.  Smaller is good for lots of random
> > IO.  Only way to know for sure is to measure your workload on different sizes.
> >
> > You can change it once the array is build, but it is a very slow operation as
> > it has to move every block on every disk to somewhere else.
> >
> >   mdadm -G /dev/md2 --chunk=32
> >
> > NeilBrown
> >
> >
> >
> >> Thanks,
> >>
> >> Dom
> >>
> >> On 02/10/2011 22:50, NeilBrown wrote:
> >>> On Sun, 2 Oct 2011 16:24:48 +0200 Dominique<dcouot@xxxxxxxxxxx>   wrote:
> >>>
> >>>> Hi Neil,
> >>>>
> >>>> Thanks for the Info, I'll try a new series of VM tomorrow.
> >>>>
> >>>> I do have a question though. I thought that RAID5 required 3 HDD not 2.
> >>>> Hence I am a bit puzzled by your last comment....
> >>>> "Nope. This is because md won't change a 5-device RAID1 to RAID5. It
> >>>> will only change a 2-device RAID1 to RAID5. This is trivial to do
> >>>> because a 2-device RAID1 and a 2-device RAID5 have data in exactly the
> >>>> same places. " Or do I grow to a 3HDD RAID5 config with a 'missing' HDD.
> >>> It is a common misunderstanding that RAID5 requires 3 drives, not 2.
> >>> 2 is a perfectly good number of drives for RAID5.  On each stripe, on drive
> >>> holds the data, and the other drive holds the 'xor' of all the data blocks
> >>> with zero which results in exactly the data ( 0 xor D == D).
> >>> So a 2-drive RAID5 is nearly identical to a 2-drive RAID1, thus it is seen as
> >>> pointless and not considered to be a RAID5  (just as a triangle is not
> >>> considered to be a real quadrilateral, just because one of the 4 sides is of
> >>> length '0'!).
> >>> Some RAID5 implementations rule out 2-drive RAID5 for just this reason.
> >>> However 'md' is not so small-minded.
> >>> 2-drive RAID5s are great for testing ... I used to have graphs showing
> >>> throughput for 2,3,4,5,6,7,8 drives - the '2' made a nice addition.
> >>> And 2-drive RAID5s are very useful for converting RAID1 to RAID5.  First
> >>> convert a 2-drive RAID1 to a 2-drive RAID5, then change the number of drives
> >>> in the RAID5.
> >>>
> >>>
> >>> RAID6 should really work with only 3 drives, but md is not so enlightened.
> >>> When hpa wrote the code he set the lower limit to 4 drives.  I would like to
> >>> make it 3, but I would have to check that 3 really does work and I haven't
> >>> done that yet.
> >>>
> >>>
> >>>> I understand the 2HDD to 5HDD growth, but not how to make the other one.
> >>>> Since I cant test it right know, I'll both tomorrow.
> >>> You really don't need too think to much - just do it.
> >>> You have a 2 drive RAID1.  You want to make a 5 drive RAID5, simply add 3
> >>> drives with
> >>>      mdadm /dev/md2 --add /dev/first /dev/second /dev/third
> >>>
> >>> then ask mdadm to change it for you:
> >>>      mdadm --grow /dev/md2 --level=5 --raid-disks=5
> >>>
> >>> and mdadm will do the right thing.
> >>> (Not that I want to discourage you from thinking, but sometimes experimenting
> >>> is about trying this that you don't think should work..)
> >>>
> >>> NeilBrown
> >>>
> >>>> Dom
> >>>>
> >>>>
> >>>> On 01/10/2011 00:02, NeilBrown wrote:
> >>>>> On Fri, 30 Sep 2011 20:31:37 +0200 Dominique<dcouot@xxxxxxxxxxx>    wrote:
> >>>>>
> >>>>>> Hi,
> >>>>>>
> >>>>>> Using Ubuntu 11.10 server , I am testing RAID level changes through
> >>>>>> MDADM. The objective is to migrate RAID 1 (1+ HDD) environment to RAID 5
> >>>>>> (3+ HDD) without data loss.
> >>>>>> In order to make as simple as possible, I started in a VM environment
> >>>>>> (Virtual Box).
> >>>>> Very sensible!!
> >>>>>
> >>>>>
> >>>>>> Initial Setup:
> >>>>>> U11.10 + 2 HDD (20GB) in Raid 1 ->    no problem
> >>>>>> The setup is made with 3 RAID 1 partition on each disk (swap (2GB), boot
> >>>>>> (500MB), and root (17,5GB)). I understand that this will allow to
> >>>>>> eventually grow to a RAID 5 configuration (in Ubuntu) and maintain boot
> >>>>>> on a RAID construct (swap and boot would remain on RAID 1, while root
> >>>>>> would migrate to RAID 5).
> >>>>>>
> >>>>>> Increment number of disks:
> >>>>>> add 3 HDD to the setup ->    no problem
> >>>>>> increase the RAID 1 from 2 HDD to 5 HDD ->    no problem, all disks added
> >>>>>> and synchronized
> >>>>> This is the bit you don't want.  Skip that step and it should work.
> >>>>>
> >>>>>
> >>>>>> root@ubuntu:~# cat /proc/mdstat
> >>>>>> Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5]
> >>>>>> [raid4] [raid10]
> >>>>>> md2 : active raid1 sda3[0] sde3[4] sdb3[1] sdc3[2] sdd3[3]
> >>>>>>           18528184 blocks super 1.2 [5/5] [UUUUU]
> >>>>>>
> >>>>>> md1 : active raid1 sda2[0] sde2[4] sdb2[1] sdd2[3] sdc2[2]
> >>>>>>           488436 blocks super 1.2 [5/5] [UUUUU]
> >>>>>>
> >>>>>> md0 : active raid1 sdb1[1] sde1[4] sda1[0] sdc1[2] sdd1[3]
> >>>>>>           1950708 blocks super 1.2 [5/5] [UUUUU]
> >>>>>>
> >>>>>>
> >>>>>> Change Level:
> >>>>>> That's where the problem occurs:
> >>>>>> I initially tried 3 different approaches for md2 (the root partition)
> >>>>>>
> >>>>>>         1. Normal boot
> >>>>>>
> >>>>>>         mdadm /dev/md2 --grow --level=5
> >>>>>>
> >>>>>>         Not working: 'Could not set level to raid 5'. I suppose this is
> >>>>>> because the partition is in use. Makes sense.
> >>>>> Nope.  This is because md won't change a 5-device RAID1 to RAID5.  It will
> >>>>> only change a 2-device RAID1 to RAID5.  This is trivial to do because a
> >>>>> 2-device RAID1 and a 2-device RAID5 have data in exactly the same places.
> >>>>> Then you can change your 2-device RAID5 to a 5-device RAID5 - which takes a
> >>>>> while but this can all be done while the partition is in use.
> >>>>>
> >>>>> i.e. if you start with a RAID1 with 2 active devices and 3 spares and issue
> >>>>> the command
> >>>>>        mdadm /dev/md2 --grow --level=5 --raid-disks=5
> >>>>>
> >>>>> it will convert to RAID5 and then start reshaping out to include all 5 disks.
> >>>>>
> >>>>>
> >>>>> NeilBrown

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux