2013年1月2日水曜日

RAID と LVM と 4K セクタ

フォロワーさん(いつもありがとうございます!)から教えていただいた情報。
LVM on RAID するときの注意点
そういえば(爆)使ってるディスクたちは Western Digital のいわゆる Advanced Format、つまり4096バイトセクタを採用しているディスクたちでした。もともと512バイトが一般的だったので、それを前提としたフォーマットを特に考えないで使ってしまうとパフォーマンスが劣化すると言うやつですね。まあぶっちゃけるとサイズにばかり目が行ってて忘れてました。 orz

で、ようやく全ステップが完了したのでのんびり(おい)対応していこうかなぁと。また無駄なデータの移動とかしちゃうけどね~。楽しいからいいもんね~。などと自分をごまかしつつ。

ディスク全体をRAID1にしてる場合

まずは上記のリンクにあるように、ディスク全体を RAID 1 にしてる人。そんなことしてるわけが・・・ありました。うーむ。まずは RAID の superblock のバージョンですが、
# mdadm --detail /dev/md4
/dev/md4:
        Version : 1.2
おうふ・・・。お勧めの1.0なんかにはもちろんしていない。上のリンクでは、1.0だとmetadata の位置が領域の最後方となるため、データ領域がディスクの先頭=4096バイトセクタの先頭ということですよね。えー、でも1.0より新しい気がするのに問題あるとか納得いかない感じなのですが・・・。1.2とはどういうものかというとこれによれば、superblock の場所が
4K from the beginning of the device
とあります。1.0だとたしかに at the end of device とあるのでデータ領域は先頭のようです。しかしどう読んでも superblock の長さもわからないのでデータ領域がいくつから始まってるのか不明。いろいろ調べたら mdadm で調べられると。コマンド発行対象のデバイスはディスク自体であることに注意です。
# mdadm -E /dev/sdc
/dev/sdc:
        Version : 1.2
(snip)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
たしかに superblock は 8 sectors = 512x8 bytes = 4096 ですね。でも Data Offset はちゃんと 2048 sectors = 512x2048 bytes で 4K セクタに合っているではないですか!GJ!(であってますかね?w)

なので RAID のほうはこのままで OK と。次はPV(物理ボリューム)のほうです。 これもデータ領域がどこから始まってるかが問題。
# pvdisplay --verbose /dev/md4
    Using physical volume(s) on command line
  --- Physical volume ---
  PV Name               /dev/md4
  VG Name               vg_data
  PV Size               2.27 TiB / not usable 1.64 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
(snip)
うーむ。これもまたデータ領域がどこから始まってるのかわからない。man pvcreate 等を見ていたら、pvs でどこから始まってるのかがわかるそうな。
# pvs -o +pe_start
  PV         VG      Fmt  Attr PSize   PFree   1st PE 
  /dev/md4   vg_data lvm2 a--    2.27t      0    1.00m
おお!?これって最初のPEが1Mから始まってるってことですよね?ということはこれも4KにアラインしてるということでOK!(でいいんですかね?w)そして PE の単位は上で調べたとおり4Mなので当然4Kにアラインします。というわけで、結論。
 ディスク全体を RAID 1 にしたものについてはこのまま運用!w
 あってるかどうか実験しようもないのであくまでも推察ですが・・・。結局のところ勝手によきにはからってくれるようないい時代になったってことですかね。

パーティションを切ってRAID1してる人たち(>2TB)

次はパーティションを切ってる場合の調査です。これはさんざいわれてましたね。fdiskを使うときに。
# fdisk /dev/sde

WARNING: GPT (GUID Partition Table) detected on '/dev/sde'! The util fdisk doesn't support GPT. Use GNU Parted.


WARNING: The size of this disk is 3.0 TB (3000592982016 bytes).
DOS partition table format can not be used on drives for volumes
larger than (2199023255040 bytes) for 512-byte sectors. Use parted(1) and GUID 
partition table format (GPT).


The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): q

・・・って新しく買ったディスク、3TBなので fdisk を使おうとすると警告が出ます。というか警告多すぎw そのまま使うと正しく認識されなかったりさんざんな目にあうとか。実際 2.5TB のディスクを Windows につけたら謎のパーティション構成になってました。そちらは dos 形式の MBR を gpt に変更したら直りましたけど。

で、今回はいよいよ上の警告でお勧めされている parted を使いました。なんか使ったことないので怖いぞw parted で mkpart を実行すると、もう画面はどっかいっちゃったので見せられませんが、「このままだとパフォーマンス悪いよー」的な警告が。その対策としては「ユニットをMiBにすればいいよ」と。なので u MiB をしてからパーティションを作成すると何も言われずに作成されます。果たしてこのパーティションは 4K バイトに沿っているのでしょうか?
(parted) u s                                                              
(parted) print                                                            
Model: ATA WDC WD30EZRX-00D (scsi)
Disk /dev/sde: 5860533168s
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start        End          Size         File system  Name  Flags
 1      2048s        3907028991s  3907026944s                     raid
 2      3907028992s  5860532223s  1953503232s
ユニットをs(セクタ)にして print してみたところ、ちゃんと開始が 2048s になってました。ということでこれもOKだし、RAID の superblock も
# mdadm -E /dev/sde1
/dev/sde1:
(snip)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
なのでこれも問題なし!(ですよね?ww)というわけで、結論。
 3TB で RAID 1 にしたものについてもこのまま運用!ww

 パーティションを切ってRAID1にしてる人たち(ブート)

さて最後に残った一番怪しそうなところです。今回 CentOS を新たにインストールしたとき、インストーラの時点で RAID のパーティションを作成してインストールしました。ここが一番うまくいってなさそうな気配です。ここを上と同様にチェックしてみます。
(parted) u s                                                              
(parted) print                                                            
Model: ATA WDC WD20EARS-00M (scsi)
Disk /dev/sda: 3907029168s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start       End          Size         Type     File system  Flags
 1      2048s       1050623s     1048576s     primary  ext4         boot, raid
 2      1050624s    17827839s    16777216s    primary               raid
 3      17827840s   554698751s   536870912s   primary               raid
 4      554698752s  3907024064s  3352325313s  primary               raid
まずいきなり見えた1から2048セクタなのでいい感じ?ほかもすべて 2048 (64) の倍数から開始しているのでこれもよさそうな感じではないですか!(本当にいいんですよね?www) RAID の superblock も同じように 2048 sector から開始しているようです。なんだすばらしいじゃないですか。ちなみに partition 3 は / 用に切ったパーティションなんですが、この人はなぜか metadata 1.1 になってます。インストーラから作る /boot でないやつは 1.1 になるんですかね。

というわけで、結論。
 インストール時に作ったものについてもこのまま運用!www
 というわけで、今現在ささっているすべてのディスクについてこのまま運用するという結論が出ました。めでたしめでたし。

(間違ってるところあったらぜひ指摘していただけるとうれしいです。)

2 件のコメント:

  1. どのパーティションスタート位置も全て8で割り切れる数になっていますね!というのもCentOS6.Xのfdiskから4k対応しているそうなんです。(気がつくのが遅くてすみません!)
    また、CentOS5ではgptにブートパーティションは設定できなかったそうなんですが、CentOS6ではそれも解消されているようです。
    ※ご存知でしたらすみません!

    RHELホワイトペーパー(11-12pにGPT対応について書かれています)
    http://red.ht/UHw7SB

    AFT及び3TB HDDへのOSインストール
    http://bit.ly/Wm5aRZ

    返信削除
  2. いつもどうもですw

    へぇ、(今さら感もある)fdiskも対応してるんですね。私はpartedのほうを使ったので気付きませんでした。ほとんどのは対応と言ってもちょっと無駄になってもいいから8の倍数にしちゃえって感じではありますがw

    ブートパーティションもgptにできるんですね。うちのは上にあるようにブートのディスクはgptにしてないんです。

    総じてやり直さなくてよくてよかったです。ありがとうございますw

    返信削除