GlusterFS で簡単冗長構成

## はじめに
サーバ間の同期には rsync/lsyncd を使った方法がよく知られていますが、rsync/lsyncd はディレクトリの変更を検出して差分を同期するシステムなので、必ず同じデータになっていることは保証されません。
一方で、GlusterFS では自動的にデータを同期してくれるので、サーバ間のデータに差分があることを心配する必要がなく楽に運用できます。
本記事では GlusterFS の自体の説明はしませんので別の記事をご参照ください m(__)m

https://qiita.com/nagano_m/items/ebb0b1dead85866da176

## GlusterFS で出てくる用語
GlusterFS には「ブリック」という特有の単位が存在します。ブリックは、サーバ上のディレクトリのことで、GlusterFS は複数のブリックを束ねることで1つのボリュームを作ります。
GlusterFS のボリュームにはいくつかのタイプがあります。例えば、`Replicated`タイプにすると、データを複数のサーバにコピーし冗長性を確保します（Raid 1 みたいな感じです）。他にも、`Distributed`タイプにすると、データを複数のサーバに分散して保存するようになります。

その他のボリュームタイムはこちらをご参照ください。

https://docs.gluster.org/en/latest/Administrator-Guide/Setting-Up-Volumes/


## 環境
||IP Address|OS|
|:-:|:-:|:-:|
|server01|192.168.1.11|Ubuntu24.04|
|server02|192.168.1.12|Ubuntu24.04|


## 構築
構築するシステムは下図のような構成なります。
* 各サーバの `/opt/brick0` ディレクトリをブリックにして GlusterFS のボリューム `vol0` を作る
* `vol0` を各サーバの `/opt/app/data` にマウントする
  * 各サーバのアプリケーション `app` は、`/opt/app/data` のデータを読み書きする

![img.dio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667395/69bd437e-3887-1880-4b0d-883ea6cbdb56.png)


### 前準備
server01,02 で GlusterFS のインストールとブリック用のディレクトリ `/opt/brick0` を作ります。
```bash
sudo apt install glusterfs-server
sudo systemctl start glusterd
sudo mkdir /opt/brick0
```

### ピアの設定とボリュームの作成
どちらかのサーバでピアの設定とボリュームを作ります。どちらでもよいので、今回は server01 で実施します。

ピア(server02)との疎通を開始
```bash
sudo gluster peer probe 192.168.1.12
# peer probe: success
```
server01,02 のブリックからボリューム vol0 を作成
```bash
sudo gluster volume create vol0 replica 2 192.168.1.11:/opt/brick0 192.168.1.12:/opt/brick0 force
# volume create: vol0: success: please start the volume to access data
```
ボリュームの提供を開始
```bash
sudo gluster volume start vol0
# volume start: vol0: success
```

### マウント
各サーバでGlusterFSのボリュームをマウントします。
```bash
# @server01
sudo mount -t glusterfs 192.168.1.11:/vol0 /opt/app/data
# @server02
sudo mount -t glusterfs 192.168.1.12:/vol0 /opt/app/data
```
マウントの確認
```bash
# @server01
df -h /opt/app/data
# Filesystem          Size  Used Avail Use% Mounted on
# 192.168.1.11:/vol0  8.7G  1.8G  6.9G  21% /opt/app/data

# @server02
df -h /opt/app/data
# Filesystem          Size  Used Avail Use% Mounted on
# 192.168.1.12:/vol0  8.7G  1.8G  6.9G  21% /opt/app/data
```
これで、各サーバの `/opt/app/data` に書き込まれたデータが同期されるようになりました！

## サーバが壊れた際の復旧
どちらかのサーバが壊れた時に、復旧する方法について紹介したいと思います。今回は server01 が壊れた事を想定します。

まず、生きているサーバ（今回は server02 ）から、server01 のブリックをボリュームから取り外してreplica数を1に設定します。
```bash
sudo gluster volume remove-brick vol0 replica 1 192.168.1.11:/opt/brick0 force
# Remove-brick force will not migrate files from the removed bricks, so they will no longer be available on the volume.
# Do you want to continue? (y/n) y
# volume remove-brick commit force: success
```
次に server02 から server01 をピアから切り離します。
```bash
sudo gluster peer detach 192.168.1.11
# All clients mounted through the peer which is getting detached need to be remounted using one of the other active peers in the trusted storage pool to ensure client gets notification on any changes done on the gluster configuration and if the same has been done do you want to proceed? (y/n) y
# peer detach: success
```

最後に、server02 からピアリングして、ボリュームに server01 のブリックを追加します。
```bash
sudo gluster peer probe 192.168.1.11
# peer probe: success

sudo gluster volume add-brick vol0 replica 2 192.168.1.11:/opt/brick0 force
# volume add-brick: success
```

## おわりに
GlusterFS を使うことで手軽に冗長構成を取ることができました。一般的には、GlusterFS 専用のサーバを3台以上用意してボリュームを作り、別のサーバがマウントする形となりますが、今回のようにサーバ2台だけで冗長構成を作ることもできます。