gluster メモ

分散ファイルシステムgluster (glusterfs) のテストをしてみた。

RAIDで信頼性を高めてもRAIDのマシン自体が止まってしまったらサービスが止まってしまう。 また、ホットスワップ用のケースを導入などしないと可用性が確保できないことが多い。 分散ファイルシステムならば、(設定によるが)マシンが1台止まっても、ファイルサーバを動作させたまま 別のマシンをネットワークに接続して復旧することができる。 一定期間動作させたらHDDを交換するとか、SMART情報を見てHDDを交換するとかも容易にできる。 PCが複数台必要になるが、Raspberry Piなどを使って構築するなども可能だろう。

環境の構築 (VMWare + CentOS)

VMWare のダウンロードとCentOSのインストール

CentOSの設定

アップデートとglusterのインストール

yum -y update
yum -y install open-vm-tools glusterfs glusterfs-cli glusterfs-server centos-release-gluster \
glusterfs-geo-replication glusterfs-rdma

これを3台分用意する(VMWareを3つ同時に起動する)。

VMWareのnat接続で固定IPに設定したい。

C:\ProgramData\VMware\vmnetnat.confにには以下の記述があり、

# NAT gateway address
ip = 192.168.96.2/24
hostMAC = 00:50:56:C0:00:08

C:\ProgramData\VMware\vmnetdhcp.confによるとDHCPは 以下の設定。

# Virtual ethernet segment 8
# Added at 02/11/19 15:32:12
subnet 192.168.96.0 netmask 255.255.255.0 {
range 192.168.96.128 192.168.96.254;            # default allows up to 125 VM's

ゲートウェイが 192.168.96.2 となっているので、 固定IPを - node1: 192.168.96.11 - node2: 192.168.96.12 - node3: 192.168.96.13 に設定する。

/etc/sysconfig/network-scirpt/ifcfg-eno??に

#BOOTPROTO="dhcp"
BOOTPROTO="static"
NETMASK=255.255.255.0
GATEWAY=192.168.96.2
DNS1=192.168.96.2
IPADDR=192.168.96.11

を記述(node2, node3も同様)。

/etc/hostname に node1-3 を記述する。

firewallを設定してglusterデーモンを起動

firewall-cmd --permanent --add-service=glusterfs
firewall-cmd --reload
firewall-cmd --list-all # 確認
systemctl start glusterd
systemctl enable glusterd

ノード間認証

node1(192.168.96.11)から以下のコマンドで認証しておく。

gluster peer probe 192.168.96.12
gluster peer probe 192.168.96.13

Volumeの作成

brickとvolume

brickはデータを格納する実ディレクトリ。 複数のbrickからvolumeを作成し、volumeをマウントして使う。 brickは直接操作しない。

node1,node2,node3の/brickを作成。 システム領域がいっぱいになるとよろしくないので、 ファイルサーバに使うときにはパーティションを分けるほうが望ましい (volumeを作成するときに注意される)。

mkdir /brick

複数のbrickからvolumeを生成するが、volumeにはいくつかの種類がある。

  • Distributed: brickをそのまま連結して大きな領域として使う。HDDボリュームでいうところのLVMに相当。
  • Replicated: 2つ以上のbrickに同じデータを書き込む。トラブル発生時でも1つ以上のbrickが動作していればアクセス可能。RAIDでいうところのミラーリング(RAID1)に相当
  • Striped: Distributedに似ているが、ファイルを複数に分割してbrickに記録する。大きなファイルにアクセスするときのネットワーク負荷が減る。RAIDでいうところのストライピング(RAID0)に相当。
  • Dispersed: ファイルを複数に分割して冗長にして複数のbrickに格納。冗長性により、頑健性を調整可能。RAIDでいうところのパリティ分散(RAID5)に相当。

これらの組み合わせ、例えばDistributed-replicatedなどもあり。

Replica volumeを作成

gluster volume create gv0 replica 2 192.168.96.11:/brick 192.168.96.12:/brick force
gluster volume start gv0

ルートパーティションに作成する場合はforceが必要 たぶん、proveをしていればどのノードで行ってもよい。

確認用コマンド

  • gluster volume list でリストを表示
  • gluster volume info で情報を表示
  • gluster volume status で情報を表示
  • gluster peer status でノードの状態を表示
  • gluster pool list でノードの状態を表示

マウント

mount -t glusterfs 192.168.96.11:/gv0 /mnt

/mntにファイルを置くとnode1,2の/brickにコピーされる(/brickは直接触らない)。

検証

ファイルを生成

for filesize in 1 10 100 #MB
do
  for ii in `seq 3`
  do
    dd if=/dev/urandom of=file${filesize}_${ii} count=$filesize bs=1000000
  done
done
md5sum file1*_? > md5

確認してみる。

md5sum -c md5

ここで、node2を殺してみる(シャットダウン)。 キャッシュがあるかもしれないので、node1も再起動。

# gluster volume status; gluster pool list
Status of volume: gv0
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick 192.168.96.11:/brick                  49153     0          Y       7871
Self-heal Daemon on localhost               N/A       N/A        Y       7894
Self-heal Daemon on 192.168.96.13           N/A       N/A        Y       8077

Task Status of Volume gv0
------------------------------------------------------------------------------
There are no active volume tasks

UUID                                    Hostname        State
4a719a1a-2691-4059-9375-43143b1416ab    192.168.96.13   Connected
171e6c38-1378-4556-bf42-7450329939c9    192.168.96.12   Disconnected
22eac064-2f1b-40aa-af95-5ee5a7f9a82c    localhost       Connected

その後再度確認。

md5sum -c md5

ノードが1つ死んでもデータの読出しは可能なことを確認。

node2は死んでるものとして、node3を追加して復旧 (実際の障害時にはまずバックアップを取ったほうがよいであろう)。

gluster volume replace-brick gv0 192.168.96.12:/brick 192.168.96.13:/brick commit force

node2(192.168.96.12)は動いていても動いていなくてもよい。

死んだnode2を切り離す。

gluster peer detach 192.168.96.12

念のため、確認

md5sum -c md5

定期的にHDDを入れ替えるとか、SMART情報に警告が出たらHDDを入れ替えるなどすれば、 高可用性のファイルサーバを構築できるだろう。

volumeの削除

検証が終わったのでvolumeを削除する。 まず、マウントを解除する。次に

gluster volume stop gv0

disperse volumeの生成

replicaはミラーリングであるので、例えば、1TのHDDを2台用意して1T分のファイルサーバを構築する。 使える容量は総量の50%以下になってしまう。 RAID5では、1TのHDD3台で2T分の容量、かつ、1台障害があってもシステム継続可能というようなこともできる。 これをglusterで実現するにはdisperse volumeを使う。

volumeの作成

node2を切り離し(detach)たままならもう一度probeしておく。

gluster volume create gv1 disperse 3 redundancy 1 192.168.96.11:/brick 192.168.96.12:/brick 192.168.96.13:/brick force
gluster volume start gv1

マウントする。

mount -t glusterfs 192.168.96.11:/gv1 /mnt

/mntにファイルを置くとnode1,2,3の/brickにファイルが格納される。中身とサイズはオリジナルではない(元のデータ+冗長ビット)。

検証

ファイルを生成

for filesize in 1 10 100 #MB
do
  for ii in `seq 3`
  do
    dd if=/dev/urandom of=file${filesize}_${ii} count=$filesize bs=1000000
  done
done
md5sum file1*_? > md5

確認してみる。

md5sum -c md5

ここで、node2を殺してみる(シャットダウン)。 キャッシュがあるかもしれないので、node1も再起動。

# gluster volume status; gluster pool list
Status of volume: gv1
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick 192.168.96.11:/brick                  49153     0          Y       7871
Brick 192.168.96.13:/brick                  49152     0          Y       8054
Self-heal Daemon on localhost               N/A       N/A        Y       7894
Self-heal Daemon on 192.168.96.13           N/A       N/A        Y       8077

Task Status of Volume gv1
------------------------------------------------------------------------------
There are no active volume tasks

UUID                                    Hostname        State
4a719a1a-2691-4059-9375-43143b1416ab    192.168.96.13   Connected
171e6c38-1378-4556-bf42-7450329939c9    192.168.96.12   Disconnected
22eac064-2f1b-40aa-af95-5ee5a7f9a82c    localhost       Connected

その後再度確認。

md5sum -c md5

ノードが1つ死んでもデータの読出しは可能なことを確認。

さらに、node3も殺してみる(シャットダウン)。

# gluster volume status; gluster pool list
Status of volume: gv1
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick 192.168.96.11:/brick                  49152     0          Y       7371
Self-heal Daemon on localhost               N/A       N/A        Y       7380

Task Status of Volume gv1
------------------------------------------------------------------------------
There are no active volume tasks

UUID                                    Hostname        State
4a719a1a-2691-4059-9375-43143b1416ab    192.168.96.13   Disconnected
171e6c38-1378-4556-bf42-7450329939c9    192.168.96.12   Disconnected
22eac064-2f1b-40aa-af95-5ee5a7f9a82c    localhost       Connected

ファイルは読みだせなくなっている(マウントがエラー)。 node3を再起動すると再び読出し可能。

node2は死んでるものとして、node4を追加して復旧 (実際の障害時にはまずバックアップを取ったほうがよいであろう)。 同様にnode4(192.168.96.14)を準備して、

gluster volume replace-brick gv0 192.168.96.12:/brick 192.168.96.14:/brick commit force

node2(192.168.96.12)は動いていても動いていなくてもよい。

死んだnode2を切り離す。

gluster peer detach 192.168.96.12
# gluster volume status; gluster pool list
Status of volume: gv1
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick 192.168.96.11:/brick                  49152     0          Y       7371
Brick 192.168.96.14:/brick                  49152     0          Y       8006
Brick 192.168.96.13:/brick                  49152     0          Y       7400
Self-heal Daemon on localhost               N/A       N/A        Y       7595
Self-heal Daemon on 192.168.96.13           N/A       N/A        Y       7479
Self-heal Daemon on 192.168.96.14           N/A       N/A        Y       8015

Task Status of Volume gv1
------------------------------------------------------------------------------
There are no active volume tasks

UUID                                    Hostname        State
4a719a1a-2691-4059-9375-43143b1416ab    192.168.96.13   Connected
a290a42a-28c2-445a-9fd7-69a739530aa0    192.168.96.14   Connected
22eac064-2f1b-40aa-af95-5ee5a7f9a82c    localhost       Connected

念のため、確認

md5sum -c md5