一つのVMに、GlusterFSのQuotaとSnapshot機能を試しました、その記録を残しておきたいと思っています。
実験環境:
- Vagrant 1.8.1
- VirtualBox 5.0.20r106931
- GlusterFS 3.7
Vagrantfile
まずは新しいハードディスクを作っておきます:
config.vm.provider :virtualbox do |vb|
file_to_disk = "#{ENV["HOME"]}/glusterfs.vdi"
unless File.exist?(file_to_disk)
vb.customize ['createmedium', 'disk', '--filename', file_to_disk, '--format', 'VDI', '--size', 10 * 1024]
vb.customize ['storageattach', :id,
'--storagectl', 'IDE Controller',
'--port', 1,
'--device', 0,
'--type', 'hdd',
'--medium', file_to_disk]
end
end
上記の設定は環境に依存するため、自分の環境に合わせて作ってください。
詳しいのは VagrantのVMに複数のディスクを追加する方法 をご参照してください。
Install Glusterfs
ウェブ上に情報が多いですので、ここで省略。
Create LVM Volume
/dev/sdb
があるのを確認:
[vagrant@g1 ~]$ ls /dev/sd
sda sda1 sda2 sda3 sdb
parted
で新しいパティションを作ろう。感じんのは lvm on
で、Snapshot 機能を使うために必須。
[vagrant@g1 ~]$ sudo parted -s -a optimal /dev/sdb mklabel msdos -- mkpart primary 1 -1 set 1 lvm on
/dev/sdb1
を確認:
[vagrant@g1 ~]$ ls /dev/sd
sda sda1 sda2 sda3 sdb sdb1
物理ボリューム(pv)とボリュームグループ(vg)を作成:
[vagrant@g1 ~]$ sudo pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
[vagrant@g1 ~]$ sudo vgcreate vg0 /dev/sdb1
Volume group "vg0" successfully created
thinpool
を作成(名前は thinp
):
[vagrant@g1 ~]$ sudo lvcreate --thin -L 1G vg0/thinp
Logical volume "thinp" created.
thinp
に基づいてボリューム data
を作成して、 mkfs.xfs
でファイルシステムを作ります:
[vagrant@g1 ~]$ sudo lvcreate --thin -V 1G -n data vg0/thinp
Logical volume "data" created.
[vagrant@g1 ~]$ sudo mkfs.xfs /dev/vg0/data
meta-data=/dev/vg0/data isize=256 agcount=8, agsize=32752 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=262016, imaxpct=25
= sunit=16 swidth=16 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=768, version=2
= sectsz=512 sunit=16 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
LVM volume /dev/vg0/data
をロカールにmountします:
[vagrant@g1 ~]$ sudo mkdir -p /gfs/data
[vagrant@g1 ~]$ sudo mount /dev/vg0/data /gfs/data
これで、 LVM の Thinpool Volume をロカールホストにアクセスできるようになりました。
Create Glusterfs Volume
これからGlusterfsの Volume を作成し、ロカールに mount します:
[vagrant@g1 ~]$ sudo gluster volume create vol-liubin g1:/gfs/data/vol-liubin
volume create: vol-liubin: success: please start the volume to access data
[vagrant@g1 ~]$ sudo gluster volume start vol-liubin
volume start: vol-liubin: success
[vagrant@g1 ~]$ sudo mkdir -p /gfs-client/vol-liubin
[vagrant@g1 ~]$ sudo mount -t glusterfs g1:/vol-liubin /gfs-client/vol-liubin
ロカールに mount したフォルダに、いくつのファイルを作成します。
[vagrant@g1 ~]$ sudo mkdir /gfs-client/vol-liubin/some
[vagrant@g1 ~]$ cd /gfs-client/vol-liubin/
[vagrant@g1 vol-liubin]$ sudo touch aa.txt
[vagrant@g1 vol-liubin]$ sudo touch bbb.txt
[vagrant@g1 vol-liubin]$ ls
aa.txt bbb.txt some
Create Snapshot and Restore Snapshot
Snapshot を作成します。no-timestamp
オプションをつけないと、 Snapshot 名にタイムスタンプが自動に追加されます。
[vagrant@g1 vol-liubin]$ sudo gluster snapshot create ss-1 vol-liubin
snapshot create: success: Snap ss-1_GMT-2016.07.13-06.52.44 created successfully
[vagrant@g1 vol-liubin]$ sudo gluster snapshot list
ss-1_GMT-2016.07.13-06.52.44
[vagrant@g1 vol-liubin]$ sudo gluster snapshot create ss-2 vol-liubin no-timestamp
snapshot create: success: Snap ss-2 created successfully
Snapshot の詳細も見られます:
[vagrant@g1 vol-liubin]$ sudo gluster snapshot info ss-2
Snapshot : ss-2
Snap UUID : 2424720e-e80c-49f9-94d6-4730f1fef5a3
Created : 2016-07-13 06:54:23
Snap Volumes:
Snap Volume Name : 22b9a1f21bbb40eeabb34665f110cf98
Origin Volume name : vol-liubin
Snaps taken for vol-liubin : 2
Snaps available for vol-liubin : 254
Status : Stopped
Snapshot ss-2
をとった後、新しいファイル ccc.txt
を作成し、Volume を umount してから、停止します:
# create a new file
[vagrant@g1 vol-liubin]$ sudo touch ccc.txt
# umount
[vagrant@g1 vol-liubin]$ cd
[vagrant@g1 ~]$ sudo umount g1:/vol-liubin
# stop volume
[vagrant@g1 ~]$ sudo gluster volume stop vol-liubin
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: vol-liubin: success
ss-2
をVolume vol-liubin
に Restore します:
[vagrant@g1 ~]$ sudo gluster snapshot restore ss-2
Restore operation will replace the original volume with the snapshotted volume. Do you still want to continue? (y/n) y
Snapshot restore: ss-2: Snap restored successfully
再び vol-liubin
を開始しmountします:
[vagrant@g1 ~]$ sudo gluster volume start vol-liubin
volume start: vol-liubin: success
[vagrant@g1 ~]$ sudo mount -t glusterfs g1:/vol-liubin /gfs-client/vol-liubin
ss-2
は古いSnapshotのため、 ccc.txt
がないことを確認できるはずです。
[vagrant@g1 ~]$ ls /gfs-client/vol-liubin/
aa.txt bbb.txt some
注意:Snapshot 機能を利用するには、THIN の LVM を使うのが前提です:
$ sudo gluster snapshot create ss-4 vol-3
snapshot create: failed: Snapshot is supported only for thin provisioned LV. Ensure that all bricks of vol-3 are thinly provisioned LV.
Snapshot command failed
オフィシャルのマニュアルによると:
GlusterFS volume snapshot feature is based on thinly provisioned LVM snapshot. To make use of snapshot feature GlusterFS volume should fulfill following pre-requisites:
Each brick should be on an independent thin provisioned LVM.
Brick LVM should not contain any other data other than brick.
None of the brick should be on a thick LVM.
gluster version should be 3.6 and above.
Glusterfs Volume Quota
次は Quota 機能を試します。
まずは、Volume 別に quota 機能を有効にしなければなりまぜん。
[vagrant@g1 vol-liubin]$ sudo gluster volume quota vol-liubin enable
volume quota : success
次、容量は 10MB に制限します。list
コマンドはVolumeの制限リストを表示します:
[vagrant@g1 vol-liubin]$ sudo gluster volume quota vol-liubin limit-usage / 10MB
volume quota : success
[vagrant@g1 vol-liubin]$ sudo gluster volume quota vol-liubin list
Path Hard-limit Soft-limit Used Available Soft-limit exceeded? Hard-limit exceeded?
-------------------------------------------------------------------------------------------------------------------------------
/ 10.0MB 80%(8.0MB) 1.0KB 10.0MB No No
テスト用のファイル(gs.rmp、1.45MB)いくつを vol-liubin
にコーピーします:
[vagrant@g1 vol-liubin]$ cd
[vagrant@g1 ~]$ sudo cp gs.rmp /gfs-client/vol-liubin/some/
[vagrant@g1 ~]$ sudo gluster volume quota vol-liubin list
Path Hard-limit Soft-limit Used Available Soft-limit exceeded? Hard-limit exceeded?
-------------------------------------------------------------------------------------------------------------------------------
/ 10.0MB 80%(8.0MB) 1.4MB 8.6MB No No
[vagrant@g1 ~]$ sudo cp gs.rmp /gfs-client/vol-liubin/some/1
[vagrant@g1 ~]$ sudo cp gs.rmp /gfs-client/vol-liubin/some/2
[vagrant@g1 ~]$ sudo gluster volume quota vol-liubin list
Path Hard-limit Soft-limit Used Available Soft-limit exceeded? Hard-limit exceeded?
-------------------------------------------------------------------------------------------------------------------------------
/ 10.0MB 80%(8.0MB) 4.2MB 5.8MB No No
[vagrant@g1 ~]$ sudo cp gs.rmp /gfs-client/vol-liubin/some/3
[vagrant@g1 ~]$ sudo cp gs.rmp /gfs-client/vol-liubin/some/4
[vagrant@g1 ~]$ sudo cp gs.rmp /gfs-client/vol-liubin/some/5
[vagrant@g1 ~]$ sudo cp gs.rmp /gfs-client/vol-liubin/some/6
[vagrant@g1 ~]$ sudo cp gs.rmp /gfs-client/vol-liubin/some/7
[vagrant@g1 ~]$ sudo gluster volume quota vol-liubin list
Path Hard-limit Soft-limit Used Available Soft-limit exceeded? Hard-limit exceeded?
-------------------------------------------------------------------------------------------------------------------------------
/ 10.0MB 80%(8.0MB) 11.1MB 0Bytes Yes Yes
[vagrant@g1 ~]$ sudo cp gs.rmp /gfs-client/vol-liubin/some/8
[vagrant@g1 ~]$ sudo gluster volume quota vol-liubin list
Path Hard-limit Soft-limit Used Available Soft-limit exceeded? Hard-limit exceeded?
-------------------------------------------------------------------------------------------------------------------------------
/ 10.0MB 80%(8.0MB) 12.5MB 0Bytes Yes Yes
7
番目のファイルをコーピーした時点ですでに容量制限を超えましたが、8
番目のファイルもコーピーし成功しました。
原因はわかりません。
続けてファイルをコーピーします。今回はエラーになりました。
[vagrant@g1 ~]$ sudo cp gs.rmp /gfs-client/vol-liubin/some/9
cp: cannot create regular file '/gfs-client/vol-liubin/some/9': Disk quota exceeded
[vagrant@g1 ~]$