mdadmによるRAID5の領域の拡大・縮小

さて、問題のRAID5。
その問題以前にだいぶ苦労してるわけだが。
まあいきましょか。

構成ディスク
sd[ab]3, sd[def]1
の5本なわけだけども、sd[ab]3は運良く4KB境界だったのでパーティション切り直さなくておk、sd[de]1は4KBセクタのドライブではないのでおk。
だが、これからやってくるsdf、おまえが問題だ。
こいつが4KBセクタを持ってやってくる。
ディスクのサイズが全く同一だった場合、sdfを64セクタ目からパーティションを切った場合、63セクタ目から第一パーティション切ってるsd[de]に対してsdfは1セクタ領域が少なくなってしまう。
これってRAID5くめるの?
とりあえず現時点はsdfがぶっ飛ぶ前の時点でくんでて、sdfがfaultついて縮退モードでうごいてるわけだけども、そのときは4KBのことなんて忘れてたから先頭セクタが63になってたはず。
で、たぶんアレイサイズは最大で作ってると思うから、一応縮小した方が良いと思うんだよねっていう今ここ。

で、しらべてみたらアレイサイズの縮小はできるみたい。
ここ参照。
mdadm –grow –sizeを使うらしい。
つーかgrow使えば色々変更できるのね。
ちょー便利そう。
チャンクサイズの変更とかもできるっぽいじゃん。
もちろんRAID ARRAYにディスクを新規追加とかも。
でまあ、アレイサイズを縮小する時にはファイルシステムきにしないから注意しろと。
要するに先にresize2fsしておけということ。
これはいつものパターン。

んー、とりあえず、resize2fsすりゃええんかいの。
先頭セクタが2048になると仮定して、まあ4M短くすれば良い予定か。
Array Size : 5860536320 (5589.04 GiB 6001.19 GB)
らしいんで5589Gにでもしましょう。

# e2fsck -f /dev/md3
 # resize2fs -p /dev/md3 5589G

さて、リサイズできた。
そして本命のRAID5 ARRAYの縮小。

# mdadm --grow /dev/md3 --size=5589G
mdadm: Cannot set device size for /dev/md3: No space left on device

できない。
デバイスに領域が残っていないとな?
これ、領域が足りないってことだよね?
はて、とおもってしらべてみる。

こんなの見つけた。

Re: Is shrinking raid5 possible?

On Monday June 19, Paul.Davidson [at] anu.edu.au wrote:
> Hi,
>
> I’d like to shrink the size of a RAID5 array – is this
> possible? My first attempt shrinking 1.4Tb to 600Gb,
>
> mdadm –grow /dev/md5 –size=629145600
>
> gives
>
> mdadm: Cannot set device size/shape for /dev/md5: No space left on deviceYep.
The ‘–size’ option refers to:
Amount (in Kibibytes) of space to use from each drive in
RAID1/4/5/6. This must be a multiple of the chunk size, and
must leave about 128Kb of space at the end of the drive for the
RAID superblock.
(from the man page).So you were telling md to use the first 600GB of each device in the
array, and it told you there wasn’t that much room.
If your array has N drives, you need to divide the target array size
by N-1 to find the target device size.
So if you have a 5 drive array, then you want
–size=157286400

NeilBrown

To unsubscribe from this list: send the line “unsubscribe linux-raid” in
the body of a message to majordomo [at] vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

要するに、–sizeで指定するサイズは、アレイのサイズじゃなくて各ドライブで利用する領域のサイズなんだってさ。
確かにさっきのマニュアルにも

z, –size=
Amount (in Kibibytes) of space to use from each drive in RAID levels 1/4/5/6.

って書いてある。
てっきりアレイのサイズだと思いこんでた。
つまり、N本のディスクで構成されているRAID5のドライブなら、N-1で割って計算してやらないといけない。
で、えーと、一本あたりで使いたい領域はどうなるんだ?
とりあえずsdeのパーティションを確認する。

   Device Boot      Start         End      Blocks   Id  System
/dev/sde1              63  2930272064  1465136001   fd  Linux raid autodetect

2930272064 – 2048 = 2930270016セクタにしたい。
2930270016セクタ = 1465135008KiB = 1430795.90625MiB = 1397.261627197265625GiB
で、チャンクサイズは1024KiBで設定しているので、実際のところはアレイで利用される領域は1430795MiBであり1465134080KiB。

それに対して現在のアレイサイズは5589.04GiBだから一台あたりのディスクの領域は4で割って1397.26GiB。
おや。
現在のアレイサイズは正確には5860536320KiBで、ディスク一本あたりは4でわると1465134080KiBで1430795MiB。

1430795MiB。

1465134080KiB。

等しい。

結論。

縮める必用がなかった。

。。。が、せっかくなので実験するだけしてみよか。
チャンクサイズが1024なのでMiBで切るのがちょうどいいので、ディスク一本あたり1430001MiBにしてみよう。
そうするとメタデータ格納領域を大目に見て1MiBだとして、ファイルシステムの方は1430000*4MiB=5720000MiB=5585.9375GiBと。
ぎりぎりは怖いので再度5585Gにファイルシステムを縮小して、それからアレイの縮小に挑戦してみることにする。

# e2fsck -f /dev/md3
# resize2fs -p /dev/md3 5585G

ここまではよし。

# mdadm --grow /dev/md3 --size=1430001M

としようとおもったけど、このMが1024KiBなのか1000KiBなのかマニュアルからだとよくわからなかったので、びびりなのでKiBで指定することにする。

# mdadm --grow /dev/md3 --size=1464321024
mdadm: component size of /dev/md3 has been set to 1464321024K

一瞬で終わった。
確認する。

# mdadm -D /dev/md3
/dev/md3:
        Version : 1.2
  Creation Time : Sat Oct 22 15:06:18 2011
     Raid Level : raid5
     Array Size : 5857284096 (5585.94 GiB 5997.86 GB)
  Used Dev Size : 1464321024 (1396.49 GiB 1499.46 GB)
   Raid Devices : 5
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Thu Nov  3 13:00:54 2011
          State : clean, degraded
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 1024K

           Name : MS-09:2  (local to host MS-09)
           UUID : 84486b36:9e134ea4:f3ef3c89:2b147200
         Events : 278613

    Number   Major   Minor   RaidDevice State
       0       8        3        0      active sync   /dev/sda3
       1       8       19        1      active sync   /dev/sdb3
       2       8       49        2      active sync   /dev/sdd1
       3       0        0        3      removed
       4       8       65        4      active sync   /dev/sde1

アレイのサイズは1430001MiBの4倍ジャストの5857284096KiBになってる。
あっさり成功。
あら、わかれば簡単じゃない。

って今更気づいたけどmdadmの詳細表示で Used Dev Size って書いてるね。
これがデバイス一つあたりのサイズか。
いちいち計算しなくても良かったんですね。。。

で、growを使えばディスクの本数を増やすのはできるらしい。

# mdadm /dev/md3 --add /dev/sdc2

とかやってホットスペア追加して

# mdadm --grow /dev/md3 -n6

とかやってやればいいらしい。
なので領域拡張は普通にいけるみたい。

で、減らすのは?って話なんだけども。
んー。
試したくないな。
うまくいってもくそ時間がかかるのが目に見えてるから、お試しでやるにはちょっと。
やるならまずresize2fsでディスク一本分の領域を節約してやらないといけない。
で、こっからの流れは完全に勘で、試してないからあってるかわからないけど、ファイルシステムの縮小が終わったら、mdadm –grow /dev/md3 -n4とかたたけばもしかしたらうまくいくかもしれない。
でも、うまくいったとしたら、内部でデータの置き換えが大発生することは間違いない。
degradedからrebuildするのより全然多くのデータの置き換えが発生するはずなので、時間はくそかかる気がする。
なのでちょっと実験してみる気にはなれないなあ。

。。。ぴこーん。

LVMで論理ボリューム4個作って試してみるわ。

# lvcreate -n r51 -L 1G ms09
  Logical volume "r51" created
# lvcreate -n r52 -L 1G ms09
  Logical volume "r52" created
# lvcreate -n r53 -L 1G ms09
  Logical volume "r53" created
# lvcreate -n r54 -L 1G ms09
  Logical volume "r54" created
# mdadm --create /dev/md9 -l5 -n4 /dev/ms09/r5[1234]
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md9 started.

ハイ作った。

# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md9 : active (auto-read-only) raid5 dm-15[4](S) dm-14[2] dm-13[1] dm-12[0]
      3144192 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UUU_]

あれ?なんか一個うごいてない。

# mdadm -D /dev/md9
/dev/md9:
        Version : 1.2
  Creation Time : Thu Nov  3 13:32:30 2011
     Raid Level : raid5
     Array Size : 3144192 (3.00 GiB 3.22 GB)
  Used Dev Size : 1048064 (1023.67 MiB 1073.22 MB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Thu Nov  3 13:32:30 2011
          State : clean, degraded
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-symmetric
     Chunk Size : 512K

           Name : MS-09:9  (local to host MS-09)
           UUID : 2e821ece:bc68630b:649eb6af:7e98d4fc
         Events : 0

    Number   Major   Minor   RaidDevice State
       0     254       12        0      active sync   /dev/dm-12
       1     254       13        1      active sync   /dev/dm-13
       2     254       14        2      active sync   /dev/dm-14
       3       0        0        3      removed

       4     254       15        -      spare   /dev/dm-15

なぜスペアになっている。
まあとりあえず稼働させればリビルド始めるだろうってことでとりあえずファイルシステムを適当に作る。
リビルド始めた。

# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md9 : active raid5 dm-15[4] dm-14[2] dm-13[1] dm-12[0]
      3144192 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UUU_]
      [==============>......]  recovery = 74.5% (781732/1048064) finish=0.2min speed=16189K/sec

リビルドも完了したので、ディスクの本数を減らしてみよう。
。。。どのディスクを引っこ抜くことになるんだ?
まあとりあえずたたいてみるか。

# mdadm --grow /dev/md9 -n3
mdadm: this change will reduce the size of the array.
       use --grow --array-size first to truncate array.
       e.g. mdadm --grow /dev/md9 --array-size 2096128

なるほどなるほど。
現在のアレイのサイズが3144192で一つあたりのディスクのサイズが1048064なんでアレイサイズ指定してね、ってことだそうで。

# mdadm --grow /dev/md9 --array-size 2096128
# mdadm --grow /dev/md9 -n3
mdadm: Need to backup 3072K of critical section..
mdadm: /dev/md9: Cannot grow - need backup-file

んーと。

–backup-file=
This is needed when –grow is used to increase the number of raid-devices in a RAID5 or RAID6 if there are no spare devices available, or to shrink, change RAID level or layout. See the GROW MODE section below on RAID-DEVICES CHANGES. The file must be stored on a separate device, not on the RAID array being reshaped.

つまり、変更を加えるRAIDデバイス以外にバックアップファイルを指定しろといっている。
RAID-DEVICES CHANGESもみてみる。

When decreasing the number of devices, the size of the array will also decrease. If there was data in the array, it could get destroyed and this is not reversible, so you should firstly shrink the filesystem on the array to fit within the new size. To help prevent accidents, mdadm requires that the size of the array be decreased first with mdadm –grow –array-size. This is a reversible change which simply makes the end of the array inaccessible. The integrity of any data can then be checked before the non-reversible reduction in the number of devices is request.

When relocating the first few stripes on a RAID5 or RAID6, it is not possible to keep the data on disk completely consistent and crash-proof. To provide the required safety, mdadm disables writes to the array while this “critical section” is reshaped, and takes a backup of the data that is in that section. For grows, this backup may be stored in any spare devices that the array has, however it can also be stored in a separate file specified with the –backup-file option, and is required to be specified for shrinks, RAID level changes and layout changes. If this option is used, and the system does crash during the critical period, the same file must be passed to –assemble to restore the backup and reassemble the array. When shrinking rather than growing the array, the reshape is done from the end towards the beginning, so the “critical section” is at the end of the reshape

まずファイルシステムを縮めましょう。
次にアレイサイズを縮めましょう。
バックアップファイルオプションを指定しましょう。
システムが処理中にクラッシュしたりしたら–assembleでそのバックアップからレストアしましょう。

ってかんじらしい。

# mdadm --grow /dev/md9 -n3 --backup-file /root/mdadmtest
mdadm: Need to backup 3072K of critical section..
# mdadm -D /dev/md9
/dev/md9:
        Version : 1.2
  Creation Time : Thu Nov  3 13:32:30 2011
     Raid Level : raid5
     Array Size : 2096128 (2047.34 MiB 2146.44 MB)
  Used Dev Size : 1048064 (1023.67 MiB 1073.22 MB)
   Raid Devices : 3
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Thu Nov  3 14:00:22 2011
          State : clean, recovering
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

 Reshape Status : 12% complete
  Delta Devices : -1, (3->2)

           Name : MS-09:9  (local to host MS-09)
           UUID : 2e821ece:bc68630b:649eb6af:7e98d4fc
         Events : 27

    Number   Major   Minor   RaidDevice State
       0     254       12        0      active sync   /dev/dm-12
       1     254       13        1      active sync   /dev/dm-13
       2     254       14        2      active sync   /dev/dm-14

       4     254       15        3      active sync   /dev/dm-15
# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md9 : active raid5 dm-15[4] dm-14[2] dm-13[1] dm-12[0]
      2096128 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      [=======>.............]  reshape = 38.6% (405504/1048064) finish=0.9min speed=11248K/sec

再構築が始まった。

終わった。

# mdadm -D /dev/md9
/dev/md9:
        Version : 1.2
  Creation Time : Thu Nov  3 13:32:30 2011
     Raid Level : raid5
     Array Size : 2096128 (2047.34 MiB 2146.44 MB)
  Used Dev Size : 1048064 (1023.67 MiB 1073.22 MB)
   Raid Devices : 3
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Thu Nov  3 14:01:51 2011
          State : clean
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-symmetric
     Chunk Size : 512K

           Name : MS-09:9  (local to host MS-09)
           UUID : 2e821ece:bc68630b:649eb6af:7e98d4fc
         Events : 52

    Number   Major   Minor   RaidDevice State
       0     254       12        0      active sync   /dev/dm-12
       1     254       13        1      active sync   /dev/dm-13
       2     254       14        2      active sync   /dev/dm-14

       4     254       15        -      spare   /dev/dm-15

できました。

えーと整理すると。

  1. resize2fsなんかでファイルシステムを縮小
  2. mdadm –grow –array-sizeでアレイサイズを縮小
  3. mdadm –grow -n –backup-fileでアレイを構築するディスクの本数を減少
  4. アレイの再構築をまつ
  5. 完了

っていう流れですね。

これ、抜きたいディスクを選ぶにはどうしたらいいんだろう。

拡張して試してみる。

# mdadm --grow /dev/md9 -n4
mdadm: Need to backup 3072K of critical section..

ディスクの追加は–backup-fileなしでいけるみたい。
アレイサイズはそのままじゃ拡張されないみたいなので、再構築が終わったら

# mdadm --grow --array-size max

とでもたたくとよろしかろう。
今回はまた引っこ抜くのでしない。

0番のディスクを引っこ抜く方向にしてみる。

# mdadm /dev/md9 --fail /dev/ms09/r51
mdadm: set /dev/ms09/r51 faulty in /dev/md9
# mdadm /dev/md9 --remove /dev/ms09/r51
mdadm: hot removed /dev/ms09/r51 from /dev/md9

で、本来ならここにファイルシステムの縮小とアレイの縮小が入って

# mdadm --grow /dev/md9 -n3 --backup-file /root/mdadmtest

再構築が始まった。
完了。

# mdadm -D /dev/md9
/dev/md9:
        Version : 1.2
  Creation Time : Thu Nov  3 13:32:30 2011
     Raid Level : raid5
     Array Size : 2096128 (2047.34 MiB 2146.44 MB)
  Used Dev Size : 1048064 (1023.67 MiB 1073.22 MB)
   Raid Devices : 3
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Thu Nov  3 14:19:50 2011
          State : clean
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

           Name : MS-09:9  (local to host MS-09)
           UUID : 2e821ece:bc68630b:649eb6af:7e98d4fc
         Events : 139

    Number   Major   Minor   RaidDevice State
       4     254       15        0      active sync   /dev/dm-15
       1     254       13        1      active sync   /dev/dm-13
       2     254       14        2      active sync   /dev/dm-14

すげー。
いけるもんだ。
mdadm柔軟なのね。
ディスクの追加も削除もディスク一本あたりの使用領域の縮小も拡大もこれでいけそう。

さて、テスト用のRAIDアレイ消して論理ボリューム消すか。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>