RAID1 の NFS サーバを作る

はじめに

クラウド障害、NTTデータ系「一部復旧困難に」 :日本経済新聞

クラウド障害、NTTデータ系「一部復旧困難に」
全国約50の自治体で起きたクラウド障害をめぐり、NTTデータ傘下の日本電子計算(東京・千代田)は16日、このうち33自治体でデータの一部が消え、復旧が困難になったと発表した。職員のメールや後期高齢者医療に関する情報などが含まれているという。同社は当初、早期に復旧できるとの見方を示したが、2週間近く障害が続いている。

データをこまめにバックアップすることは大切です.
その昔 RasPi を NFS サーバとして利用していたけれど,NICの性能不足により環境は解体していた.

heavymoon.hateblo.jp

heavymoon.hateblo.jp

クラウド上のデータでさえ消えてしまう昨今,突然データが消失するその日に備えてデータのバックアップ用にNFSサーバを構築することにした.

大まかな流れは以下の通り.

  1. RAID1 のディスクをつくる
  2. RAID ディスクをNFSとして設定する

記事によってファイルシステムの作成タイミングが3パターンくらいあるが,非常に丁寧に記載してある Arch のドキュメントを参考に RAID ディスクを作成していく.

wiki.archlinux.jp

サーバを立てる

適当なCentOSとディスクを用意した.

$ cat /etc/centos-release
CentOS Linux release 7.7.1908 (Core)
$ ls  /dev/sd[bc]
/dev/sdb  /dev/sdc

ちなみに,このサーバは ESXi 上の仮想マシンで,ディスクは RDM で接続している. 長くなりそうなので設定方法が知りたければググってください.気が向いたら書くかも書かないかも. この辺りを読んだ気がする.

kaede.jp

RAID1 のディスクを作る

パッケージインストール

今回は mdadm を使って RAID1 のディスクを作ります.

$ sudo yum install mdadm.x86_64

パーティションを作成する

$ sudo fdisk -l /dev/sd[bc]
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sdb: 3000.6 GB, 3000592982016 bytes, 5860533168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
Disk label type: gpt
Disk identifier: 1052EB3D-A91C-4F07-8C1F-5AFFD5BC345B


#         Start          End    Size  Type            Name
 1         2048   5860328334    2.7T  Linux RAID      
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sdc: 3000.6 GB, 3000592982016 bytes, 5860533168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
Disk label type: gpt
Disk identifier: 417E5B3C-AC7E-43A7-81AC-E764AF12DF53


#         Start          End    Size  Type            Name
 1         2048   5860328334    2.7T  Linux RAID  
$ fdisk -v
fdisk from util-linux 2.23.2

パーティションの作成結果は上記の通り. Arch のドキュメントに記載のある通り,ディスクによって容量に誤差がある場合があるらしいので 100MB 程度 未割り当てとして設定している. またパーティションのタイプを Linux RAID に設定している.

昔は fdisk で大きなパーティションは作れなかったが,最近は fdisk GPT support is currently new らしい.

RAID アレイを作成する

$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sd[bc]1
mdadm: /dev/sdb1 appears to be part of a raid array:
       level=raid1 devices=2 ctime=Sun Aug 11 09:29:28 2019
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
mdadm: /dev/sdc1 appears to be part of a raid array:
       level=raid1 devices=2 ctime=Sun Aug 11 09:29:28 2019
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

2つのディスク (-raid-devices=2 /dev/sd[bc]1) で RAID1(--level=1) のRAID アレイ (--create /dev/md0) を作成する.

容量が大きいと RAID アレイの作成にそれなりの時間を要する.
以下のコマンドで RAID アレイ作成状況を確認することが出来る.

3TB...ながい...

$ watch -n1 cat /proc/mdstat 
Personalities : [raid1] 
md0 : active raid1 sdc1[1] sdb1[0]
      2930133440 blocks super 1.2 [2/2] [UU]
      [>....................]  resync =  0.1% (4960000/2930133440) finish=363.4min speed=134140K/sec
      bitmap: 22/22 pages [88KB], 65536KB chunk

unused devices: <none>

ファイルシステムを作成する

$ sudo mkfs.xfs -f /dev/md0
meta-data=/dev/md0               isize=512    agcount=4, agsize=183133340 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=732533360, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=357682, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

今回は CentOS7 標準のファイルシステムにあわせて xfs でフォーマットしている.

設定ファイルを作成する

man を読むと設定ファイルは ”Default is to use /etc/mdadm.conf and /etc/mdadm.conf.d, or if those are missing then /etc/mdadm/mdadm.conf and /etc/mdadm/mdadm.conf.d.” とのことなので,今回は以下の通り設定ファイルを作成した.

$ sudo mkdir /etc/mdadm/
$ sudo mdadm -Es | sudo tee /etc/mdadm/mdadm.conf
ARRAY /dev/md/0  metadata=1.2 UUID=096fcdad:027d4958:9d2be2be:6ef9df30 name=storage:0

RAID アレイをマウントする

$ df -hT /mnt/raid1/
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/md0       xfs      2.8T   33M  2.8T    1% /mnt/raid1

適当なディレクトリを作成してマウントしてみた.

RAID アレイの状態確認方法

確認方法は RAID アレイ作成過程を確認したファイルを見ればいい.
正常な状態は以下の通り.

$ cat /proc/mdstat
Personalities : [raid1] 
md0 : active raid1 sdc1[1] sdb1[0]
      2930133440 blocks super 1.2 [2/2] [UU]
      bitmap: 0/22 pages [0KB], 65536KB chunk

unused devices: <none>

試しに sdc1 に異常が発生したことにしてみると,sdc1 の状態が (F) として表示されるようになる.

$ sudo mdadm --fail /dev/md0 /dev/sdc1 
mdadm: set /dev/sdc1 faulty in /dev/md0
$ cat /proc/mdstat
Personalities : [raid1] 
md0 : active raid1 sdc1[1](F) sdb1[0]
      2930133440 blocks super 1.2 [2/1] [U_]
      bitmap: 0/22 pages [0KB], 65536KB chunk

unused devices: <none>

NFS サーバを設定する

パッケージをインストールする

$ sudo yum install nfs-utils.x86_64

ファイアウォールとサービスを設定する

$ sudo firewall-cmd --add-service=nfs --permanent 
success
$ sudo firewall-cmd --reload 
success
$ sudo systemctl enable nfs.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
$ sudo systemctl start nfs.service 

NFS の公開ディレクトリを設定する

NFS で公開するディレクトリの設定は /etc/exports のファイルに記載する.
詳細は exports の man を見てください.

$ cat /etc/exports
/mnt/raid1 *(rw,sync,no_root_squash)
$ sudo exportfs -ra

あとはこのサーバのNFSディレクトリを別PCからマウントすればOK.

おわりに

今回の作業でバックアップ先ができた. あとでバックアップ処理も作る.

ESXi に設定している RDMホットスワップは未検証なので,何かあったときはちょっと心配. 今のうちに検証しておくべきか...