Amazon Elastic Filey System のプレビューを申し込んでから数週間が経ちます。
なかなか使えるようにならないので、GlusterFS というやつで暇をつぶします。
以下、だらだらとした暇つぶしをメモしたものです。
TL;DR
- GlusterFS をさわってみた(詳しいことは理解してない)
- GlusterFS には ELB を経由して NFS でマウントしてみた(ありなのかわかってない)
- クラスタのノード増減をオンラインで行えるらしきことを確認(その際の負荷などは測ってない)
- ボリューム作成までは公式ドキュメントを参考にした(ノード増減あたりはブログ記事などの非公式情報を参考)
- EFS プレビュー、はよこい
GlusterFS
GlusterFS is a scalable network filesystem. Using common off-the-shelf hardware, you can create large, distributed storage solutions for media streaming, data analysis, and other data- and bandwidth-intensive tasks. GlusterFS is free and open source software.
Storage for your Cloud. — GlusterGlusterFSは、スケーラブルなストレージのための汎用分散ファイルシステムの1つ。InfiniBandのRDMAやTCP/IPインターコネクトなどの各種ストレージを集約し、大規模並列ネットワークファイルシステムを構築できる。GlusterFSはユーザー空間で構築されており、性能を低下させることがない。クラウドコンピューティング、生物医学、超大容量ストレージなど様々な応用がなされている。GlusterFSは、当初Gluster, Inc.によって開発された。2011年のレッドハットによるGluster買収の後はレッドハットにより開発されている。
GlusterFS - Wikipedia
Deploying in AWS
- Deploying in AWS - Gluster Docs
- 2つ以上のインスタンスを使う
- セキュリティグループでポートを制限する(後述)
- ephemeral が許されるのはテストまで
- 商用環境では、Multi-AZ でレプリケーションすべし
- 商用環境では、EBS, EIP の利用を推奨する
疑問
- ダウンタイムなしでノードの増減が可能なのか
- ホットスワップ的なノード交換は可能なのか
EC2 インスタンス
Amazon Linux の AMI を使い、t2.micro の EC2 インスタンスを 2 つ用意します。
EBS
それぞれ、追加で EBS ボリュームをアタッチしておきます。
Zone
インスタンスは異なるゾーンに配置します。
Security Group
- 同一セキュリティグループに対してはすべての TCP を許可しておきます
- 同一 VPC のサブネット 172.31.0.0/16 に対して、以下を許可しておきます
- UDP: 111
- TCP: 111
- TCP: 2049
- TCP: 38465 - 38467
インストール
$ sudo wget -P /etc/yum.repos.d http://download.gluster.org/pub/gluster/glusterfs/LATEST/RHEL/glusterfs-epel.repo
$ sudo sed -i.orig -e 's/$releasever/6/g' /etc/yum.repos.d/glusterfs-epel.repo
$ diff -u /etc/yum.repos.d/glusterfs-epel.repo.orig /etc/yum.repos.d/glusterfs-epel.repo
--- /etc/yum.repos.d/glusterfs-epel.repo.orig 2015-09-03 14:06:25.000000000 +0000
+++ /etc/yum.repos.d/glusterfs-epel.repo 2015-10-04 08:23:22.733374955 +0000
@@ -2,7 +2,7 @@
[glusterfs-epel]
name=GlusterFS is a clustered file-system capable of scaling to several petabytes.
-baseurl=http://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/EPEL.repo/epel-$releasever/$basearch/
+baseurl=http://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/EPEL.repo/epel-6/$basearch/
enabled=1
skip_if_unavailable=1
gpgcheck=1
@@ -10,7 +10,7 @@
[glusterfs-noarch-epel]
name=GlusterFS is a clustered file-system capable of scaling to several petabytes.
-baseurl=http://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/EPEL.repo/epel-$releasever/noarch
+baseurl=http://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/EPEL.repo/epel-6/noarch
enabled=1
skip_if_unavailable=1
gpgcheck=1
@@ -18,7 +18,7 @@
[glusterfs-source-epel]
name=GlusterFS is a clustered file-system capable of scaling to several petabytes. - Source
-baseurl=http://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/EPEL.repo/epel-$releasever/SRPMS
+baseurl=http://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/EPEL.repo/epel-6/SRPMS
enabled=0
skip_if_unavailable=1
gpgcheck=1
$ sudo yum install --enablerepo=epel glusterfs-server
...
=========================================================================================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
=========================================================================================================================================================================
インストール中:
glusterfs-server x86_64 3.7.4-2.el6 glusterfs-epel 1.3 M
依存性関連でのインストールをします:
glusterfs x86_64 3.7.4-2.el6 glusterfs-epel 416 k
glusterfs-api x86_64 3.7.4-2.el6 glusterfs-epel 73 k
glusterfs-cli x86_64 3.7.4-2.el6 glusterfs-epel 156 k
glusterfs-client-xlators x86_64 3.7.4-2.el6 glusterfs-epel 920 k
glusterfs-fuse x86_64 3.7.4-2.el6 glusterfs-epel 118 k
glusterfs-libs x86_64 3.7.4-2.el6 glusterfs-epel 321 k
python26 x86_64 2.6.9-1.80.amzn1 amzn-main 5.7 M
python26-argparse noarch 1.2.1-2.8.amzn1 amzn-main 72 k
python26-libs x86_64 2.6.9-1.80.amzn1 amzn-main 692 k
python26-pyxattr x86_64 0.5.0-1.6.amzn1 amzn-main 25 k
userspace-rcu x86_64 0.7.7-1.el6 epel 60 k
...
$releasever
glusterfs-epel.repo
の中に $releasever
で指定されている箇所がありますが、Amazon Linux だと latest
と解釈されてしまい 404 エラーになってしまします。
最初からある epel の設定が 6
だったので、同様に 6
に書き換えます。
依存解決の失敗
追加した glusterfs-epel.repo
は enable=1
なので --enablerepo
をつける必要はないのですが、そうすると以下のエラーになってインストールに失敗します。
$ sudo yum install glusterfs-server
...
--> 依存性解決を終了しました。
エラー: パッケージ: glusterfs-server-3.7.4-2.el6.x86_64 (glusterfs-epel)
要求: liburcu-bp.so.1()(64bit)
エラー: パッケージ: glusterfs-server-3.7.4-2.el6.x86_64 (glusterfs-epel)
要求: liburcu-cds.so.1()(64bit)
問題を回避するために --skip-broken を用いることができます。
これらを試行できます: rpm -Va --nofiles --nodigest
--enablerepo=epel
をつけて epel を利用できるようにすると、依存解決に成功してインストールできるようになります。
設定
デーモン起動
$ sudo /sbin/service glusterd start
$ sudo chkconfig glusterd on
peer
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster peer probe 172.31.22.91
peer probe: success.
[ec2-user@ip-172-31-22-91 ~]$ sudo gluster peer probe 172.31.6.251
peer probe: success.
- host: hostname of the other server in the cluster, or IP address if you don’t have DNS or /etc/hosts entries
パーティション
$ sudo yum install xfsprogs
$ sudo mkfs.xfs -i size=512 /dev/sdb
meta-data=/dev/sdb isize=512 agcount=4, agsize=524288 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=2097152, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
マウント
$ sudo mkdir -p /export/sdb
$ sudo mount /dev/sdb /export/sdb
$ sudo mkdir -p /export/sdb/brick
fstab
$ echo "/dev/sdb /export/sdb xfs defaults 0 0" | sudo tee -a /etc/fstab
Gluster ボリュームのセットアップ
レプリカタイプでセットアップします。
$ sudo gluster volume create gv0 replica 2 172.31.22.91:/export/sdb/brick 172.31.6.251:/export/sdb/brick
volume create: gv0: success: please start the volume to access data
- host 1: e.g. node01.mydomain.net
- host 2: e.g. node02.mydomain.net
info で情報を確認することができます。
$ gluster volume info
Volume Name: gv0
Type: Replicate
Volume ID: 373b646e-7f70-4daf-b73c-e4e56db2bba6
Status: Created
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 172.31.22.91:/export/sdb/brick
Brick2: 172.31.6.251:/export/sdb/brick
Options Reconfigured:
performance.readdir-ahead: on
ボリュームの利用を開始します。
$ sudo gluster volume start gv0
volume start: gv0: success
glusterfsd
も起動している模様。
$ service glusterfsd status
glusterfsd (pid 3018) is running...
$ sudo chkconfig glusterfsd on
利用
EC2 インスタンス
別に新しくクライアントとなる EC2 インスタンスを作ります。
セキュリティグループは GlusterFS 用のものとは別で、ウィザードデフォルトの SSH のみオープンなやつを適用します。
glusterfs-fuse で接続
まずはパッケージをインストールします。
[ec2-user@ip-172-31-4-109 ~]$ sudo wget -P /etc/yum.repos.d http://download.gluster.org/pub/gluster/glusterfs/LATEST/RHEL/glusterfs-epel.repo
[ec2-user@ip-172-31-4-109 ~]$ sudo sed -i.orig -e 's/$releasever/6/g' /etc/yum.repos.d/glusterfs-epel.repo
[ec2-user@ip-172-31-4-109 ~]$ sudo yum install glusterfs glusterfs-fuse
続いてマウントします。
[ec2-user@ip-172-31-4-109 ~]$ sudo install -d /glusterfs/gv0
[ec2-user@ip-172-31-4-109 ~]$ sudo mount -t glusterfs 172.31.22.91:/gv0 /glusterfs/gv0/
適当にファイルを作成してみます。
[ec2-user@ip-172-31-4-109 ~]$ sudo install -d -o ec2-user -g ec2-user /glusterfs/gv0/ec2-user
[ec2-user@ip-172-31-4-109 ~]$ touch /glusterfs/gv0/ec2-user/{01..10}
[ec2-user@ip-172-31-4-109 ~]$ ls -l /glusterfs/gv0/ec2-user
合計 0
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 01
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 02
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 03
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 04
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 05
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 06
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 07
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 08
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 09
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 10
サーバ側を確認します。
[ec2-user@ip-172-31-6-251 ~]$ ls -al /export/sdb/brick/ec2-user/
合計 0
drwxr-xr-x 2 ec2-user ec2-user 96 10月 4 10:17 .
drwxr-xr-x 5 root root 54 10月 4 10:17 ..
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 01
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 02
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 03
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 04
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 05
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 06
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 07
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 08
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 09
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 10
[ec2-user@ip-172-31-22-91 ~]$ ls -al /export/sdb/brick/ec2-user/
合計 0
drwxr-xr-x 2 ec2-user ec2-user 96 10月 4 10:17 .
drwxr-xr-x 5 root root 54 10月 4 10:17 ..
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 01
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 02
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 03
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 04
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 05
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 06
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 07
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 08
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 09
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 10
片側の glusterd を止めてみる
マウント時に指定した方とは別のホストで glusterd
を止めてみます。
[ec2-user@ip-172-31-6-251 ~]$ sudo service glusterd stop
[ec2-user@ip-172-31-6-251 ~]$ sudo service glusterd status
glusterd is stopped
適当にファイルを作成してみます。
[ec2-user@ip-172-31-4-109 ~]$ touch /glusterfs/gv0/ec2-user/{11..20}
ファイルは両方に作られている模様。
[ec2-user@ip-172-31-6-251 ~]$ ls -la /export/sdb/brick/ec2-user/
合計 0
drwxr-xr-x 2 ec2-user ec2-user 186 10月 4 10:23 .
drwxr-xr-x 5 root root 54 10月 4 10:17 ..
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 01
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 02
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 03
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 04
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 05
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 06
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 07
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 08
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 09
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 10
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 11
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 12
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 13
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 14
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 15
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 16
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 17
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 18
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 19
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 20
[ec2-user@ip-172-31-22-91 ~]$ ls -la /export/sdb/brick/ec2-user/
合計 0
drwxr-xr-x 2 ec2-user ec2-user 186 10月 4 10:23 .
drwxr-xr-x 5 root root 54 10月 4 10:17 ..
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 01
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 02
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 03
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 04
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 05
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 06
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 07
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 08
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 09
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:17 10
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 11
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 12
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 13
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 14
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 15
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 16
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 17
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 18
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 19
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:23 20
片側の EC2 インスタンスを止めてみる
[ec2-user@ip-172-31-6-251 ~]$ sudo shutdown -h now
status を確認すると、Disconnected になりました。
[ec2-user@ip-172-31-22-91 ~]$ sudo gluster peer status
Number of Peers: 1
Hostname: ip-172-31-6-251.ap-northeast-1.compute.internal
Uuid: d51c1102-1503-478e-bf6f-0b23ca9a3e52
State: Peer in Cluster (Disconnected)
Other names:
172.31.6.251
ファイルを作ります。
[ec2-user@ip-172-31-4-109 ~]$ touch /glusterfs/gv0/ec2-user/21
[ec2-user@ip-172-31-22-91 ~]$ ls -la /export/sdb/brick/ec2-user/21
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:30 /export/sdb/brick/ec2-user/21
停止させたインスタンスを起動して、停止中に増えたファイルが同期されるか確認します。
[ec2-user@ip-172-31-6-251 ~]$ ls -l /export/sdb/brick/ec2-user/21
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 10:30 /export/sdb/brick/ec2-user/21
どの程度の時間で同期されるかは未確認。
NFS
glusterfs-fuse
でのマウントを解除します。
[ec2-user@ip-172-31-4-109 ~]$ sudo umount -t /glusterfs/gv0/
[ec2-user@ip-172-31-4-109 ~]$ sudo install -d /glusterfs/gv0-nfs/
[ec2-user@ip-172-31-4-109 ~]$ sudo mount -t nfs 172.31.22.91:/gv0 /glusterfs/gv0-nfs/\
[ec2-user@ip-172-31-4-109 ~]$ ls -al /glusterfs/gv0-nfs/ec2-user
合計 0
drwxr-xr-x 2 ec2-user ec2-user 195 10月 4 10:30 .
drwxr-xr-x 5 root root 54 10月 4 10:17 ..
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 01
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 02
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 03
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 04
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 05
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 06
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 07
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 08
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 09
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 10
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 11
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 12
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 13
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 14
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 15
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 16
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 17
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 18
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 19
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 20
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:30 21
NFSv4
Amazon Elastic File System は NFSv4 互換という話なので、GlusterFS も NFSv4 で使えるようにしたいのですが、デフォルトでは対応していないようです。
[ec2-user@ip-172-31-4-109 ~]$ sudo umount /glusterfs/gv0-nfs/
[ec2-user@ip-172-31-4-109 ~]$ sudo install -d /glusterfs/gv0-nfs4/
[ec2-user@ip-172-31-4-109 ~]$ sudo mount -t nfs4 172.31.22.91:/gv0 /glusterfs/gv0-nfs4/
mount.nfs4: Protocol not supported
NFS-Ganesha というものと組み合わせることで NFSv4 での接続が可能になるようです。
- GlusterFSとNFS-Ganeshaを連携する - Qiita
- Packages for 3rd Party Software with built-in GlusterFS support | Gluster Community Website
これはまた今度。
NFS と ELB
マウント時に指定するホストを固定することができるのか、内部向け ELB を使って試してみます。
ネットワーク及び NFS に詳しくないため、素っ頓狂なことをしている気がします。
内部向け ELB の作成
リスナーを以下とします。
- TCP 111
- TCP 2049
- TCP 38465
- TCP 38466
- TCP 38467
セキュリティグループは、ノードとなるインスタンスに適用したものを指定します。
ヘルスチェックを TCP 2049 への Ping とします。
マウント
dig
などで DNS の名前解決ができることが確認できたらマウントしてみます。
[ec2-user@ip-172-31-4-109 ~]$ sudo mount -t nfs internal-glusterfs-736899893.ap-northeast-1.elb.amazonaws.com:/gv0 /glusterfs/gv0-nfs/
[ec2-user@ip-172-31-4-109 ~]$ df
ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置
/dev/xvda1 8123812 1123564 6900000 15% /
devtmpfs 500720 60 500660 1% /dev
tmpfs 509728 0 509728 0% /dev/shm
internal-glusterfs-736899893.ap-northeast-1.elb.amazonaws.com:/gv0 8378368 32768 8345600 1% /glusterfs/gv0-nfs
[ec2-user@ip-172-31-4-109 ~]$ ls -la /glusterfs/gv0-nfs
合計 4
drwxr-xr-x 5 root root 54 10月 4 10:17 .
drwxr-xr-x 7 root root 4096 10月 4 10:42 ..
drwxr-xr-x 3 root root 24 10月 4 09:30 .trashcan
drwxr-xr-x 2 ec2-user ec2-user 204 10月 4 12:07 ec2-user
[ec2-user@ip-172-31-4-109 ~]$ ls -la /glusterfs/gv0-nfs/ec2-user/
合計 0
drwxr-xr-x 2 ec2-user ec2-user 204 10月 4 12:07 .
drwxr-xr-x 5 root root 54 10月 4 10:17 ..
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 01
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 02
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 03
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 04
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 05
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 06
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 07
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 08
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 09
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:17 10
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 11
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 12
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 13
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 14
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 15
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 16
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 17
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 18
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 19
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:23 20
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 10:30 21
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 12:07 22
[ec2-user@ip-172-31-4-109 ~]$ rm /glusterfs/gv0-nfs/ec2-user/*
[ec2-user@ip-172-31-4-109 ~]$ ls -la /glusterfs/gv0-nfs/ec2-user/
合計 0
drwxr-xr-x 2 ec2-user ec2-user 6 10月 4 12:31 .
drwxr-xr-x 5 root root 54 10月 4 10:17 ..
[ec2-user@ip-172-31-4-109 ~]$ touch /glusterfs/gv0-nfs/ec2-user/{01..10}
[ec2-user@ip-172-31-4-109 ~]$ ls -la /glusterfs/gv0-nfs/ec2-user/
合計 0
drwxr-xr-x 2 ec2-user ec2-user 96 10月 4 12:31 .
drwxr-xr-x 5 root root 54 10月 4 10:17 ..
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 12:31 01
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 12:31 02
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 12:31 03
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 12:31 04
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 12:31 05
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 12:31 06
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 12:31 07
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 12:31 08
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 12:31 09
-rw-rw-r-- 1 ec2-user ec2-user 0 10月 4 12:31 10
「できた」と言えばできましたが、いろいろとポイントを抑えられていないため、不安は残ります。
ノード増減
折角なので、ノードを増やしたり減らしたりしてみます。
(用語として正しいのはブリックかもしれません。)
追加
まずは、Gluster のセットアップを一通り済ませます。
参考にした資料によれば、レプリカ構成の場合はインスタンスが2つ(等倍?)必要になるとのことなので、新しいインスタンスを準備します。
$ sudo wget -P /etc/yum.repos.d http://download.gluster.org/pub/gluster/glusterfs/LATEST/RHEL/glusterfs-epel.repo
$ sudo sed -i.orig -e 's/$releasever/6/g' /etc/yum.repos.d/glusterfs-epel.repo
$ sudo yum install -y --enablerepo=epel glusterfs-server
$ sudo yum install -y xfsprogs
$ sudo mkfs.xfs -i size=512 /dev/sdb
$ sudo mkdir -p /export/sdb
$ sudo mount /dev/sdb /export/sdb
$ sudo mkdir -p /export/sdb/brick
$ echo "/dev/sdb /export/sdb xfs defaults 0 0" | sudo tee -a /etc/fstab
$ sudo /sbin/service glusterd start
$ sudo chkconfig glusterd on
プールにノードを登録します。
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster peer probe 172.31.11.127
peer probe: success.
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster peer probe 172.31.10.131
peer probe: success.
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster pool list
UUID Hostname State
a7241f9b-086e-43b1-8194-f0415635ef0f 172.31.22.91 Connected
7fc1bf72-c10f-4205-b0d3-a926d6a402f2 172.31.11.127 Connected
a6dd5cc5-7fbe-43bf-957a-6111bdeff0a6 172.31.10.131 Connected
d51c1102-1503-478e-bf6f-0b23ca9a3e52 localhost Connected
ボリュームにブリックを追加します。
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster volume add-brick gv0 172.31.11.127:/export/sdb/brick 172.31.10.131:/export/sdb/brick
volume add-brick: success
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster volume status gv0
Status of volume: gv0
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick 172.31.22.91:/export/sdb/brick 49152 0 Y 22879
Brick 172.31.6.251:/export/sdb/brick 49152 0 Y 2381
Brick 172.31.11.127:/export/sdb/brick 49152 0 Y 2592
Brick 172.31.10.131:/export/sdb/brick 49152 0 Y 2539
NFS Server on localhost 2049 0 Y 2694
Self-heal Daemon on localhost N/A N/A Y 2702
NFS Server on 172.31.11.127 2049 0 Y 2611
Self-heal Daemon on 172.31.11.127 N/A N/A Y 2619
NFS Server on 172.31.10.131 2049 0 Y 2558
Self-heal Daemon on 172.31.10.131 N/A N/A Y 2566
NFS Server on 172.31.22.91 2049 0 Y 23317
Self-heal Daemon on 172.31.22.91 N/A N/A Y 23325
Task Status of Volume gv0
------------------------------------------------------------------------------
There are no active volume tasks
この時点では、追加したノードにファイルが同期されません。
[ec2-user@ip-172-31-11-127 ~]$ ls -al /export/sdb/brick/
合計 0
drwxr-xr-x 4 root root 39 10月 4 12:56 .
drwxr-xr-x 3 root root 18 10月 4 12:40 ..
drw------- 6 root root 133 10月 4 12:57 .glusterfs
drwxr-xr-x 3 root root 24 10月 4 12:56 .trashcan
[ec2-user@ip-172-31-10-131 ~]$ ls -al /export/sdb/brick/
合計 0
drwxr-xr-x 4 root root 39 10月 4 12:56 .
drwxr-xr-x 3 root root 18 10月 4 12:56 ..
drw------- 6 root root 133 10月 4 12:57 .glusterfs
drwxr-xr-x 3 root root 24 10月 4 12:56 .trashcan
なお、すでにマウントしていたクライアントからファイルの読み書きは出来ています。
[ec2-user@ip-172-31-4-109 ~]$ touch /glusterfs/gv0-nfs/ec2-user/11
[ec2-user@ip-172-31-6-251 ~]$ ls -l /export/sdb/brick/ec2-user/11
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 12:58 /export/sdb/brick/ec2-user/11
[ec2-user@ip-172-31-22-91 ~]$ ls -l /export/sdb/brick/ec2-user/11
-rw-rw-r-- 2 ec2-user ec2-user 0 10月 4 12:58 /export/sdb/brick/ec2-user/11
追加したノードにファイルが同期されるように、再配置を開始します。
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster volume rebalance gv0 start
volume rebalance: gv0: success: Rebalance on gv0 has been started successfully. Use rebalance status command to check status of the rebalance process.
ID: b3d552aa-3f61-40b1-9436-8bbe66b0407c
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster volume rebalance gv0 status
Node Rebalanced-files size scanned failures skipped status run time in secs
--------- ----------- ----------- ----------- ----------- ----------- ------------ --------------
localhost 0 0Bytes 0 0 0 completed 0.00
172.31.22.91 4 0Bytes 11 0 0 completed 0.00
172.31.11.127 0 0Bytes 0 0 0 completed 0.00
172.31.10.131 0 0Bytes 0 0 0 completed 0.00
volume rebalance: gv0: success:
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster volume status gv0
Status of volume: gv0
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick 172.31.22.91:/export/sdb/brick 49152 0 Y 22879
Brick 172.31.6.251:/export/sdb/brick 49152 0 Y 2381
Brick 172.31.11.127:/export/sdb/brick 49152 0 Y 2592
Brick 172.31.10.131:/export/sdb/brick 49152 0 Y 2539
NFS Server on localhost 2049 0 Y 2694
Self-heal Daemon on localhost N/A N/A Y 2702
NFS Server on 172.31.11.127 2049 0 Y 2611
Self-heal Daemon on 172.31.11.127 N/A N/A Y 2619
NFS Server on 172.31.10.131 2049 0 Y 2558
Self-heal Daemon on 172.31.10.131 N/A N/A Y 2566
NFS Server on 172.31.22.91 2049 0 Y 23317
Self-heal Daemon on 172.31.22.91 N/A N/A Y 23325
Task Status of Volume gv0
------------------------------------------------------------------------------
Task : Rebalance
ID : b3d552aa-3f61-40b1-9436-8bbe66b0407c
Status : completed
レプリケーション+分散されました。
1台だけのレプリカ追加はできないのでしょうか。
削除
先ほど追加したブリックを削除します。
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster volume remove-brick gv0 172.31.11.127:/export/sdb/brick 172.31.10.131:/export/sdb/brick start
volume remove-brick start: success
ID: 77ff7183-1575-4a68-8718-af733802853f
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster volume remove-brick gv0 172.31.11.127:/export/sdb/brick 172.31.10.131:/export/sdb/brick status
Node Rebalanced-files size scanned failures skipped status run time in secs
--------- ----------- ----------- ----------- ----------- ----------- ------------ --------------
172.31.11.127 4 0Bytes 4 0 0 completed 0.00
172.31.10.131 0 0Bytes 0 0 0 completed 0.00
処理が完了したら確定する必要があるようです。
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster volume status gv0
Status of volume: gv0
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick 172.31.22.91:/export/sdb/brick 49152 0 Y 22879
Brick 172.31.6.251:/export/sdb/brick 49152 0 Y 2381
Brick 172.31.11.127:/export/sdb/brick 49152 0 Y 2592
Brick 172.31.10.131:/export/sdb/brick 49152 0 Y 2539
NFS Server on localhost 2049 0 Y 2823
Self-heal Daemon on localhost N/A N/A Y 2831
NFS Server on 172.31.11.127 2049 0 Y 2611
Self-heal Daemon on 172.31.11.127 N/A N/A Y 2619
NFS Server on 172.31.10.131 2049 0 Y 2558
Self-heal Daemon on 172.31.10.131 N/A N/A Y 2566
NFS Server on 172.31.22.91 2049 0 Y 23371
Self-heal Daemon on 172.31.22.91 N/A N/A Y 23379
Task Status of Volume gv0
------------------------------------------------------------------------------
Task : Remove brick
ID : 77ff7183-1575-4a68-8718-af733802853f
Removed bricks:
172.31.11.127:/export/sdb/brick
172.31.10.131:/export/sdb/brick
Status : completed
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster volume remove-brick gv0 172.31.11.127:/export/sdb/brick 172.31.10.131:/export/sdb/brick commit
Removing brick(s) can result in data loss. Do you want to Continue? (y/n) y
volume remove-brick commit: success
Check the removed bricks to ensure all files are migrated.
If files with data are found on the brick path, copy them via a gluster mount point before re-purposing the removed brick.
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster volume status gv0
Status of volume: gv0
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick 172.31.22.91:/export/sdb/brick 49152 0 Y 22879
Brick 172.31.6.251:/export/sdb/brick 49152 0 Y 2381
NFS Server on localhost 2049 0 Y 2869
Self-heal Daemon on localhost N/A N/A Y 2877
NFS Server on 172.31.11.127 2049 0 Y 2714
Self-heal Daemon on 172.31.11.127 N/A N/A Y 2722
NFS Server on 172.31.10.131 2049 0 Y 22820
Self-heal Daemon on 172.31.10.131 N/A N/A Y 22828
NFS Server on 172.31.22.91 2049 0 Y 23398
Self-heal Daemon on 172.31.22.91 N/A N/A Y 23406
Task Status of Volume gv0
------------------------------------------------------------------------------
There are no active volume tasks
すでにマウントしていたクライアントからファイルを読み書きすることができました。
備考
EC2 インスタンスメモ
- 最初の Gluster ノード 2 台(異なるゾーン)
- 172.31.6.251
- 172.31.22.91
- クライアントのインスタンス
- 172.31.4.109
- 後から追加した Gluster ノード 2 台
- 172.31.11.127
- 172.31.10.131