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進行相互節點串接glustergluster peer probe gluster2gluster2gluster peer probe gluster
接著就是我們要建立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
查詢卷狀態:gluster volume status查詢卷資訊:gluster volume info
mount -t glusterfs 127.0.0.1:/temp_files /testdf -h
echo “Hello” > /test/file.txtmv /test/file.txt /test/file2.txt
ls /mnt/gluster/data/brick/temp_filesls /mnt/gluster2/data/brick/temp_files/