gluster メモ
分散ファイルシステムgluster (glusterfs) のテストをしてみた。
RAIDで信頼性を高めてもRAIDのマシン自体が止まってしまったらサービスが止まってしまう。 また、ホットスワップ用のケースを導入などしないと可用性が確保できないことが多い。 分散ファイルシステムならば、(設定によるが)マシンが1台止まっても、ファイルサーバを動作させたまま 別のマシンをネットワークに接続して復旧することができる。 一定期間動作させたらHDDを交換するとか、SMART情報を見てHDDを交換するとかも容易にできる。 PCが複数台必要になるが、Raspberry Piなどを使って構築するなども可能だろう。
環境の構築 (VMWare + CentOS)
VMWare のダウンロードとCentOSのインストール
- https://www.vmware.com/jp/products/workstation-player.html の「今すぐダウンロード」から VMWare workstation player 15をダウンロードしてインストール。
- CentOSのMinimal ISOをダウンロードしておく。
- クイックインストールは使わずに「後でOSをインストール」を選択して仮想マシンを作成して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