GlusterFS のスナップショットを使う

LVM シンプロビジョニングボリュームに GlusterFS ブリックを作るとスナップショットが使えるらしいのでやってみました。

- [Managing Snapshots - Gluster Docs](http://gluster.readthedocs.org/en/latest/Administrator%20Guide/Managing%20Snapshots/ "Managing Snapshots - Gluster Docs")
- [A Journey: Gluster Volume Snapshot Howto](http://rajesh-joseph.blogspot.jp/p/gluster-volume-snapshot-howto.html "A Journey: Gluster Volume Snapshot Howto")

LVM シンプロビジョニングボリュームについては以前下記の投稿で書きました。

- [LVM シンプロビジョニングボリューム](http://qiita.com/ngyuki/items/84c471862cb29f6dfc71 "LVM シンプロビジョニングボリューム")

## インストール

`glusterfs-server` は下記の記事のように g1-g4 の４台にインストールされているものとします。マウントするために `glusterfs-fusr` をインストールしたサーバ `cl` も１台設けています。

- [GlusterFS を使ってみた](http://ngyuki.hatenablog.com/entry/2015/08/26/013622 "GlusterFS を使ってみた")

記事の通り CentOS 7 の環境を Vagrant で複数立ち上げて試しています。使用した GlusterFS のバージョンは 3.7.3 です。

## LVM シンプロビジョニングボリューム作成

追加ディスクに LVM 用にパーティションを作成します。

```sh:g1-g4
parted -s -a optimal /dev/sdb mklabel msdos -- mkpart primary 1 -1 set 1 lvm on
```

ボリュームグループを作成します。

```sh:g1-g4
pvcreate /dev/sdb1
vgcreate vg0 /dev/sdb1
```

シンプールを作成します。

```sh:g1-g4
lvcreate --thin -L 10G vg0/thin
```

シンプロビジョニングボリュームを作成します。

```sh:g1-g4
lvcreate --thin -V 10G -n data vg0/thin
```

ファイルシステムを作成します。

```sh:g1-g4
mkfs.xfs /dev/vg0/data
```

マウントします。

```sh:g1-g4
mkdir -p /glfs/vols
cat <<EOS>>/etc/fstab
/dev/vg0/data /glfs/vols xfs defaults 0 0
EOS
mount /glfs/vols
```

## GlusterFS を開始してボリューム作成

GlusterFS のサービスを開始します。

```:g1-g4
systemctl enable glusterd.service
systemctl start  glusterd.service
systemctl status glusterd.service
```

ノード４台からなるストレージプールを作成します。

```sh:g1
gluster peer probe g2
gluster peer probe g3
gluster peer probe g4
```

ボリュームを作成します。

```sh:g1
gluster volume create data replica 2 \
  g1:/glfs/vols/data \
  g2:/glfs/vols/data \
  g3:/glfs/vols/data \
  g4:/glfs/vols/data
```

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

```sh:g1
gluster volume start data
```

## スナップショットの操作

クライアントからマウントします。

```sh:cl
mkdir -p /glfs/data
mount -t glusterfs g1:/data /glfs/data
```

適当に書き込みます。

```sh:cl
mkdir /glfs/data/xxx
echo 1 > /glfs/data/1.txt
```

適当なノード（例えば **g1**）でスナップショットを作ります。
デフォではスナップショット名の後ろに作成時のタイムスタンプが追加されます。
とりあえず試すだけなら名前が長いと不便なので `no-timestamp` を指定してタイムスタンプが付かないようにします。

```sh:g1
gluster snapshot create data-01 data no-timestamp
```

スナップショットの情報や状態を見ることができます。

```sh:g1
gluster snapshot list
gluster snapshot info data-01
gluster snapshot status data-01
```

クライアントから更にいろいろ書き込みます。

```sh:cl
echo 5 > /glfs/data/5.txt
echo 6 > /glfs/data/6.txt
```

スナップショットをアクティブ化します。

```sh:g1
gluster snapshot activate data-01
```

アクティブ化するとクライアントからスナップショットをマウントできます。

```sh:cl
mkdir /glfs/data-01
mount -t glusterfs g1:/snaps/data-01/data /glfs/data-01
```

中身を確認してみます。通常のボリュームには 5.txt や 6.txt がありますが・・・

```sh:cl
ll /glfs/data
```

```
total 2
-rw-r--r-- 1 root root  2 Aug 23 14:24 1.txt
-rw-r--r-- 1 root root  2 Aug 23 14:30 5.txt
-rw-r--r-- 1 root root  2 Aug 23 14:30 6.txt
drwxr-xr-x 2 root root 12 Aug 23 14:24 xxx
```

スナップショットには 5.txt や 6.txt がありません。

```sh:cl
ll /glfs/data-01
```

```
total 1
-rw-r--r-- 1 root root  2 Aug 23 14:24 1.txt
drwxr-xr-x 2 root root 12 Aug 23 14:24 xxx
```

スナップショットをアンマウントします。

```sh:cl
umount /glfs/data-01
```

ボリュームを停止します。

```sh:g1
gluster volume stop data
```

スナップショットをリストアします。

```sh:g1
gluster snapshot restore data-01
```

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

```sh:g1
gluster volume start data
```

クライアントから見てみると、スナップショットの時点に復元されていることが判ります。

```sh:cl
ll /glfs/data/
```

```
total 1
-rw-r--r-- 1 root root  2 Aug 23 14:24 1.txt
drwxr-xr-x 2 root root 12 Aug 23 14:24 xxx
```

## ソフトリミットで古いスナップショットを自動削除

スナップショットンにソフトリミットを設定すると、スナップショットが一定数以上になると自動的に古いものから削除されるようになります。

```sh:g1
gluster snapshot config snap-max-soft-limit 80
gluster snapshot config auto-delete enable
gluster snapshot config data snap-max-hard-limit 10
```

設定を確認します。

```sh:g1
gluster snapshot config
```

```
Snapshot System Configuration:
snap-max-hard-limit : 256
snap-max-soft-limit : 80%
auto-delete : enable
activate-on-create : disable

Snapshot Volume Configuration:

Volume : data
snap-max-hard-limit : 10
Effective snap-max-hard-limit : 10
Effective snap-max-soft-limit : 8 (80%)
```

この設定は次のような意味です。

- `snap-max-hard-limit : 256`
    - システムデフォルトのハードリミットは 256 個
    - これを超えてスナップショットを作成することはできない
    - ボリュームごとの設定で上書きできる
- `snap-max-soft-limit : 80%`
    - ソフトリミットはハードリミットの 80%
    - これを超えたときの動作は `auto-delete` による
    - ボリュームごとの設定で上書きできない
- `auto-delete : enable`
    - ソフトリミットに達したときの動作
    - enable なら自動的に古いスナップショットを削除
    - disable なら警告のみ
    - ボリュームごとの設定で上書きできない
- `snap-max-hard-limit : 10`
    - data ボリュームのハードリミットは 10 個

スナップショットをたくさん作ってみます。

```sh:g1
gluster snapshot create data-snap data
gluster snapshot create data-snap data
gluster snapshot create data-snap data
gluster snapshot create data-snap data
gluster snapshot create data-snap data
gluster snapshot create data-snap data
gluster snapshot create data-snap data
gluster snapshot create data-snap data
```

８個目までは普通に作成できます。

```sh:g1
gluster snapshot list
```

```
data-snap_GMT-2015.08.23-05.56.34
data-snap_GMT-2015.08.23-05.56.48
data-snap_GMT-2015.08.23-05.56.55
data-snap_GMT-2015.08.23-05.57.03
data-snap_GMT-2015.08.23-05.57.11
data-snap_GMT-2015.08.23-05.57.17
data-snap_GMT-2015.08.23-05.57.22
data-snap_GMT-2015.08.23-05.57.28
```

９個目を作ってみます。

```sh:g1
gluster snapshot create data-snap data
```

```
snapshot create: success: Snap data-snap_GMT-2015.08.23-05.58.27 created successfully
```

一番古いスナップショットが自動的に削除されます。

```sh:g1
gluster snapshot list
```

```
data-snap_GMT-2015.08.23-05.56.48
data-snap_GMT-2015.08.23-05.56.55
data-snap_GMT-2015.08.23-05.57.03
data-snap_GMT-2015.08.23-05.57.11
data-snap_GMT-2015.08.23-05.57.17
data-snap_GMT-2015.08.23-05.57.22
data-snap_GMT-2015.08.23-05.57.28
data-snap_GMT-2015.08.23-05.58.27
```