HDFS的其他選擇-GlusterFS in Docker的安裝記錄

HDFS的其他選擇-GlusterFS in Docker的安裝記錄

有鑑於最早時,對於hadoop的hdfs建置後,雖然對於其提供hdfs的api方便性感到相當的便利,但是苦於結合docker後,始終於無法找到”跨實體主機”的cluster建置與hadoop的備份與還原機制。(若有好心人知道也麻煩指點指點),這一點對於維運議題是不可容忍的。因此現階段我必須去找一個hdfs的替代方案…必須考慮到hdfs的特性下,我們有找到幾套方案,大如ceph,小如hdfs的落地方案都有,像是orangefs, glusterfs。而本篇,針對其資源較多的glusterfs,進行試用與評估看看。

 

GlusterFS架構如下:

在Gluster的架構下,最基本的儲存單元為brick,對於系統具體而言,就是一個可以提供客戶端掛載的一個目錄,volume則為若干個brick所組成的卷。卷是Gluster擴充操作的單元,也就是說,今天若要異地備份,那就會以卷為單位,對多台主機進行同步。而在file system的選擇下,首先考慮的情境就是可以異地備份與資料搬移,當然這中間牽扯到了一些備份機制的策略,而GlusterFs也提供了以下幾種卷類型選擇,不同的卷,就決定了不同的擴充策略,一共有3種基本卷與4種複合卷(是在點菜嗎?XD)

以下原文與圖連結:傳送門(這邊僅作一個條列的記錄)

1.distribute volume

基於hash演算法將文件分佈到所有的brick server,只是擴大了磁碟空間,不具備容錯能力。由於此模式使用本地文件系統,因此存取效率並沒有提高,相反會因為網路通訊因素讓使用效率下降,另外本地偖存設備的容量有限制,因此支持超大型文件會有一定難度。

2.stripe volume

類似 RAID0,文件分成數據塊以 Round Robin 方式分散到 brick server 上,開發顆粒度是數據塊,支持超大文件,大文件的讀寫性能高。

3.replica volume

具有容錯能力,較低的寫入效能,較高的讀取效能。Replicated模式,也稱為 AFR(Auto File Replication),相當於 RAID1,即同一文件在多個鏡像儲存節點中保存多份,每一個 replicated 子節點有著相同的目錄結構和文件,目前也是在容器儲存上最為被推崇的一種。

4. distribute stripe volume

Brick server必須是striped volume的倍數,兼具 distribute 和 stripe 的特點。分布式的条带卷,volume 中 brick 所包含的存储服务器数必须是 stripe 的倍数(>=2倍),兼顾分布式和条带式的功能。每一個文件分佈在四台共享服務器上,通常用於大文件訪問處理,最小需要4台服務器,才能創建此資料卷。

5.distribute replica volume

Brick server 數量必須是鏡像server的備數,兼具 distribute 和 replica的特點,可在2到多個節點中複製數據。volume 中 brick 所包含的儲存伺服器必須是 replica 的倍数(>=2倍)

6.stripe replica volume

類似 RAID 10,如名稱同時具備 2種特點。

7.distribute stripe replica volume

三種基本資料卷的綜合口味(咦),可用於 Map Reduce 的應用

好了,接著進入本次的主題

我們知道docker的container要溝通,若是單向的關鍵,我們可以透過link的方式來建立,例如web->db,發出連結方,必須在建立container的時候宣告這件事情。

當建立了link以後,Docker自動會在/etc/hosts建立container的alias。因此我們可以透過Docker Container的Name來進行host識別。

然而當container之間必須”互相”通訊的時候,我們沒有辦法透過link來互相指派(因為a建立時,b還沒建立,這時下link會發生b找不到)。這時就必須依賴docker network的指令

因為這一次我們要利用glusterFS /Docker試著建立2台containner,試著在這2台主機上,進行第3種基本卷的實驗試做(replicated volume)

所以先下指令建立這次container的專用網路:

建立docker網路:sudo docker network create hdfs_gluster

列出docker網路清單:sudo docker network ls

首先docker hub上已經有建立好的gluster-centos的映像檔,相當的佛心,但docker container必須考量備份檔案的機制。因此我必須要考慮要可以掛載進container的路徑

因此指令變動如下:

docker run -d \
–name gluster \
–privileged \
–net hdfs_gluster \
-v /mnt/gluster/data:/gluster \
-v /mnt/gluster/logs:/var/log/glusterfs \
-v /mnt/gluster/config:/var/lib/glusterd \
gluster/gluster-centos:latest

glusterfs需要配置的目錄有3個,data/logs,我可以清楚其用途,但config的用途與使用方式,先略過,但為了彈性,因此先掛進去

接著,因為要進行replicated volume的架構,我們還需要第2台docker container,在同一個網路下,因此指令變動如下:

docker run -d \
–name gluster2 \
–privileged \
–net hdfs_gluster \
-v /mnt/gluster2/data:/gluster \
-v /mnt/gluster2/logs:/var/log/glusterfs \
-v /mnt/gluster2/config:/var/lib/glusterd \
gluster/gluster-centos:latest

gluster docker container 內已經安裝好gluster了。因此我們可以直接透過指令,將2台docker串接

當然,我要一台一台進去設定(之後應該可以寫成shell script)

連進去每一個docker container:sudo docker exec -it gluster bash
進行相互節點串接
gluster
gluster peer probe gluster2
gluster2
gluster peer probe gluster
這兩台若在同一個docker網路下,那我們是可以直接透過docker name來連接的,若串接正常,會顯式peer probe: success的訊息

接著就是我們要建立volume,透過volumn name,我們可以透過指令隨時查詢volumn的狀態,但我們要指定2台的host與路徑,因此以我要建立一個temp_files的volume,指令如下:

建立volume:gluster volume create temp_files replica 2 gluster:/gluster/brick/temp_files gluster2:/gluster/brick/temp_files
啟動volumn:gluster volume start temp_files
啟動後,我們就可以透過以下指令,查詢到volume的相關資訊:
查詢卷狀態:gluster volume status
查詢卷資訊:gluster volume info
Volume Name: temp_files
Type: Replicate
Volume ID: 435b6c29-e360-40e5-a8da-33bf13e27463
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: gluster:/gluster/brick/temp_files
Brick2: gluster2:/gluster/brick/temp_files
Options Reconfigured:
transport.address-family: inet
我們以其中一台container,先試掛載:
mount -t glusterfs 127.0.0.1:/temp_files /test
df -h
[root@49251818a909 /]# df -h
Filesystem             Size  Used Avail Use% Mounted on
overlay                 99G   23G   72G  24% /
tmpfs                  3.9G     0  3.9G   0% /dev
/dev/vda1               99G   23G   72G  24% /gluster
shm                     64M     0   64M   0% /dev/shm
tmpfs                  3.9G  8.1M  3.9G   1% /run
127.0.0.1:/temp_files   99G   23G   72G  24% /test
tmpfs                  783M     0  783M   0% /run/user/0
試著寫入一個檔案與變動該檔案
echo “Hello” > /test/file.txt
mv /test/file.txt /test/file2.txt
我們可以在兩個volume節點的container中在2邊的目錄中發現,不論你對於掛載點上的目錄內的檔案做任何變動,2邊的目錄都會同步
當然我們可以直接檢查,我們掛載到docker container的目錄,會發現data下面已經建立了brick目錄與剛剛我們的volume名稱,只要”是透過mount point”更動的檔案,都會直接同步到所有的節點。註:我試過直接docker外,在volumn掛載的目錄變動檔案,是不會同步的,因此必須透過glusterfs的介面,才有辦法偵測到變動
ls /mnt/gluster/data/brick/temp_files
ls /mnt/gluster2/data/brick/temp_files/
          會看的到效果。
既然已建立了hdfs的架構,那未來如何應用在application端呢?透過hadoop,針對目錄的增修刪查,其實是有其管道與方法。可以透過webhdfs的rest api介面進行異動。然而這其實不在Gluster的處理範圍內,因為Gluster主要還是在處理檔案系統的細節。而我們還是可以例如透過封裝對檔案系統的操作api,變成一個服務供外部呼叫,而雖然同樣是做寫檔案讀檔案的動作,但已經是一個高可用性、擴充性的hdfs檔案系統了。
延伸使用(傳送門,原參考文)
實作 1: 原 brick 位置重做 volume
@ 任一 server
# umount /test
# gluster volume stop temp_files
# gluster volume delete temp_files
# gluster volume create temp_files replica 2 gluster:/gluster/brick/temp_files gluster2:/gluster/brick/temp_files force
volume create: temp_files: failed: /gluster/brick/temp_files or a prefix of it is already part of a volume
@ server 1 & server 2
# setfattr -x trusted.glusterfs.volume-id /gluster/brick/temp_files
# setfattr -x trusted.gfid /gluster/brick/temp_files
# rm -rf /gluster/brick/temp_files/.glusterfs
@ 任一 server
# gluster volume create temp_files replica 2 gluster:/gluster/brick/temp_files gluster2:/gluster/brick/temp_files force
# gluster volume start temp_files
# mount -t glusterfs 127.0.0.1:/temp_files /test
# find /test
實作 1: 原 brick 位置重做 volume
實作 2: 解除 GlusterFS
@ 任一 server
# umount /test
# gluster volume stop temp_files
# gluster volume delete temp_files
@ server 1
# gluster peer detach gluster2
@ server 2
# gluster peer detach gluster
@ server 1 & server 2
# service glusterd stop
# setfattr -x trusted.glusterfs.volume-id /gluster/brick/temp_files
# setfattr -x trusted.gfid /gluster/brick/temp_files
# rm -rf /gluster/brick/temp_files/.glusterfs
實作 2: 解除 GlusterFS
實作 3: 以 server 1 現有資料做 GlusterFS
@ server 1
# gluster peer probe gluster2
@ server 2
# gluster peer probe gluster
@ server 1 & server 2
# mkdir -p /gluster/brick/www_files
@ server 1
# mount --bind /var/www /gluster/brick/www_files
@ 任一 server
# gluster volume create www_files replica 2 gluster:/gluster/brick/www_files gluster2:/gluster/brick/www_files force
# gluster volume start www_files
@ server 2
# mount -t glusterfs 127.0.0.1:/www_files /var/www
# find /var/www
實作 3: 以 server 1 現有資料做 GlusterFS
開機自動掛載:
@ server 1
# vi /etc/fstab
/var/www /gluster/brick/temp_files none bind 0 0
@ server 2
# vi /etc/fstab
127.0.0.1:/temp_files /var/www glusterfs defaults 0 0


加速資料移轉:
@ 任一 server
# gluster volume set temp_files performance.write-behind-window-size 512MB
# gluster volume set temp_files performance.cache-size 512MB
其他
參考資料:
https://wiki.centos.org/zh-tw/HowTos/GlusterFSonCentOS#head-888bf6b82e1922f9de16cc4e9adf00501c4c2c98
https://www.ibm.com/developerworks/cn/opensource/os-cn-glusterfs-docker-volume/index.html
http://jamyy.us.to/blog/2014/03/6220.html

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *