EFS 待ちの間に GlusterFS で暇つぶし

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. — Gluster](http://www.gluster.org/)


> GlusterFSは、スケーラブルなストレージのための汎用分散ファイルシステムの1つ。InfiniBandのRDMAやTCP/IPインターコネクトなどの各種ストレージを集約し、大規模並列ネットワークファイルシステムを構築できる。GlusterFSはユーザー空間で構築されており、性能を低下させることがない。クラウドコンピューティング、生物医学、超大容量ストレージなど様々な応用がなされている。GlusterFSは、当初Gluster, Inc.によって開発された。2011年のレッドハットによるGluster買収の後はレッドハットにより開発されている。
> [GlusterFS - Wikipedia](https://ja.wikipedia.org/wiki/GlusterFS)

### Deploying in AWS

- [Deploying in AWS - Gluster Docs](http://gluster.readthedocs.org/en/latest/Install-Guide/Setup_aws/)
- 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


インストール
----

- [Install - Gluster Docs](http://gluster.readthedocs.org/en/latest/Install-Guide/Install/)

```shell-session
$ 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` をつける必要はないのですが、そうすると以下のエラーになってインストールに失敗します。

```shell-session
$ 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 を利用できるようにすると、依存解決に成功してインストールできるようになります。


設定
----

- [Configure - Gluster Docs](http://gluster.readthedocs.org/en/latest/Install-Guide/Configure/)

### デーモン起動

```shell-session
$ sudo /sbin/service glusterd start
$ sudo chkconfig glusterd on
```

### peer

```shell-session
[ec2-user@ip-172-31-6-251 ~]$ sudo gluster peer probe 172.31.22.91
peer probe: success.
```

```shell-session
[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

### パーティション

```shell-session
$ 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
```

### マウント

```shell-session
$ 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 ボリュームのセットアップ

レプリカタイプでセットアップします。

```shell-session
$ 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 で情報を確認することができます。

```shell-session
$ 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
```

ボリュームの利用を開始します。

```shell-session
$ sudo gluster volume start gv0
volume start: gv0: success
```

`glusterfsd` も起動している模様。

```shell-session
$ service glusterfsd status
glusterfsd (pid 3018) is running...
```

```shell-session
$ sudo chkconfig glusterfsd on
```


利用
----

### EC2 インスタンス

別に新しくクライアントとなる EC2 インスタンスを作ります。
セキュリティグループは GlusterFS 用のものとは別で、ウィザードデフォルトの SSH のみオープンなやつを適用します。

### glusterfs-fuse で接続

まずはパッケージをインストールします。

```shell-session
[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
```

続いてマウントします。

```shell-session
[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/
```

適当にファイルを作成してみます。

```shell-session
[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
```

サーバ側を確認します。

```shell-session
[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
```

```shell-session
[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` を止めてみます。

```shell-session
[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
```

適当にファイルを作成してみます。

```shell-session
[ec2-user@ip-172-31-4-109 ~]$ touch /glusterfs/gv0/ec2-user/{11..20}
```

ファイルは両方に作られている模様。

```shell-session
[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
```

```shell-session
[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 インスタンスを止めてみる

```shell-session
[ec2-user@ip-172-31-6-251 ~]$ sudo shutdown -h now
```

status を確認すると、Disconnected になりました。

```shell-session
[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
```

ファイルを作ります。

```shell-session
[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
```

停止させたインスタンスを起動して、停止中に増えたファイルが同期されるか確認します。

```shell-session
[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` でのマウントを解除します。

```shell-session
[ec2-user@ip-172-31-4-109 ~]$ sudo umount -t /glusterfs/gv0/
```

```shell-session
[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 で使えるようにしたいのですが、デフォルトでは対応していないようです。

```shell-session
[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](http://qiita.com/yunano/items/86d02d8af4cb97f45d92)
- [Packages for 3rd Party Software with built-in GlusterFS support | Gluster Community Website](http://blog.gluster.org/category/nfsv4/)

これはまた今度。


NFS と ELB
----

マウント時に指定するホストを固定することができるのか、内部向け ELB を使って試してみます。
ネットワーク及び NFS に詳しくないため、素っ頓狂なことをしている気がします。

### 内部向け ELB の作成

- [内部向けロードバランサーの作成 - Elastic Load Balancing](https://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/elb-create-internal-load-balancer.html)

リスナーを以下とします。

- TCP 111
- TCP 2049
- TCP 38465
- TCP 38466
- TCP 38467

セキュリティグループは、ノードとなるインスタンスに適用したものを指定します。

ヘルスチェックを TCP 2049 への Ping とします。

### マウント

`dig` などで DNS の名前解決ができることが確認できたらマウントしてみます。

```shell-session
[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つ(等倍?)必要になるとのことなので、新しいインスタンスを準備します。

```shell-session
$ 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
```

プールにノードを登録します。

```shell-session
[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
```

ボリュームにブリックを追加します。

```shell-session
[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

```

この時点では、追加したノードにファイルが同期されません。

```shell-session
[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
```

```shell-session
[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
```

なお、すでにマウントしていたクライアントからファイルの読み書きは出来ています。

```shell-session
[ec2-user@ip-172-31-4-109 ~]$ touch /glusterfs/gv0-nfs/ec2-user/11
```

```shell-session
[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
```

```shell-session
[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
```

追加したノードにファイルが同期されるように、再配置を開始します。

```shell-session
[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台だけのレプリカ追加はできないのでしょうか。

### 削除

先ほど追加したブリックを削除します。

```shell-session
[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
```

処理が完了したら確定する必要があるようです。

```shell-session
[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


参考
----

- [EC2でGlusterFSを使ってみた ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/glusterfs-on-ec2/)
- [AWS Partner SA ブログ: レッドハット社技術投稿 - Red Hat Gluster Storage編](http://aws.typepad.com/aws_partner_sa/2015/03/redhat-gluster-storage.html)
- [GlusterFS3.5: iptablesで開くべきポート番号 | EXBLOG](https://www.exbit.biz/blog/?p=152)
- [ボリューム構成変更手順 - GlusterFS技術情報](https://sites.google.com/site/glusterfstech/volumes/modify)
- [4.6. ブリック追加・削除とリバランス – GlusterFS Community ではじめる分散ファイルシステム « インフラ本舗](http://infra.makeall.net/archives/2322)