GlusterFSのdisperseを試す(失敗)

RAID-5/6のように効率の良い冗長化をするべく、disperseを試してみる。
結局xattrs絡み?で失敗。

# gluster volume create gv0 disperse redundancy 1 10.0.0.1:/glusterfs-data/brick 10.0.0.2:/glusterfs-data/brick 10.0.0.3:/glusterfs-data/brick

前回と同様に読み書き中に切断してみると、エラーが出たり止まったり。
self-healも失敗したりしてロクでもない。

/var/log/glusterfs/nfs.log:

[2016-01-11 21:09:56.061341] E [ec-helpers.c:400:ec_loc_setup_path] 0-gv0-disperse-0: Invalid path '' in loc
[2016-01-11 21:09:56.061450] I [dht-layout.c:663:dht_layout_normalize] 0-gv0-dht: Found anomalies in  (gfid = 820db491-6926-446d-ae73-06e35012b0da). Holes=1 overlaps=0
[2016-01-11 21:09:56.061557] E [nfs3-helpers.c:3616:nfs3_fh_resolve_inode_lookup_cbk] 0-nfs-nfsv3: Lookup failed: : Input/output error
[2016-01-11 21:09:56.061602] E [nfs3.c:2148:nfs3_write_resume] 0-nfs-nfsv3: Input/output error: (10.33.4.177:781) gv0 : 820db491-6926-446d-ae73-06e35012b0da
[2016-01-11 21:09:56.061632] W [nfs3-helpers.c:3401:nfs3_log_common_res] 0-nfs-nfsv3: XID: 54c917c4, WRITE: NFS: 5(I/O error), POSIX: 14(Bad address)

ここでついに、zfs(xattrをサポートしていない)にbrickを置いたことが災いした模様。
xattrは、NFS越しにxattrを使わなければ困らないだろうと甘く見ていた。

[Bugs] [Bug 1181048] lockless lookup cause disk to be kicked out

このあたりを読んでいて嫌な予感はしていた。
GlusterFSとZFSを組み合わせるには

仕方がないのでUFSにする。もちろんzvolで。

rc.conf:

zvol_enable="YES"

念のためglusterfsとどちらが先に起動するか見ておく。できればREQUIRESに書いてやりたいがとりあえず放置。

# rcorder /etc/rc.d/* /usr/local/etc/rc.d/*
root@gluster3:~ # rcorder /etc/rc.d/* /usr/local/etc/rc.d/* | grep -E "glusterfsd|zvol"
/etc/rc.d/zvol
/usr/local/etc/rc.d/glusterfsd

zvolを作ってUFSを乗せる。格好悪いなぁ。
debugflagsをつけないとmountがoperation not permittedでコケる。

# zfs create -V 12G zroot/glusterfs-data
# newfs /dev/zvol/zroot/glusterfs-data
# echo '/dev/zvol/zroot/glusterfs-data /glusterfs-data ufs rw 0 0' >> /etc/fstab
# echo 'kern.geom.debugflags=0x10' >> /etc/sysctl.conf

あとは冒頭のgluster volume createをやり直してリトライ。

結果は……

[2016-01-11 23:00:05.651061] W [ec-combine.c:801:ec_combine_check] 0-gv0-disperse-0: Mismatching xdata in answers of 'LOOKUP'
[2016-01-11 23:00:05.651120] C [nfs.c:463:nfs_start_subvol_lookup_cbk] 0-nfs: Failed to lookup root: Input/output error

このあともいろいろ考えて試してみたもののうまくいかず。

  • 先のBugZillaをみると”ルートディレクトリのxattrsが違うよ”という報告が出てるから、もしかして/glusterfs-dataのマウント先である/がzfsなのが悪い?
    → zfs-ufs-ufsなマウントにしてみたけど解消せず。
  • xattrsにtrusted名前空間が使われているけど、FreeBSDのUFSはsystemとuserしかない。そりゃ失敗するよね?
    → ちゃんとuser名前空間に行くようになってた。libglusterfs/src/syscall.csys_lsetxattrとかで、OSごとに切り替えられてる。

わからないので持ち越し。