Friday, May 15, 2015

GlusterFS replicate volume測試

最近突然想到測試一下這個XD
隨手筆記一下.

測試環境:
CentOS 6.6的VM, 安裝GlusterFS 3.6.3
gfs1: 192.168.20.101, /dev/sda3 XFS, 掛在/export/sda3
gfs2: 192.168.20.102, /dev/sda3 XFS, 掛在/export/sda3
gfsc: 192.168.20.103 (c是client的意思)


註: mkfs.xfs的時候, 建議用的參數:
mkfs.xfs /dev/sda3 -i size=512 -n size=8192
-i size=512是要設定inode的大小, 因為GlusterFS是用底層檔案的extended attributes在儲存metadata, 這是存在inode裡面, 所以inode要比預設值(256)大一些.
-n size=8192是放大目錄區的大小, 預設值是4096.
然後掛載到GlusterFS server上時, 建議加上inode64這個參數.

反正GlusterFS的設定算簡單, 就不講安裝過程了.
要注意的是, 現在建立volume時, brick他會建議你不要直接用mount point的目錄
而是在mount point底下再建一個目錄.
原因不大清楚, 不過還是照建議做好了.

我超懶, 所以兩台的brick我都用/export/sda3/brick這個目錄.
這樣的話, 建立volume的指令就是:
gluster volume create gfs replica 2 gfs1:/export/sda3/brick \ gfs2:/export/brick
然後照慣例啟動這個volume:
gluster volume start gfs

再來就可以叫client去掛載了.
mount gfs1:/gfs /gfs -t glusterfs

好, 以上是正常使用. 我們來玩弄一下......
我把/media的資料複製到/gfs裡面, 然後中途把gfs1的網路切掉~
結果複製會暫停, 經過一個timeout (預設42秒) 之後會繼續複製, 這時候資料就只有寫到gfs2上面.
實際去gfs1跟gfs2上面看, 會發現兩邊brick的資料量不一樣.
這時去gfs2下:
gluster pool list
會看到gfs1顯示為disconnected.
再來, 我們讓gfs1的網路恢復, 資料會自動開始同步, 這時可以下:
gluster volume heal gfs info
來看到同步動作的詳細資訊.

這時候反應快的人應該會想到, 如果掛掉的是gfs1, 會不會因為mount時用的hostname是gfs1而產生問題?
測試的結果: 如果是已經mount好的volume不會有問題, 但如果是在gfs1斷線期間做mount的話會失敗. 這可以在mount時指定多個GlusterFS server來解決:
mount gfs gfs1,gfs2:/gfs /gfs -t glusterfs
這樣如果掛載時gfs1連不到, mount會自動去找gfs2來做掛載.
這也衍生出另一個議題: 如果用NFS mount? 因為NFS不了解glusterfs的ˊ特性, 也不能設定多個server, 所以會失敗, 這只能用RRDNS/heartbeat之類的方法去解決了.
正常啦, GlusterFS的特色就是把工作分給client去做嘛, 所以client不能是笨蛋啊~~~

題外話, 會做這個測試, 起因其實是因為在研究DRBD, 然後突然想到GlusterFS有類似的功能...
比較上, DRBD是做block device的複製, 而且因為檔案系統沒有處理多重存取的能力, 所以同時間只能有一台機器mount, 另一台DRBD機器變成要待命, 變成active-standby的模式.
GlusterFS是從檔案系統的層面去處理, 所以可以做到active-active, 搭配RRDNS的話, 可以做到兩台機器同時服務 (例如, 把web的檔案放在GlusterFS上, 兩台Gluster server同時兼web server)

註: 這篇是網路斷線的情況, 續篇要來測試:
1. server重開機
2. brick損毀
3. server損毀需要重灌的情形

No comments: