GlusterFSを使ってみた

## 書いてること
- GlusterFSとは
- GlusterFSで使われる用語
- Volume(ストレージ)タイプ
- 使ってみた
- 所感
- 参考


## GlusterFSとは
- オープンソースの分散ファイルシステム
- VIPやMaster/Slaveといった概念は無し
- 複数サーバを束ねて1つのファイルシステムとして利用可能、専用のハードウェアを必要としない
  - 例として、5台のCentOSサーバからそれぞれ20GBのディスク領域をGlusterFS用に提供し、100GBのストレージとして利用可能
- ストレージの追加/削除は動的に可能、ストレージに問題が発生した場合は自動フェイルオーバ機能が備わっている
- 中央集権的なmetadataサーバは不要、可用性とデータ保護性に優れていると言われている
- 基本的にはGlusterFSをマウントすることで利用可能だが、NFSマウントも可能、REST APIでもアクセス可能、 k8sとの相性も良い(k8sの公式ドキュメントでも紹介されている)

## GlusterFSで使われる用語
- GlusterFS Server
  - 複数のノードでGlusterFSクラスタ(Volume)を構築する
  - 前述の通り、Master/Slaveは無い
- GlusterFS Client
  - GlusterFS Serverで構築したVolumeを利用する
  - Volumeをマウントすることで利用可能
  - マウント先のノードがダウンしている場合、マウントは失敗するがマウントオプションで失敗時に別のマウント先を指定可能なのでフェイルオーバ可能
- Storage Pool
  - GlusterFSクラスタに参加するサーバグループのこと
- Brick
  - 個々のサーバのファイルシステムを指す
  - ディレクトリと読み替えてもよい
  - GlusterFSは各ノードの1つのブリックにつき1つのポートが使用される
  - GlusterFSの分散ファイルシステム(Volume)に保存されたファイルは物理的にはBrick上に保存される
- Volume
  - Brickを論理的に束ねたもの
  - 1つのストレージとして利用可能
  - GlusterFSストレージをクライアントから利用する場合はこのボリュームをマウントする

### ここまでをまとめると以下のようなイメージになる
![glusterfs_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663565/023251ca-c550-9b7b-3a92-bb574520df65.png)


## Volume(ストレージ)タイプ
- Distributed Volume(分散ボリューム)
  - ファイルはVolumeを構成するBrickのいずれか1つに保存される
  - Volumeの容量はBrickの総量になるため、大容量ストレージとして利用したい場合に向いてる
  - ただし、Brickに障害が発生した場合、そのBrickに保存されていたファイルにはアクセス不可になる
![glusterfs_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663565/e6586f22-3653-7270-cf74-e2cfc8c4fbda.png)

- Replicated Volume(冗長ボリューム)
  - ファイルは指定したレプリカ数分のBrickに重複して保存される
  - Volumeの容量はBrickの総量をレプリカ数で割ったものになる
  - Brickに障害が発生しても他のBrickにある複製されたファイルを利用できるため、可用性を重視している場合に向いている
![glusterfs_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663565/b8cc90fe-f146-1495-1d10-5af0aa6b7e26.png)

- Striped Volume
  - ファイルは分割され、指定したストライプ数分のBrickに分散して保存される
  - Volumeの容量はBrickの総量になる
  - 複数のBrickを並行して利用できるため、巨大なファイルに頻繁にアクセスする場合に向いている
  - 1つでもBrickに障害が発生するとファイルにアクセスできなくなる
![glusterfs_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663565/62b4fa9a-b4bc-2dc3-2ab3-c2941e907dab.png)

## 動作検証(クイックスタートに沿って構築する)
### 環境情報
- CentOS 7.9：3台
  - Gluster Client：1台(test01)
  - GlusterFS Server：2台(test02, test03)
    - データボリューム1GBをアタッチ
![glusterfs_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663565/70fc7a6e-3ce0-d052-56e1-f643ca3fb890.png)


### インストール(test02, test03)
```
# yum install glusterfs-server
# yum install centos-release-gluster
```

### glusterfsの起動(test02, test03)
```
# systemctl enable glusterd
# systemctl start glusterd
# systemctl status glusterd
```

### poolの設定(test02)
```
poolを組むいずれかのサーバから実施
# gluster peer probe 192.168.0.3
[root@test02 ~]# gluster peer probe 192.168.0.3
peer probe: success
```

### poolの確認(test02, test03)
```
poolのリストとpeerの状態を確認する
# gluster pool list
# gluster peer status


[root@test02 ~]# gluster pool list
UUID					Hostname   	State
2dc07656-b8e2-4908-b289-2ba193a752cc	192.168.0.3	Connected
5e338595-db0c-45e4-abe3-7f3b35471541	localhost  	Connected

[root@test03 ~]# gluster pool list
UUID					Hostname   	State
5e338595-db0c-45e4-abe3-7f3b35471541	192.168.0.2	Connected
2dc07656-b8e2-4908-b289-2ba193a752cc	localhost  	Connected


[root@test02 ~]# gluster peer status
Number of Peers: 1
Hostname: 192.168.0.3
Uuid: 2dc07656-b8e2-4908-b289-2ba193a752cc
State: Peer in Cluster (Connected)

[root@test03 ~]# gluster peer status
Number of Peers: 1
Hostname: 192.168.0.2
Uuid: 5e338595-db0c-45e4-abe3-7f3b35471541
State: Peer in Cluster (Connected)
```

### パーティションの設定
```
# fdisk -l
# fdisk /dev/sdb
# fdisk -l


[root@test02 ~]# fdisk -l
Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0009ef88

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    83886079    41942016   83  Linux

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x2312d135

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2097151     1047552   83  Linux
```

###  Brickのフォーマットとマウント
```
ファイルシステムを作成
# mkfs.xfs -i size=512 /dev/sdb1

Brickの領域をmkdirで作成
# mkdir -p /bricks/brick1

fstabへ反映
# vi /etc/fstab
/dev/sdb1 /bricks/brick1 xfs defaults 1 2

mountする

# mount -a && mount
# mount | grep /dev/sd
[root@test02 ~]# mount | grep /dev/sd
/dev/sda1 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sdb1 on /bricks/brick1 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
```

### volumeのセットアップ
```
適当なディレクトリを作成
# mkdir /bricks/brick1/gv0


Volumeを作成する
なおvolumeを構築するサーバは、localhost/127.0.0.1/ループバックアドレスの指定は不可
IPアドレスかホスト名にすること

2ノードだとスプリットブレインが起きやすいから3ノードを推奨されてるがここでは一旦無視する
# gluster volume create gv0 replica 2 192.168.0.2:/bricks/brick1/gv0 192.168.0.3:/bricks/brick1/gv0
[root@test02 ~]# gluster volume create gv0 replica 2 192.168.0.2:/bricks/brick1/gv0 192.168.0.3:/bricks/brick1/gv0
Replica 2 volumes are prone to split-brain. Use Arbiter or Replica 3 to avoid this. See: http://docs.gluster.org/en/latest/Administrator%20Guide/Split%20brain%20and%20ways%20to%20deal%20with%20it/.
Do you still want to continue?
 (y/n) y
volume create: gv0: success: please start the volume to access data


構築したVolumeの状態を確認
Volume名、Volumeタイプ、Brickの数、Brickの情報などが確認可能
なお、Volumeが作成できない場合は/var/log/glusterfs配下に吐かれるログを確認する
Status: Createdとなっており、まだ利用はできない

# gluster volume info
[root@test02 ~]# gluster volume info
Volume Name: gv0
Type: Replicate
Volume ID: 450c3b9a-ce18-4573-b70b-a047aecb4c43
Status: Created
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 192.168.0.2:/bricks/brick1/gv0
Brick2: 192.168.0.3:/bricks/brick1/gv0
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off


StatusがCreatedなのでスタートする
# gluster volume start gv0
[root@test02 ~]# gluster volume start gv0
volume start: gv0: success


Volumeの状態を確認しStatusがStartedであることを確認する
# gluster volume info
[root@test02 ~]# gluster volume info
Volume Name: gv0
Type: Replicate
Volume ID: 450c3b9a-ce18-4573-b70b-a047aecb4c43
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 192.168.0.2:/bricks/brick1/gv0
Brick2: 192.168.0.3:/bricks/brick1/gv0
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
```


### GlusterFS volumeのテスト
- 以下のイメージのようにvolume上に作成したファイルが各Brickでreplicaされることを確認する

![glusterfs_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663565/330fafe7-840b-3d6e-8204-6c6e4dc75e06.png)

```
test01からglustefs volumeをmountする
# mount -t glusterfs 192.168.0.2:/gv0 /mnt
[root@test01 ~]# mount -t glusterfs 192.168.0.2:/gv0 /mnt


mountできたことを確認する
# mount | grep mnt
[root@test01 ~]# mount | grep mnt
192.168.0.2:/gv0 on /mnt type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)


dfコマンドで確認するとReplicateTypeなので2GBではなく1GBの領域がマウントされている
# df -h
[root@test01 ~]# df -h
Filesystem        Size  Used Avail Use% Mounted on
/dev/sda1          40G  4.3G   36G  11% /
devtmpfs          237M     0  237M   0% /dev
tmpfs             244M     0  244M   0% /dev/shm
tmpfs             244M  4.5M  240M   2% /run
tmpfs             244M     0  244M   0% /sys/fs/cgroup
tmpfs              49M     0   49M   0% /run/user/1000
192.168.0.2:/gv0 1020M   43M  978M   5% /mnt


マウントしている領域にファイルを100個作成する
# for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/copy-test-$i; done
[root@test01 ~]# for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/copy-test-$i; done


client側の確認
# ll /mnt
# ll /mnt/copy-test-* | wc -l
[root@test01 ~]# ll /mnt/
(略)
[root@test01 ~]# ll /mnt/copy-test-* | wc -l
100


server側の確認
# ll /bricks/brick1/gv0/
# ll /bricks/brick1/gv0/copy-test-* | wc -l
[root@test02 ~]# ll /bricks/brick1/gv0/
(略)
[root@test02 ~]# ll /bricks/brick1/gv0/copy-test-* | wc -l
100

[root@test03 ~]# ll /bricks/brick1/gv0/
(略)
[root@test03 ~]# ll /bricks/brick1/gv0/copy-test-* | wc -l
100
```


## 動作検証
### ファイル削除時の挙動
- 以下を検証
  - クライアント側でのファイル削除
  - サーバ側でのファイル削除
```
クライアント側でのファイル削除

test01でファイルを削除
[root@test01 ~]# rm /mnt/copy-test-001
rm: remove regular file ‘/mnt/copy-test-001’? yes
[root@test01 ~]# ll /mnt/copy-test-001
ls: cannot access /mnt/copy-test-001: No such file or directory

すぐにteswt02, test03でも削除される
[root@test02 ~]# ll /bricks/brick1/gv0/copy-test-001
ls: cannot access /bricks/brick1/gv0/copy-test-001: No such file or directory
[root@test03 ~]# ll /bricks/brick1/gv0/copy-test-001
ls: cannot access /bricks/brick1/gv0/copy-test-001: No such file or directory
/var/log/glusterfs配下のログへの書き込みはなし



サーバ側でのファイル削除

test02からファイルを1つ削除してみる
[root@test02 ~]# rm /bricks/brick1/gv0/copy-test-001
rm: remove regular file ‘/bricks/brick1/gv0/copy-test-001’? yes
削除されたことを確認
[root@test02 ~]# ll /bricks/brick1/gv0/copy-test-001
ls: cannot access /bricks/brick1/gv0/copy-test-001: No such file or directory

test03でファイルが存在することを確認する
[root@test03 ~]# ll /bricks/brick1/gv0/copy-test-001
-rw-------. 2 root root 246800 Feb 15 10:01 /bricks/brick1/gv0/copy-test-001

test01からファイルは問題なく確認できる
[root@test01 ~]# ll /mnt/copy-test-001
-rw-------. 1 root root 246800 Feb 15 10:01 /mnt/copy-test-001

test02でファイルが復活している
[root@test02 ~]# ll /bricks/brick1/gv0/copy-test-001
-rw-------. 2 root root 246800 Feb 15 10:01 /bricks/brick1/gv0/copy-test-001

各サーバのログを確認したがtest02で以下の1行が存在するだけだった
MSGIDで検索したけど見当たらなかった
[root@test02 ~]# cat /var/log/glusterfs/bricks/bricks-brick1-gv0.log
[2022-02-15 10:28:15.103541 +0000] W [MSGID: 113093] [posix-entry-ops.c:373:posix_set_gfid2path_xattr] 0-gv0-posix: setting gfid2path xattr failed on /bricks/brick1/gv0/copy-test-001: key = trusted.gfid2path.2f98ab7942e13969  [File exists]
```

### 障害からの復旧
- サーバを1台再起動させたときの挙動を確認する
```
test02のshutdown前の状態
[root@test03 ~]# gluster volume info
Volume Name: gv0
Type: Replicate
Volume ID: 450c3b9a-ce18-4573-b70b-a047aecb4c43
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 192.168.0.2:/bricks/brick1/gv0
Brick2: 192.168.0.3:/bricks/brick1/gv0
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

test02をシャットダウン
[root@test02 ~]# shutdown -h now
Connection to 127.0.0.1 closed by remote host.
Connection to 127.0.0.1 closed.

poolとpeerの状態
[root@test03 ~]# gluster pool list
UUID					Hostname   	State
5e338595-db0c-45e4-abe3-7f3b35471541	192.168.0.2	Disconnected
2dc07656-b8e2-4908-b289-2ba193a752cc	localhost  	Connected

[root@test03 ~]# gluster peer status
Number of Peers: 1
Hostname: 192.168.0.2
Uuid: 5e338595-db0c-45e4-abe3-7f3b35471541
State: Peer in Cluster (Disconnected)


volumeの状態
[root@test03 ~]# gluster volume info
Volume Name: gv0
Type: Replicate
Volume ID: 450c3b9a-ce18-4573-b70b-a047aecb4c43
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 192.168.0.2:/bricks/brick1/gv0
Brick2: 192.168.0.3:/bricks/brick1/gv0
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

クライアントからglusterfsへのアクセスは可能
[root@test01 ~]# ll /mnt/copy-test-* | wc -l
99

test02起動後
[root@test03 ~]# gluster pool list
UUID					Hostname   	State
5e338595-db0c-45e4-abe3-7f3b35471541	192.168.0.2	Connected
2dc07656-b8e2-4908-b289-2ba193a752cc	localhost  	Connected

[root@test03 ~]# gluster peer status
Number of Peers: 1
Hostname: 192.168.0.2
Uuid: 5e338595-db0c-45e4-abe3-7f3b35471541
State: Peer in Cluster (Connected)
```



### volumeの削除
```
volumeを停止する
データにアクセスできなるけどって警告が出る
# gluster volume stop gv0
[root@test02 ~]# gluster volume stop gv0
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: gv0: success


volumeの状態確認
Statusがstoppedになっている
[root@test02 ~]# gluster volume info
Volume Name: gv0
Type: Replicate
Volume ID: 450c3b9a-ce18-4573-b70b-a047aecb4c43
Status: Stopped
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 192.168.0.2:/bricks/brick1/gv0
Brick2: 192.168.0.3:/bricks/brick1/gv0
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on


クライアントからはアクセスできなくなってる
[root@test01 ~]# ll /mnt
ls: cannot access /mnt: Transport endpoint is not connected

アンマウントする
[root@test01 ~]# umount /mnt

volumeの削除
[root@test02 ~]# gluster volume delete gv0
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: gv0: success

削除されたことを確認
[root@test02 ~]# gluster volume info
No volumes present

brick配下は削除されない
[root@test02 ~]# ll /bricks/brick1/gv0/
total 24156
-rw-------. 2 root root 246800 Feb 15 10:01 copy-test-002
-rw-------. 2 root root 246800 Feb 15 10:01 copy-test-003
(略)
```

### volumeを別のタイプ(Distribute)で作成する

```
デフォルトがdistributeタイプなのでVolume作成してみる
# gluster volume create gv0 192.168.0.2:/bricks/brick1/gv0 192.168.0.3:/bricks/brick1/gv0
[root@test02 ~]# gluster volume create gv0 192.168.0.2:/bricks/brick1/gv0 192.168.0.3:/bricks/brick1/gv0
volume create: gv0: failed: /bricks/brick1/gv0 is already part of a volume


怒られたので、各Gluster FS serverのBrick配下のデータを削除する
[root@test02 ~]# ll -a /bricks/brick1/gv0/
total 0
drwxr-xr-x. 3 root root 24 Feb 17 09:37 .
drwxr-xr-x. 3 root root 17 Feb 17 09:37 ..
drw-------. 2 root root  6 Feb 17 09:37 .glusterfs
[root@test02 ~]# rm -rf /bricks/brick1/gv0/.glusterfs


再度作成する
[root@test02 ~]# gluster volume create gv0 192.168.0.2:/bricks/brick1/gv0 192.168.0.3:/bricks/brick1/gv0
volume create: gv0: success: please start the volume to access data

Statusがcreatedで作成
[root@test02 ~]# gluster volume info
Volume Name: gv0
Type: Distribute
Volume ID: 6d29c78f-4dac-4738-82d1-d1b37d77abd2
Status: Created
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: 192.168.0.2:/bricks/brick1/gv0
Brick2: 192.168.0.3:/bricks/brick1/gv0
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on

volumeをスタートする
[root@test02 ~]# gluster volume start gv0
volume start: gv0: success


Distributeタイプでstartedであることを確認
[root@test02 ~]# gluster volume info
Volume Name: gv0
Type: Distribute
Volume ID: 6d29c78f-4dac-4738-82d1-d1b37d77abd2
Status: Started
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: 192.168.0.2:/bricks/brick1/gv0
Brick2: 192.168.0.3:/bricks/brick1/gv0
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on


test01からglustefs volumeをmountする
[root@test01 ~]# mount -t glusterfs 192.168.0.2:/gv0 /mnt


mountされていることを確認する
[root@test01 ~]# mount | grep mnt
192.168.0.2:/gv0 on /mnt type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)


DistributeタイプなのでReplicateタイプと異なり総容量が2GBになっている
[root@test01 ~]# df -h
Filesystem        Size  Used Avail Use% Mounted on
/dev/sda1          40G  4.3G   36G  11% /
devtmpfs          237M     0  237M   0% /dev
tmpfs             244M     0  244M   0% /dev/shm
tmpfs             244M  4.6M  240M   2% /run
tmpfs             244M     0  244M   0% /sys/fs/cgroup
tmpfs              49M     0   49M   0% /run/user/1000
192.168.0.2:/gv0  2.0G   86M  2.0G   5% /mnt
tmpfs              49M     0   49M   0% /run/user/0
```


### 動作確認
- 以下のイメージのようにvolume上に作成したファイルが各Brickで分散されることを確認する

![glusterfs_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663565/06ed70d3-f05e-3085-4d42-325affd1cf04.png)


```
マウントしている領域にファイルを100個作成する
# for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/copy-test-$i; done
[root@test01 ~]# for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/copy-test-$i; done


client側の確認
# ll /mnt
# ll /mnt/copy-test-* | wc -l
[root@test01 ~]# ll /mnt/
(略)
[root@test01 ~]# ll /mnt/copy-test-* | wc -l
100


server側の確認
# ll /bricks/brick1/gv0/
# ll /bricks/brick1/gv0/copy-test-* | wc -l
[root@test02 ~]# ll /bricks/brick1/gv0/
total 600
-rw-------. 2 root root 8224 Feb 24 06:19 copy-test-001
-rw-------. 2 root root 8224 Feb 24 06:19 copy-test-004
-rw-------. 2 root root 8224 Feb 24 06:19 copy-test-006
-rw-------. 2 root root 8224 Feb 24 06:19 copy-test-008
-rw-------. 2 root root 8224 Feb 24 06:19 copy-test-011
(略)
[root@test02 ~]# ll /bricks/brick1/gv0/copy-test-* | wc -l
50

[root@test03 ~]# ll /bricks/brick1/gv0/
total 600
-rw-------. 2 root root 8224 Feb 24 06:19 copy-test-002
-rw-------. 2 root root 8224 Feb 24 06:19 copy-test-003
-rw-------. 2 root root 8224 Feb 24 06:19 copy-test-005
-rw-------. 2 root root 8224 Feb 24 06:19 copy-test-007
(略)
[root@test03 ~]# ll /bricks/brick1/gv0/copy-test-* | wc -l
50
```


### volumeにBrickを追加
- 試しにtest02の/tmp配下にディレクトリを作成し、volumeに追加してみる

![glusterfs_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663565/028938ed-9ec7-4634-0f4a-05709952dc8c.png)

```
ディレクトリ作成
# mkdir -p /tmp/bricks/gv0

追加前のvolume情報
[root@test02 ~]# gluster volume info
Volume Name: gv0
Type: Distribute
Volume ID: 6d29c78f-4dac-4738-82d1-d1b37d77abd2
Status: Started
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: 192.168.0.2:/bricks/brick1/gv0
Brick2: 192.168.0.3:/bricks/brick1/gv0
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on

Brickの追加
# gluster volume add-brick gv0 192.168.0.2:/tmp/bricks/gv0
[root@test02 ~]# gluster volume add-brick gv0 192.168.0.2:/tmp/bricks/gv0
volume add-brick: failed: The brick 192.168.0.2:/tmp/bricks/gv0 is being created in the root partition. It is recommended that you don't use the system's root partition for storage backend. Or use 'force' at the end of the command if you want to override this behavior.

rootボリュームは警告が出るためforceオプションで実施(動的に追加可能なことを確認するため)
特に再起動コマンドなどは不要
[root@test02 ~]# gluster volume add-brick gv0 192.168.0.2:/tmp/bricks/gv0 force
volume add-brick: success


追加後のvolume情報
[root@test02 ~]# gluster volume info
Volume Name: gv0
Type: Distribute
Volume ID: 6d29c78f-4dac-4738-82d1-d1b37d77abd2
Status: Started
Snapshot Count: 0
Number of Bricks: 3
Transport-type: tcp
Bricks:
Brick1: 192.168.0.2:/bricks/brick1/gv0
Brick2: 192.168.0.3:/bricks/brick1/gv0
Brick3: 192.168.0.2:/tmp/bricks/gv0
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on

クライアント側でdfコマンドを実施して総容量が2GBから42GBまで増えていることを確認
[root@test01 ~]# df -h
Filesystem        Size  Used Avail Use% Mounted on
/dev/sda1          40G  4.3G   36G  11% /
devtmpfs          237M     0  237M   0% /dev
tmpfs             244M     0  244M   0% /dev/shm
tmpfs             244M  4.5M  240M   2% /run
tmpfs             244M     0  244M   0% /sys/fs/cgroup
tmpfs              49M     0   49M   0% /run/user/1000
192.168.0.2:/gv0   42G  4.9G   38G  12% /mnt
```

### リバランス
- ファイル数が偏っているためリバランス可能か確認する
- 公式ドキュメントに記載されているがリバランスには以下の2つの意味がある
  - Fix Layout
    - 新しいボリュームトポロジーを利用可能となるようにレイアウトを修正、新しく追加されたノードにファイルを保存/分散できるようにする
  - Fix Layout and Migrate Data
    - 新しいボリュームトポロジーを利用可能となるようにレイアウトを修正、既存のデータを移行しボリュームをリバランスする
- 今回は既存のデータ移行まで実施する
```
リバランス前
[root@test02 ~]# ll /bricks/brick1/gv0/copy-test-* | wc -l
50
[root@test02 ~]# ll /tmp/bricks/gv0/copy-test-* | wc -l
ls: cannot access /tmp/bricks/gv0/copy-test-*: No such file or directory
0
[root@test03 ~]# ll /bricks/brick1/gv0/copy-test-* | wc -l
50

リバランスする
# gluster volume rebalance gv0 start
[root@test02 ~]# 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: 14eb7433-10df-401a-bd88-446787296ef8

ステータス確認
[root@test02 ~]# gluster volume rebalance gv0 status
                                    Node Rebalanced-files          size       scanned      failures       skipped               status  run time in h:m:s
                               ---------      -----------   -----------   -----------   -----------   -----------         ------------     --------------
                             192.168.0.3                0        0Bytes            49             0            48            completed        0:00:00
                               localhost                0        0Bytes           148             0            49            completed        0:00:00
volume rebalance: gv0: success

リバランス後
なぜか総ファイル数が197になっている？リバランスするコマンドを間違えた？
[root@test02 ~]# ll /tmp/bricks/gv0/copy-test-* | wc -l
97
[root@test02 ~]# ll /bricks/brick1/gv0/copy-test-* | wc -l
51
[root@test03 ~]# ll /bricks/brick1/gv0/copy-test-* | wc -l
49



試しに別のファイルを100ファイル作成する
[root@test01 ~]# for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/file-test-$i; done
[root@test01 ~]# ll /mnt/file-test-* | wc -l
100

一番容量の大きなBrickに多くのファイルが格納されている
[root@test02 ~]# ll /bricks/brick1/gv0/file-test-* | wc -l
1
[root@test02 ~]# ll /tmp/bricks/gv0/file-test-* | wc -l
97
[root@test03 ~]# ll /bricks/brick1/gv0/file-test-* | wc -l
2

test03をshutdownしてファイルにアクセスできないことを試す

test03に格納されているファイル一覧を確認
[root@test03 ~]# ll /bricks/brick1/gv0/file-test-0*
-rw-------. 2 root root 8509 Feb 24 07:01 /bricks/brick1/gv0/file-test-009
-rw-------. 2 root root 8509 Feb 24 07:01 /bricks/brick1/gv0/file-test-096

シャットダウンする
[root@test03 ~]# shutdown -h now
Connection to 127.0.0.1 closed by remote host.
Connection to 127.0.0.1 closed.

クライアント側から見えるファイル数が98に減っている
[root@test01 ~]# ll /mnt/file-test-* | wc -l
98

見えなくなったのはtest03に格納されていた以下の2ファイル
[root@test01 ~]# ll /mnt/file-test-009
ls: cannot access /mnt/file-test-009: No such file or directory
[root@test01 ~]# ll /mnt/file-test-096
ls: cannot access /mnt/file-test-096: No such file or directory

test03が起動後は問題なくファイルを確認可能
[root@test01 ~]# ll /mnt/file-test-* | wc -l
100
[root@test01 ~]# ll /mnt/file-test-009
-rw-------. 1 root root 8509 Feb 24 07:01 /mnt/file-test-009
[root@test01 ~]# ll /mnt/file-test-096
-rw-------. 1 root root 8509 Feb 24 07:01 /mnt/file-test-096

```


## 所感
- 簡単にファイルシステムが構築できるため、初心者でもとっつきやすいと感じました
- 無停止で拡張/縮小できるため、動的にリソースを変更可能なクラウド環境との相性も良いと感じました
- Volumeタイプもハイブリッドでの利用が可能なので、ファイルの性質(消えても良い)と環境の性質に合わせて構築できる点も魅力的です
  - バッチ処理の中間ファイルは一時的な容量が欲しいからDistributed Volumeを利用
  - ユーザからのアップロードファイルなどはReplicated Volumeを利用など
- リバランスは課題
  - リバランスのポリシーを調べたけど、調べ方が悪かったのかヒットせず....時間があるときに調査したい

## 参考
 - 公式ドキュメント
 https://docs.gluster.org/en/latest/



以上