1. 程式人生 > >Glusterfs解析之分散式(dht)原理和缺陷

Glusterfs解析之分散式(dht)原理和缺陷

目錄
GlusterFS之分散式(Distribute )分析
1   GlusterFS分散式概念(應用場景)
1.1   誰發現了哪些問題,導致需要GlusterFS分散式?(who)
1.2什麼地方發現了問題,導致需要GlusterFS分散式?(who)
1.3什麼時間發現了問題,導致需要GlusterFS分散式?(when)
1.4GlusterFS檔案系統出現了什麼問題,導致需要分散式解決方案?(what)
1.5為什麼說這個問題是一個問題?(why)
1.6GlusterFS分散式實現思想和方案?(how)
1.7如果沒dht問題程度有多大,使用dht付出代價有多大?(how much)
1.8使用dht效果如何,使用者體驗和滿意程度有多大?(how feel)
1.9Dht在監控系統中的應用場景(實際應用)
2   Dht資料流(這裡說nfs,pfs類似)
2.1拓撲結構
2.1.1分散式卷資訊
2.1.2客戶端nfs堆疊資訊
2.2   fop業務資料流
2.2.1dht預設軟體選項(init)
2.2.2create:在某個目錄下,建立一個檔案。
2.2.3mkdir:建立一個路徑。
2.2.4readdir:讀取路徑下檔案
2.2.5writev:寫檔案
2.2.6readv:讀取檔案
2.2.7rename:檔案重新命名(演示最複雜的的一種過程)
2.3   dht自修複數據流
2.3.1dht路徑修復依據
2.3.2路徑修復流程
3   軟體表項
4   Dht原始碼分析
4.1   程式碼目錄結構
5   Dht效能評估
6   Dht缺陷評估
6.1   Brick離線
7   Dht修復缺陷策略
7.1   create建立檔案操作:
7.2mkdir建立資料夾操作
7.3mknod建立裝置檔案操作
8   修復缺陷策略風險
8.1同名檔案並存

1GlusterFS分散式概念(應用場景)
1.1誰發現了哪些問題,導致需要GlusterFS分散式?(who)
1.2什麼地方發現了問題,導致需要GlusterFS分散式?(who)
1.3什麼時間發現了問題,導致需要GlusterFS分散式?(when)
1.4GlusterFS檔案系統出現了什麼問題,導致需要分散式解決方案?(what)
1.5為什麼說這個問題是一個問題?(why)
1.6GlusterFS分散式實現思想和方案?(how)
1.7如果沒dht問題程度有多大,使用dht付出代價有多大?(how much)
1.8使用dht效果如何,使用者體驗和滿意程度有多大?(how feel)
1.9Dht在監控系統中的應用場景(實際應用)

2Dht資料流(這裡說nfs,pfs類似)

2.1拓撲結構



2.1.1分散式卷資訊
[[email protected] ~]# gluster volume info
 
Volume Name: dht_vol
Type: Distribute
Volume ID: ad0d4705-86e0-4980-a87d-38ec2b0e04aa
Status: Started
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: 192.168.10.247:/vol/brick1
Brick2: 192.168.10.248:/vol/brick1

2.1.2客戶端nfs堆疊資訊:
volume dht_vol-client-0
    type protocol/client
    option send-gids true
    option password 2bbcc98c-b280-4dbd-95a5-aa339cd30d0b
    option username c4f9ed25-8a18-44bd-bcf7-69230bc90335
    option transport-type tcp
    option remote-subvolume /vol/brick1
    option remote-host 192.168.10.247
end-volume

volume dht_vol-client-1
    type protocol/client
    option send-gids true
    option password 2bbcc98c-b280-4dbd-95a5-aa339cd30d0b
    option username c4f9ed25-8a18-44bd-bcf7-69230bc90335
    option transport-type tcp
    option remote-subvolume /vol/brick1
    option remote-host 192.168.10.248
end-volume

volume dht_vol-dht
    type cluster/distribute
    subvolumes dht_vol-client-0 dht_vol-client-1
end-volume

volume dht_vol-write-behind
    type performance/write-behind
    subvolumes dht_vol-dht
end-volume

volume dht_vol
    type debug/io-stats
    option count-fop-hits off
    option latency-measurement off
    subvolumes dht_vol-write-behind
end-volume

volume nfs-server
    type nfs/server
    option nfs3.dht_vol.volume-id ad0d4705-86e0-4980-a87d-38ec2b0e04aa
    option rpc-auth.addr.dht_vol.allow *
    option nfs.drc off
    option nfs.nlm on
    option nfs.dynamic-volumes on
    subvolumes dht_vol
end-volume

2.2fop業務資料流
2.2.1dht預設軟體選項(init)
subvol_cnt=2
subvolumes[0]=protocol/client.dht_vol-client-0
file_layouts[0].cnt=1
file_layouts[0].preset=1
file_layouts[0].gen=0
subvolume_status[0]=1
subvolumes[1]=protocol/client.dht_vol-client-1
file_layouts[1].cnt=1
file_layouts[1].preset=1
file_layouts[1].gen=0
subvolume_status[1]=0
search_unhashed=1
gen=3
min_free_disk=10.000000
min_free_inodes=5.000000
disk_unit=p
refresh_interval=0
unhashed_sticky_bit=0
du_stats.avail_percent=80.000000
du_stats.avail_space=31865081856
du_stats.avail_inodes=92.000000
du_stats.log=0

option unhashed-sticky-bit using default value off(粘住位(S_ISVTX))
option use-readdirp using default value on
option directory-layout-spread not set
option assert-no-child-down using default value off
option readdir-optimize using default value off
using regex rsync-hash-regex = ^\.(.+)\.[^.]+$
option xattr-name using default value

2.2.2create:在某個目錄下,建立一個檔案。
1:建立一個test_file檔案
 

 
抓包可以看出通過了四次協議通訊:
1)lookup檢視檔案test_file是否存在;
2)nfs回覆不存在;
3)建立test_file請求;
4)建立成功,並返回filehandle;
5)Nfs控制訪問請求列表查詢;
6)返回通過
7)設定檔案屬性請求
8)返回成功

2:dht之lookup操作資料流
 

3:dht之create操作資料流
 

4:dht之setattr操作資料流


2.2.3mkdir:建立一個路徑。
1:建立一個test_file檔案
 

抓包可以看出通過了四次協議通訊:
1)access檢視父目錄的許可權。
2)回覆read、lookup、modify、extend、delete值都為1,都允許。
3)建立目錄dir_test1請求;
4)建立成功,並返回filehandle;

2:dht之access操作資料流
 


2:dht之mkdir操作資料流
 

2.2.4readdir:讀取路徑下檔案


 
2.2.5writev:寫檔案
link檔案的檔案屬性:
 

遷移資料中的檔案屬性:
 

Writev流程:
 

2.2.6readv:讀取檔案
遷移資料中的檔案屬性:

 

資料流:
 

2.2.7rename:檔案重新命名(演示最複雜的的一種過程)

節點247:


 
節點248:

 

檔案重新命名操作



節點247:


節點248:
 

資料流:
 
 
2.3dht自修複數據流
2.3.1dht路徑修復依據
1:檔案hash值出現空洞;
2:檔案hash值出現迭代
3:有一個brick對應的檔案路徑不存在

2.3.2路徑修復流程
資料夾缺失修復後的檔案屬性:

 


 

修復資料流


 
3軟體表項

4Dht原始碼分析
4.1程式碼目錄結構
 
Dht.c:glusterfs是基於堆疊結構的,擴充套件性很強,但是堆疊的每一層都需要依照一個固定的模式框架,包括class_methods_t class_methods(init,fini,reconfigure,notify)、struct xlator_fops fops、struct xlator_dumpops dumpops、struct xlator_cbks cbks等。該檔案就是存放glusterfs堆疊架構;
dht-shared.c:存放了option配置資訊,實現init和finit函式,重新配置dht功能函式,檢視dht相關資訊功能函式;
dht-common.c:實現了dht.c中定義的所有dht相關的檔案操作和notify函式;
dht-diskusage.c:存放了dht下子卷相關的儲存節點的儲存空間使用情況收集,判斷某個卷磁碟空間是否已經被塞滿;找出可用磁碟空間最多的卷;
dht-hashfn.c:使用Davies-Meyer演算法,通過檔案完整路徑計算獲得hash值。
dht-selfheal.c:檔案路徑修復相關函式。
5Dht效能評估

6Dht缺陷評估
6.1Brick離線
1:在Glusterfs檔案系統中,dht最核心的思想是彈性hash。建立一個檔案或者資料夾時,dht預設通過Davies-Meyer演算法,算出該檔案或資料夾放在哪個brick上,但如果此時對應的brick處於離線的狀態,這時檔案或資料夾就無法存入了,將返回對應錯誤。
 

2:在Glusterfs檔案系統中,假設當一個brick掉線,操作刪除一個檔案路徑;掉線的brick重新上線時,瀏覽父目錄則觸發檔案路徑修復,也就是資料夾修復,該資料夾是brick掉線後被刪除的,所以其他brick則通過檔案路徑修復又會恢復回來,則之前操作刪除一個資料夾就相對於失效了,這顯然是不合理的,所以在Glusterfs檔案系統中,如果一個節點掉線時,這時是無法刪除任意一個資料夾。
當一個或一個以上的節點掉線,刪除資料夾的操作將會返回io_error。


3:在Glusterfs檔案系統中,如果雜湊算出的brick存在link檔案,這時無法建立該檔案。

 



7Dht修復缺陷策略
7.1create建立檔案操作:
根據檔名帶入hash演算法,得到hash值對應的brick,這時先判斷該brick是否線上,如果是離線的則找到一個隨機的起始brick,迴圈查詢到一個可用的brick(線上且磁碟有空閒空間)。



7.2mkdir建立資料夾操作
根據資料夾名帶入hash演算法,得到hash值對應的brick,這時先判斷該brick是否線上,如果是離線的則找到一個隨機的起始brick,迴圈查詢到一個可用的brick(線上),離線brick上線後會進行檔案路徑修復。
 

7.3mknod建立裝置檔案操作
不作修改。

8修復缺陷策略風險
8.1同名檔案並存

 

讀寫同名檔案,以對應inode的快取決定讀取或寫入哪個brick檔案。一般情況下快取是在lookup的時候寫入inode快取索指向的brick,所有一般是xlator堆疊的最後一個client對應的brick的檔案。

相關推薦

Glusterfs解析分散式(dht)原理缺陷

目錄 GlusterFS之分散式(Distribute )分析 1   GlusterFS分散式概念(應用場景) 1.1   誰發現了哪些問題,導致需要GlusterFS分散式?(who) 1.2什麼地方發現了問題,導致需要GlusterFS分散式?(who) 1.3什麼時

java併發 CopyOnWriteArrayList的原理使用方法

描述 CopyOnWriteArrayList:CopyOnWriteArrayList這是一個ArrayList的執行緒安全的變體,其原理大概可以通俗的理解為:初始化的時候只有一個容器,很常一段時間,這個容器資料、數量等沒有發生變化的時候,大家(多個執行緒),都是讀取(假設這段時間裡只

Java多執行緒Condition實現原理原始碼分析(四)

章節概覽、 1、概述 上面的幾個章節我們基於lock(),unlock()方法為入口,深入分析了獨佔鎖的獲取和釋放。這個章節我們在此基礎上,進一步分析AQS是如何實現await,signal功能。其功能上和synchronize的wait,notify一樣。

分散式爬蟲原理分散式爬蟲原理

我們在前面已經實現了Scrapy微博爬蟲,雖然爬蟲是非同步加多執行緒的,但是我們只能在一臺主機上執行,所以爬取效率還是有限的,分散式爬蟲則是將多臺主機組合起來,共同完成一個爬取任務,這將大大提高爬取的效率。一、分散式爬蟲架構在瞭解分散式爬蟲架構之前,首先回顧一下Scrapy的

Hadoop1.X mapreduce原理缺陷

MapReduce的簡介: MapReduce是一個軟體框架,客房部件的編寫應用程式,一併行的方式在數千商用硬體組成的叢集節點中處理TB級的資料,並且提供了可靠性和容錯的能力。 MapReduce

【Oracle 叢集】ORACLE DATABASE 11G RAC 知識圖文詳細教程RAC 工作原理相關元件(三)

概述:寫下本文件的初衷和動力,來源於上篇的《oracle基本操作手冊》。oracle基本操作手冊是作者研一假期對oracle基礎知識學習的彙總。然後形成體系的總結,一則進行回顧複習,另則便於查詢使用。本圖文文件亦源於此。閱讀Oracle RAC安裝與使用教程前,筆者先對這篇文章整體構思和形成進行梳理。

雜湊表簡易數學原理簡易實現(史上最簡單易懂的雜湊表介紹)

       什麼是雜湊表呢? 我先不說, 但其思想確實厲害。 下面, 我以最簡單易懂的方式來介紹雜湊表。        你要是去看教科書啊, 還沒有理解雜湊表的原理, 他就給你介紹近10種防衝突的方法, 這就是中國的教育。 你要是去網上搜點資料問為什麼雜湊表查詢的時間複雜

Java多執行緒ThreadPoolExecutor實現原理原始碼分析(五)

章節概覽、 1、概述 執行緒池的顧名思義,就是執行緒的一個集合。需要用到執行緒,從集合裡面取出即可。這樣設計主要的作用是優化執行緒的建立和銷燬而造成的資源浪費的情況。Java中的執行緒池的實現主要是JUC下面的ThreadPoolExecutor類完成的。下面

Java多執行緒ReentrantLock實現原理原始碼分析(二)

章節概覽、 1、ReentrantLock概述 ReentrantLock字面含義是可重入的互斥鎖,實現了和synchronize關鍵字一樣的獨佔鎖功能。但是ReentrantLock使用的是自旋鎖,通過CAS硬體原語指令實現的輕量級的鎖,不會引起上下文切換

Android進階——效能優化佈局渲染原理底層機制詳解(四)

引言 UI 全稱User Interaction,我第一次聽到這個名詞是在大學的時候,當時候上人機互動課,我們教授說他認為iPhone的i 就是代表Interaction的意思,暫且不必爭辯是非。回到我們軟體開發中來,UI是使用者感知與互動的第一且唯一的途徑,

原始碼解析HashMap實現原理

目錄 二,栗子 一,寫在前面 在日常開發中,HashMap因其可以儲存鍵值對的特點經常被使用,僅僅知道如何使用HashMap是遠遠不夠的。以知其然知其所以然的鑽研態度,本篇文章將以圖文,原始碼的方式去解析HashMap的實現原理。 二,栗子

Spring源碼解析事件派發器監聽器

內部 ESS over 一個 framework processor spring abstract sharp 1、監聽器實現   實現ApplicationListener接口: import org.springframework.context.Applic

GoNSQ簡介,原理使用

#### NSQ簡介 > [NSQ](https://nsq.io/)是Go語言編寫的一個開源的實時分散式記憶體訊息佇列,其效能十分優異。 > > NSQ 是實時的分散式訊息處理平臺,其設計的目的是用來大規模地處理每天數以十億計級別的訊息。它具有分散式和去中心化拓撲結構,該結構具有無單點故障、故障容錯、高

ElasticSearch 學習記錄 分散式文件儲存往ES中存資料取資料的原理

分散式文件儲存 ES分散式特性 遮蔽了分散式系統的複雜性 叢集內的原理 垂直擴容和水平擴容 真正的擴容能力是來自於水平擴容–為叢集新增更多的節點,並且將負載壓力和穩定性分散到這些節點中 ES叢集特點 一個叢集擁有相同

Dubbo原理原始碼解析服務暴露

github新增倉庫 "dubbo-read"(點此檢視),集合所有《Dubbo原理和原始碼解析》系列文章,後續將繼續補充該系列,同時將針對Dubbo所做的功能擴充套件也進行分享。不定期更新,歡迎Follow。 一、框架設計 在官方《Dubbo 使用者指南》架構部分,給出了服務呼叫的整體架構和

Dubbo原理原始碼解析標籤解析

github新增倉庫 "dubbo-read"(點此檢視),集合所有《Dubbo原理和原始碼解析》系列文章,後續將繼續補充該系列,同時將針對Dubbo所做的功能擴充套件也進行分享。不定期更新,歡迎Follow。 一、Dubbo 配置方式 Dubbo 支援多種配置方式: XML 配置:基於

Dubbo原理原始碼解析“微核心+外掛”機制

private void loadFile(Map<String, Class<?>> extensionClasses, String dir) { //...... BufferedReader reader = new BufferedReader(new

Dubbo原理原始碼解析服務引用

github新增倉庫 "dubbo-read"(點此檢視),集合所有《Dubbo原理和原始碼解析》系列文章,後續將繼續補充該系列,同時將針對Dubbo所做的功能擴充套件也進行分享。不定期更新,歡迎Follow。 一、框架設計 在官方《Dubbo 開發指南》框架設計部分,給出了引用服務時序圖:

Glusterfsnfs模組原始碼分析(上)nfs原理協議

歡迎大家相互交流,共同提高技術。 一、網路檔案系統概述 Sun Microsystems公司於1984年推出了一個在整個計算機工業中被廣泛接受的遠端檔案存取機制,它被稱為Sun的網路檔案系統(Network File System),或者簡稱為NFS。該機制允許在一

分散式系統 (大規模分散式系統原理解析架構實踐)

分散式系統的基礎理論: 分散式系統:多臺機器通過網路連線在一起,作為一個整體為上層提供服務。 一、基礎理論知識:資料分佈、複製、一致性、容錯。 1、異常 (1)伺服器宕機(記憶體錯誤,伺服器停電):如