LinuxファイルサーバのRAID化



大きめのPCケースを使ってLinux+Sambaのファイルサーバを使っていたが、HDDの玉数が多くなってきて流石にHDD故障が怖くなってきたのと、玉の種類が揃ってきたのでRAID5使って冗長構成を取った障害に強いファイルサーバを作ってみることにした。

RAID化していない現状のファイルサーバ

現状のファイルサーバの構成は以下の通り。
OSはCentOS6.4だがOSの再インストールなどはせず、そのまま使うことにした。

CPU AMD AthlonII X2 250    3000MHz/2MB Cache/65W
MotherBord GIGABYTE GA-MA790FX-UD5 SocketAM3
Chipset AMD 790FX+SB750 -
Chipset0 CFD CSSD-SM64NI SATA 64GB
Chipset1 Seagate ST3000DM001-1CH166 SATA 3TB
Chipset2 Seagate ST3000DM001-1CH166 SATA 3TB
Chipset3 Seagate ST3000DM001-1CH166 SATA 3TB
Chipset4 Seagate ST3000DM001-9YN166 SATA 3TB
Chipset5 Hitachi HDS5C3030ALA630 SATA 3TB
Onboard1,0 - - -
Onboard1,1 - - -
Onboard2,0 - - -
Onboard2,1 - -  
PCIe1,0 Seagate ST3000DM001-9YN166 SATA 3TB
PCIe1,1 Seagate ST3000DM001-9YN166 SATA 3TB

それぞれのHDDを単独で/DATA1とか/DATA2とかで3TBまるっとマウントして使っている。

上記の他にもメインPCの中とデータ保存用にHDD保管庫にST3000DM001-1CH166が1台ずつ保有。

RAIDへの構想

RAID構想のきっかけは、メインPCで使っていた1.5TBのHDDから異音が発生し始めたので交換用とストック用に東芝のHDD(DT01ACA300)を3台買ったところから始まった。

ST3000DM001-1CH166が5台、ST3000DM001-9YN166が3台、DT01ACA300が3台と、同じ型のHDDが揃ったので、ST3000DM001-1CH166とDT01ACA300をファイルサーバ用に、ST3000DM001-9YN166をメインPC用にそれぞれRAID構成ができるなぁ、と気がついた。

流石にファイルサーバのHDD8台全部を使ってRAID5を構成する勇気はないので(2/8の故障でデータ喪失してしまう)、ST3000DM001-9YN166の5台で1 RAID Rankを構成して、DT01ACA300の4台(3台だと容量が足りないので1台更に買い足した)で1 RAID Rankを構成する2 RAID Rank構成を取ることにする。

コントローラの障害を考慮して以下の構成にした。

Chipset0 CFD CSSD-SM64NI SATA 64GB
Chipset1 Hitachi DT01ACA300 SATA 3TB
Chipset2 Seagate ST3000DM001-1CH166 SATA 3TB
Chipset3 Hitachi DT01ACA300 SATA 3TB
Chipset4 Seagate ST3000DM001-1CH166 SATA 3TB
Chipset5 - - -
Onboard1,0 Hitachi DT01ACA300 SATA 3TB
Onboard1,1 - - -
Onboard2,0 Seagate ST3000DM001-1CH166 SATA 3TB
Onboard2,1 - -  
PCIe1,0 Hitachi DT01ACA300 SATA 3TB
PCIe1,1 Seagate ST3000DM001-1CH166 SATA 3TB
PCIe2,0 - - -
PCIe2,1 Seagate ST3000DM001-1CH166 SATA 3TB

赤字にしたところが新たに購入した部分。

HDDの組付け

こんな感じでHDDを組み付けた。

ファイルサーバの中身

青色のケーブルがシステム用、赤色がDT01ACA300用、黄色がST3000DM001-1CH166用と、わかりやすいように色分けしている。
ケーブル自体にも認識順に数字を書いてわかりやすいようにした。

 入れ替えを待つHDD達

データ移行の関係上、まずはDT01ACA300だけ組み付けてRAID化したら、ST3000DM001-1CH166のデータを引っ越して、という風に玉突きでRAIDを組む。

mdadmでRAID化

組み付けたら起動してみる。
新しいDT01ACA300は順番に/dev/sdb, /dev/sdc, /dev/sdd, /dev/sdeという風に認識された。
これは想定通り。

/dev/sdbからRAID用のパーティションを切っていく。
3TBのHDDなのでパーティションテーブルはGPT。
途中「set 1 raid on」として、RAID用のパーティションとして設定している。

root@fileserver ~]# parted /dev/sdb
GNU Parted 2.1
/dev/sdb を使用
GNU Parted へようこそ! コマンド一覧を見るには ‘help’ と入力してください。
(parted) print
エラー: /dev/sdb: ディスクラベルが認識できません。
(parted) mklabel gpt
(parted) unit GB
(parted) print
モデル: ATA TOSHIBA DT01ACA3 (scsi)
ディスク /dev/sdb: 3001GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt

番号  開始  終了  サイズ  ファイルシステム  名前  フラグ

(parted) mkpart
パーティションの名前?  []?
ファイルシステムの種類?  [ext2]?
開始? 0
終了? 3001
(parted) print
モデル: ATA TOSHIBA DT01ACA3 (scsi)
ディスク /dev/sdb: 3001GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt

番号  開始    終了    サイズ  ファイルシステム  名前  フラグ
1    0.00GB  3001GB  3001GB

(parted) set 1 raid on
(parted) print
モデル: ATA TOSHIBA DT01ACA3 (scsi)
ディスク /dev/sdb: 3001GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt

番号  開始    終了    サイズ  ファイルシステム  名前  フラグ
1    0.00GB  3001GB  3001GB                          raid

(parted) quit
通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。

[root@fileserver ~]#

次はRAIDランクの作成。
ほかのサイトではここで/dev/sdbとか/dev/sdcとかのデバイスを指定してRAIDを作成するが、このデバイス名だと認識順によりズレが生じてしまい、今回の構成ではよろしくない。

つまり、現在/dev/sdcとして認識しているChipset3で認識しているDT01ACA300は、ST3000DM001-1CH166が組み込まれた時に順番的に/dev/sddとして認識されてしまう。
こうなるとRAIDの構成が壊れてしまうので、永続デバイス名をしようする。

永続デバイス名にはいくつか種類があり、/dev/disk下に定義されている。

  1. /dev/disk/by-id
    「モデル番号-シリアル番号」でのデバイス名
  2. /dev/disk/by-uuid
    UUIDでのデバイス名
  3. /dev/disk/by-path
    PCI上の位置でのデバイス名

これらはいずれもディスクの認識順には寄らず、一意にデバイスを指定できるので、/dev/sd*のが変わる可能性があるシステムではこの様な永続デバイス名を使うほうが良い。
ちなみに「ls -l」を打つとわかるが、永続デバイス名はただ単に/dev/sd*へのリンクとなる。

この永続デバイス名を使って以下のコマンドでRAIDで使用するディスクを指定することにする。

[root@fileserver by-id]# mdadm –create /dev/md0 –level=5 –raid-devices=4 \
/dev/disk/by-id/scsi-SATA_TOSHIBA_DT01ACA_24BT0JMGS-part1 \
/dev/disk/by-id/scsi-SATA_TOSHIBA_DT01ACA_44KY4TVKS-part1 \
/dev/disk/by-id/scsi-SATA_TOSHIBA_DT01ACA_24BT0HHGS-part1 \
/dev/disk/by-id/scsi-SATA_TOSHIBA_DT01ACA_24BT0A4GS-part1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@fileserver by-id]#

作成されたRAIDの状況を確認する。
「recovery = ??%」などと表示された場合はまだRAIDランクを構成中で、しばらく経つと以下の様な表示になり、RAIDが完成する。

今回の場合だと5時間ほど掛かった。

[root@fileserver ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md127 : active (auto-read-only) raid5 sdd1[2] sdb1[0] sdc1[1] sde1[4]
      8790400512 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]

unused devices: <none>
[root@fileserver ~]#

作成したRAIDランクの情報を/etc/mdadm.confに追記する。

[root@fileserver ~]# mdadm –detail –scan
ARRAY /dev/md/md0 metadata=1.2 name=fileserver:0 UUID=1f064fe1:347e9ac1:576cee8c:fd35403b
[root@fileserver ~]#
[root@fileserver ~]# mdadm –detail –scan >> /etc/mdadm.conf

出来上がったRAIDランクにファイルシステムを作成する。
今回は出来上がった3D+1Pの9TBのRAIDランクをまるっとそのまま1つのファイルシステムにする。

[root@fileserver ~]# mkfs -t ext4 /dev/md0
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=384 blocks
549404672 inodes, 2197600128 blocks
109880006 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
67066 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000, 550731776, 644972544, 1934917632

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@fileserver ~]#

出来上がったext4のファイルシステムのroot用領域を削除する。
9TBの5%となると460GBにもなってしまうので勿体無い。

[root@fileserver ~]# tune2fs -l /dev/md0 | grep Reserved
Reserved block count:     109880006
Reserved GDT blocks:      500
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
[root@fileserver ~]#
[root@fileserver ~]# tune2fs -m 0 /dev/md0
tune2fs 1.41.12 (17-May-2010)
Setting reserved blocks percentage to 0% (0 blocks)
[root@fileserver ~]#

これでroot用領域が開放された。

[root@fileserver ~]# tune2fs -l /dev/md0 | grep Reserved
Reserved block count:     0
Reserved GDT blocks:      500
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
[root@fileserver ~]#

/dev/md0に3台のST3000DM001のデータを移動させたら、今度はST3000DM001で/dev/md1を作る。

[root@fileserver by-id]# mdadm –create /dev/md1 –level=5 –raid-devices=3 \
> /dev/disk/by-id/scsi-SATA_ST3000DM001-1CH_W1F25TD2-part1 \
> /dev/disk/by-id/scsi-SATA_ST3000DM001-1CH_W1F43151-part1 \
> /dev/disk/by-id/scsi-SATA_ST3000DM001-1CH_Z1F3L0JN-part1
mdadm: /dev/disk/by-id/scsi-SATA_ST3000DM001-1CH_W1F25TD2-part1 appears to contain an ext2fs file system
    size=-1364702208K  mtime=Sat Jun 28 01:37:39 2014
mdadm: /dev/disk/by-id/scsi-SATA_ST3000DM001-1CH_W1F43151-part1 appears to contain an ext2fs file system
    size=-1364702208K  mtime=Fri Jun 27 19:36:43 2014
mdadm: /dev/disk/by-id/scsi-SATA_ST3000DM001-1CH_Z1F3L0JN-part1 appears to contain an ext2fs file system
    size=-1364702208K  mtime=Sat Jun 28 21:32:58 2014
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
[root@fileserver by-id]#

/dev/md1の作成に残り414分。

[root@fileserver by-id]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md1 : active raid5 sdh1[3] sdc1[1] sde1[0]
      5860267008 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
      [>………………..]  recovery =  0.1% (5446784/2930133504) finish=414.6min speed=117541K/sec
md0 : active raid5 sdd1[1] sdf1[2] sdb1[0] sdg1[4]
      8790400512 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
unused devices: <none>
[root@fileserver by-id]#

無事/dev/md1が作成された。

[root@fileserver by-id]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdh1[2] sdd1[1] sdf1[4] sdb1[0]
      8790400512 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]

md1 : active raid5 sdc1[1] sde1[0] sdg1[3]
      5860267008 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>
[root@fileserver by-id]#
[root@fileserver by-id]#
[root@fileserver by-id]# mdadm –misc –detail /dev/md1
/dev/md1:
        Version : 1.2
  Creation Time : Sun Jun 29 18:03:37 2014
     Raid Level : raid5
     Array Size : 5860267008 (5588.79 GiB 6000.91 GB)
  Used Dev Size : 2930133504 (2794.39 GiB 3000.46 GB)
   Raid Devices : 3
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Mon Jul  7 10:12:38 2014
          State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

           Name : fileserver:1  (local to host fileserver)
           UUID : 5d696281:87a6acaf:3d9069c7:ec6b245a
         Events : 96

    Number   Major   Minor   RaidDevice State
       0       8       65        0      active sync   /dev/sde1
       1       8       33        1      active sync   /dev/sdc1
       3       8       97        2      active sync   /dev/sdg1
[root@fileserver by-id]#

/dev/md1に残りのST3000DM001のデータを移動させたら、順次/dev/md1にST3000DM001を追加していく。

[root@fileserver by-id]# mdadm /dev/md1 –add /dev/disk/by-id/ata-ST3000DM001-1CH166_Z1F32QLN-part1
mdadm: added /dev/disk/by-id/ata-ST3000DM001-1CH166_Z1F32QLN-part1
[root@fileserver by-id]#

RAIDランクに新しいディスクを追加するとスペアディスクとして追加される。

[root@fileserver by-id]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdh1[2] sdd1[1] sdf1[4] sdb1[0]
      8790400512 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]

md1 : active raid5 sdi1[4](S) sdc1[1] sde1[0] sdg1[3]
      5860267008 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>
[root@fileserver by-id]#
[root@fileserver by-id]#
[root@fileserver by-id]# mdadm –misc –detail /dev/md1
/dev/md1:
        Version : 1.2
  Creation Time : Sun Jun 29 18:03:37 2014
     Raid Level : raid5
     Array Size : 5860267008 (5588.79 GiB 6000.91 GB)
  Used Dev Size : 2930133504 (2794.39 GiB 3000.46 GB)
   Raid Devices : 3
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Mon Jul  7 10:35:06 2014
          State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
  Spare Devices : 1

         Layout : left-symmetric
     Chunk Size : 512K

           Name : fileserver:1  (local to host fileserver)
           UUID : 5d696281:87a6acaf:3d9069c7:ec6b245a
         Events : 97

    Number   Major   Minor   RaidDevice State
       0       8       65        0      active sync   /dev/sde1
       1       8       33        1      active sync   /dev/sdc1
       3       8       97        2      active sync   /dev/sdg1

       4       8      129        -      spare   /dev/sdi1
[root@fileserver by-id]#

そこで以下のコマンドでデータディスクの数を変更して、スペアディスクとしているものをデータディスクとする。

[root@fileserver by-id]# mdadm -G /dev/md1 -n 4
mdadm: Need to backup 3072K of critical section..
[root@fileserver by-id]#

RAIDランクを作成するときに比べ、RAIDランクにディスクを追加すると時は非常に時間がかかるらしい。1743分ということは29時間。
気長に待つ。

[root@fileserver by-id]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdh1[2] sdd1[1] sdf1[4] sdb1[0]
      8790400512 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]

md1 : active raid5 sdi1[4] sdc1[1] sde1[0] sdg1[3]
      5860267008 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
      [>………………..]  reshape =  0.0% (534016/2930133504) finish=1743.8min speed=27998K/sec

unused devices: <none>
[root@fileserver by-id]#
[root@fileserver by-id]#
[root@fileserver by-id]# mdadm –misc –detail /dev/md1
/dev/md1:
        Version : 1.2
  Creation Time : Sun Jun 29 18:03:37 2014
     Raid Level : raid5
     Array Size : 5860267008 (5588.79 GiB 6000.91 GB)
  Used Dev Size : 2930133504 (2794.39 GiB 3000.46 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Mon Jul  7 10:37:25 2014
          State : clean, reshaping
Active Devices : 4
Working Devices : 4
Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

Reshape Status : 0% complete
  Delta Devices : 1, (3->4)

           Name : fileserver:1  (local to host fileserver)
           UUID : 5d696281:87a6acaf:3d9069c7:ec6b245a
         Events : 121

    Number   Major   Minor   RaidDevice State
       0       8       65        0      active sync   /dev/sde1
       1       8       33        1      active sync   /dev/sdc1
       3       8       97        2      active sync   /dev/sdg1
       4       8      129        3      active sync   /dev/sdi1
[root@fileserver by-id]#

あまりに時間がかかるので何とかならないものかと色々ググっていたら、/sys/block/md?/md/stripe_cache_sizeというのを弄るとRAIDのWrite性能が上がるというのがわかった。

デフォルトでは513という値になっている。

[root@fileserver md]# cat /sys/block/md1/md/stripe_cache_size
513
[root@fileserver md]#

参考にしたページでは、この値を増やせば増やすほど性能が上がるわけでもなく、8192ぐらいで頭打ちになるようなことが書いてあったので、素直に8192に設定する。
ただしメモリを食うようになるので、メモリ量が少ないシステムでは注意が必要になる。

リブートとか必要なく、すぐさま値が反映されるので以下のコマンドでstripe_cache_sizeを増やす。

[root@fileserver md]# echo 8192 > /sys/block/md1/md/stripe_cache_size

するとmd1のspeedの項目が27998K/sec –> 52091K/secに倍増。
すごい効果だった。

ただしリブートするとstripe_cache_sizeの値は元に戻ってしまうので、/etc/rc.localにこのコマンドを書いておいた。

[root@fileserver md]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdh1[2] sdd1[1] sdf1[4] sdb1[0]
      8790400512 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]

md1 : active raid5 sdi1[4] sdc1[1] sde1[0] sdg1[3]
      5860267008 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
      [=====>……………]  reshape = 27.2% (798536192/2930133504) finish=681.9min speed=52091K/sec

unused devices: <none>
[root@fileserver md]#

まとめ

長々と書いてみたが、以上でRAIDの作成とディスクの追加を行った。

感想としては

すっごく時間がかかる

というとこ。

都合1週間以上かかったかもしれないが、stripe_cache_sizeの値変更を最初からやっていたらもっと時間を短縮できたかもしれない。

それくらいstripe_cache_sizeの変更は強力



コメントを残す

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


7 − = 0

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