【4.分佈式存儲】-文件存儲概述(GFS/TFS/Dynamo/megastore/spanner)

本篇概述了常見分佈式存儲,包括文件系統,KV系統,數據庫的最主要特性。Dynamo分佈式理論涉及較多。不過這個文章就是看過不少個以後總結的小點。node

分佈式文件系統

GFS

chunck服務器:按照每一個chunck受權剛給CS租約成爲主chuck(多副本都成功才行),chunck內部修改
客戶端 庫文件形式,從master獲取路由,直接訪問chunck服務器,緩存元數據
master 元信息,全部控制(chubby主備),文件到chunck仍是在主
文件追加:流水線;分離數據流和控制流。S1,S2,S3,1,2同機房,控制流1=》2=》3而不是1=》3=》2mysql

clipboard.png

master單點瓶頸?
每一個chuck 64M(通常都是大文件,K~M,id爲64b),3份,壓縮後chunk元數據小於64B。1PB:1PB3/64M64=3G。
chunck分配,遷移,負載均衡都要限速。分配:磁盤利用率低+最近頻次防止壓垮+多機架分配
——————sql

TFS

寫少讀多,每次修改在master無壓力
小文件問題。讀目錄超級快,inode,實際內容=》邏輯圖片共享一個物理文件,拋棄目錄樹,直接blockid+offset定位。
去重:單獨鍵值系統MD5
客戶端返回帶着blockiid去nameserver查機器。再帶着offset去機器定位
——————數據庫

haystack 2000億圖片

haystack目錄(照片id到物理卷軸路由)=》haystack物理卷軸100G,只追加(單機元數據內存中,每一個佔用20字節:8T/80K*20=2g)
目錄量太大,memcache+mysql sharing集羣
——————
CDN
L1chache->l2chache->服務器自己cache->tfs。LVS+NGINX=》
——————————
上述基本都是單層路由。若不夠能夠兩層緩存

——————————————————————————————服務器

分佈式KV

clipboard.png

數據分佈和負載均衡:自治gossip,種子節點
若機器被斷定臨時失效,選一臺機器新數據分到這兒,恢復後將數據回傳。若永久失效,則進行數據同步,利用merkle樹(每一段一個merkle樹,只須要同步從根到葉子節點不一樣的,葉子節點爲文件內容的hash值,非葉子節點爲其子節點組合的hash值)
NWR機制:N爲副本數量,W爲寫至少幾份,R爲讀至少幾份。R讀出來有多份狀況,衝突用向量時鐘由客戶端解決或者覆蓋,異步讀取覆蓋
——————————————————————————————架構

分佈式table

dbproxy

clipboard.png

proxy:解析dql,路由,讀寫分離,排序,分組
zk:維護db路由,選主
常駐進程:實時監控等
擴容:成倍擴
——————————併發

bigtable

數據:每行的每個列(或列簇)構成一個cell
架構:在GFS上添加一層分部署索引層+chubby分佈式鎖
客戶端:從chubby獲取元數據,與子表直連(緩存和prefetch。過時須要取六次,正常三次)
master:分配子表給子表服務器,指揮合併/分裂/監控/負載均衡/故障恢復(只有主在chubby的互斥鎖失效才能切換)
子表:
chubby:保整隻有一個master,配合master發現子表,存儲訪問控制信息(兩地三數據中心五副本)
元數據也存表中,二級:子表128M,元信息1K。量級:(128M128m/1k)128m/1k=2048PB。引導信息(根表位置)=》根表=》元數據(子表位置,sstable及操做日誌文件編號,日誌回放點)
複製一致(全局惟一id去重)與容錯(按期檢查鎖有木有問題之類的)。單機存儲:sst(想爲啥分多層就是寫入更快,合併怕影響,寫少的話一層,都的話多層)
————————————oracle

megastore

在bigtable上支持sql
客戶端:映射操做,事務,併發控制,基於paxos的複製,請求發送給複製服務器
複製服務器:接收客戶端請求轉發到所在機房的biftable實例(用於解決跨機房鏈接數過多問題)
協調者:存儲是否處於最新狀態,用於實現快速讀
事務:redolog寫完就能夠算成功,若寫失敗讀以前要回放。誇實體組用兩階段+分佈式隊列
寫事務流程:同一實體組樂觀鎖串行化(同一實體組同時更新少,同一個uid之類的)負載均衡

clipboard.png

協調者單點(從chubby獲取鎖,失效忽略協調者)
單副本,協調者較複雜,SSD不支持,只有實體組內部ACID

————————————
spanner
數據模型。主表包含附表。好比

clipboard.png

部署:協調者(主備,paxos),參與者(主備,paxos)
同步:
每一個子表上運行一個paxos狀態機,主副本默認壽命10s
全局事務id:oracle數據庫生成,谷歌時鐘器,會返回偏差-4~4e,時間每一個都加4e便可

事務讀寫:誇paxos組兩階段提交:prepare:客戶端發往多個paxos,協調者主發起prepaare協議,參與者主須要鎖住數據。commit:協調者主發起commit,參與者主執行提交併解除鎖定數據,當前時間戳做爲提交版本

相關文章
相關標籤/搜索