前回 GlusterFS の volume を作成してクライアントとなる Linux からマウントするところまでをやってみました。今回は一部のサーバーが停止してしまったらどうなるのかを試してみます。
[root@client ~]# df -h /vol1 /vol2
Filesystem Size Used Avail Use% Mounted on
gluster1:/vol1 1021M 33M 988M 4% /vol1
gluster1:/vol2 2.0G 66M 2.0G 4% /vol2
/vol1
は Replicated Volume (1G + 1G = 1G) で /vol2 は Distributed Volume (1G + 1G = 2G) です。 置いたファイルがサーバー側でどう見えるかを確認してみます
[root@client ~]# for s in $(seq -w 1 20); do touch /vol1/$s /vol2/$s; done
[root@client ~]# ls /vol1 /vol2
/vol1:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
/vol2:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
[root@client ~]#
[root@gluster1 ~]# ls /gluster/vol1/brick1/brick/
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
[root@gluster1 ~]# ls /gluster/vol2/brick1/brick/
03 04 05 11 13 18 19 20
[root@gluster1 ~]#
[root@gluster2 ~]# ls /gluster/vol1/brick1/brick/
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
[root@gluster2 ~]# ls /gluster/vol2/brick1/brick/
01 02 06 07 08 09 10 12 14 15 16 17
[root@gluster2 ~]#
こんな感じで vol1 は gluster1,2 の両方に全部が、vol2 はファイルごとに gluster1,2 のどちらかにだけ存在します。 これで、gluster1 を down させると vol1 はそれでも全てのファイルにアクセス可能で、vo2 は gluster2 にあるファイルだけにアクセスできるというのが期待される動作です。試してみます。 gluster1 停止後は次のようになりました。
[root@client ~]# ls /vol1 /vol2
/vol1:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
/vol2:
01 02 06 07 08 09 10 12 14 15 16 17
[root@client ~]#
停止時間がどうだったかというと53秒ほど ls の結果が待たされました。
2017-05-20 13:03:23.715827382
2017-05-20 13:04:17.859390739
クライアント側の syslog には次のログが出ていました。
May 20 13:04:17 client vol1[9362]: [2017-05-20 13:04:17.335765] C [rpc-clnt-ping.c:160:rpc_clnt_ping_timer_expired] 0-vol1-client-0: server 10.130.49.27:49152 has not responded in the last 42 seconds, disconnecting.
42秒というのは GlusterFS の volume 毎に設定する network.ping-timeout の値だということなのでこれを短くすることで固まる時間を短くできるのではないかということで試してみます。
$ sudo gluster volume get vol1 network.ping-timeout
Option Value
------ -----
network.ping-timeout 42
$ sudo gluster volume set vol1 network.ping-timeout 5
volume set: success
$ sudo gluster volume get vol1 network.ping-timeout
Option Value
------ -----
network.ping-timeout 5
ls /vol1
だけにして試してみたところ停止時間は8秒程度になりました。 次に gluster1 が停止している状態で vol1, vol2 それぞれにファイルを追加するとどうなるかを確認します。 gluster1 は停止しているので Disconnected 状態です。
[root@gluster2 ~]# gluster peer status
Number of Peers: 1
Hostname: gluster1
Uuid: 6d9fa83a-dd3b-4a36-956e-4a069e74745e
State: Peer in Cluster (Disconnected)
vol1, vol2 それぞれに 21 から 40 というファイルを置いてみます。
[root@client ~]# for s in $(seq -w 21 40); do touch /vol1/$s /vol2/$s; done
touch: cannot touch ‘/vol2/23’: Transport endpoint is not connected
touch: cannot touch ‘/vol2/24’: Transport endpoint is not connected
touch: cannot touch ‘/vol2/26’: Transport endpoint is not connected
touch: cannot touch ‘/vol2/27’: Transport endpoint is not connected
touch: cannot touch ‘/vol2/28’: Transport endpoint is not connected
touch: cannot touch ‘/vol2/32’: Transport endpoint is not connected
touch: cannot touch ‘/vol2/33’: Transport endpoint is not connected
touch: cannot touch ‘/vol2/35’: Transport endpoint is not connected
touch: cannot touch ‘/vol2/38’: Transport endpoint is not connected
[root@client ~]# ls /vol1 /vol2
/vol1:
01 03 05 07 09 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
02 04 06 08 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
/vol2:
01 06 08 10 14 16 21 25 30 34 37 40
02 07 09 12 15 17 22 29 31 36 39
Distributed Volume な vol2 は計算によって gluster1 に置かれるべきファイルはサーバーが存在しないということでエラーになりました。 もう gluster1 は起動してこないので諦めようという場合は当該 brick を切り離すことで書き込めるようになります。 volume status
では見えない brick がどれだったかわからないので
[root@gluster2 ~]# gluster volume status vol2
Status of volume: vol2
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick gluster2:/gluster/vol2/brick1/brick 49153 0 Y 28864
Task Status of Volume vol2
------------------------------------------------------------------------------
There are no active volume tasks
volume info
で確認します
[root@gluster2 ~]# gluster volume info vol2
Volume Name: vol2
Type: Distribute
Volume ID: 35be21b5-c624-4cdb-a20f-96cdb6efefbd
Status: Started
Snapshot Count: 0
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: gluster1:/gluster/vol2/brick1/brick
Brick2: gluster2:/gluster/vol2/brick1/brick
Options Reconfigured:
network.ping-timeout: 5
transport.address-family: inet
nfs.disable: on
volume remove-brick
で brick を削除します。アクセスできないので force
を指定してますし、データロスするよと警告が出ていますが、アクセスできる状態では start
, commit
でデータを他の brick に移して安全に削除することができます。
[root@gluster2 ~]# gluster volume remove-brick vol2 gluster1:/gluster/vol2/brick1/brick force
Removing brick(s) can result in data loss. Do you want to Continue? (y/n) y
volume remove-brick commit force: success
削除できたのでどんなファイルでも書き込めるようになりました。
[root@client ~]# for s in $(seq -w 1 40); do touch /vol2/$s; done
[root@client ~]# ls /vol2
01 03 05 07 09 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
02 04 06 08 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
gluster1 を起動させると Replicated Volume の vol1 brick には停止中に書き込んだファイルが自動で同期されています。
[root@gluster1 ~]# ls /gluster/vol1/brick1/brick/
01 03 05 07 09 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
02 04 06 08 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
gluster1 の /gluster/vol2/brick1/brick を vol2 に再度追加してみます
[root@gluster1 ~]# gluster volume add-brick vol2 gluster1:/gluster/vol2/brick1/brick
volume add-brick: failed: /gluster/vol2/brick1/brick is already part of a volume
前のデータが残っているのでそのままでは追加できないため、消してから再登録します。
[root@gluster1 ~]# rm -fr /gluster/vol2/brick1/brick
[root@gluster1 ~]# gluster volume add-brick vol2 gluster1:/gluster/vol2/brick1/brick
volume add-brick: success
追加されましたが、自動で再配置されるわけではありません。volume rebalance
コマンドで再配置させられます。
[root@gluster1 ~]# gluster volume rebalance vol2 start
volume rebalance: vol2: success: Rebalance on vol2 has been started successfully. Use rebalance status command to check status of the rebalance process.
ID: 4f1bca89-8929-4b84-8e82-cbdf3528a640
volume rebalance
の status
コマンドでリバランス処理の進み具合を確認できます。今回はファイルが少ししかないので一瞬で終わってます。
[root@gluster1 ~]# gluster volume rebalance vol2 status
Node Rebalanced-files size scanned failures skipped status run time in h:m:s
--------- ----------- ----------- ----------- ----------- ----------- ------------ --------------
localhost 0 0Bytes 0 0 0 completed 0:00:00
gluster2 17 0Bytes 40 0 0 completed 0:00:00
volume rebalance: vol2: success
brick のディレクトリを確認するとファイルが移動されています。
[root@gluster1 ~]# ls /gluster/vol2/brick1/brick/
03 04 05 11 13 18 19 20 23 24 26 27 28 32 33 35 38
[root@gluster2 ~]# ls /gluster/vol2/brick1/brick/
01 06 08 10 14 16 21 25 30 34 37 40
02 07 09 12 15 17 22 29 31 36 39
snapshot はまた次回