在演講現場,周淵分析道,軟件定義存儲這個概念大家都在談,但僅靠幾個名詞很難有深入的理解,對此給大家分享一個英特爾實際在做的關于對象存儲的項目,希望能對大家有幫助。首先是關于對象存儲的一些基本概念,大家可能理解最多是本地文件系統(tǒng),比如本地的一塊硬盤格式化成NTFS,向應用程序提供了Posix接口,然后是傳統(tǒng)的分布式文件系統(tǒng),也會向應用程序提供Posix接口。而對象存儲有所不同,通常來說一個對象存儲,首先會有一套RESTful 的接口,然后是一個代理/控制節(jié)點,主要做關于數據定位,最后面就是真正的存儲節(jié)點,用于存儲數據。與傳統(tǒng)的文件系統(tǒng)比,最大的差別在接口。
另一方面,值得注意的是對象存儲系統(tǒng)持久性,通常有三種機制,第一種就是說對于非常“熱”的數據可以用副本機制,對冷一點數據可以應用糾刪碼機制,實際情況中采用混合的方案:既有冷數據也有熱數據。這里其實也可以理解為是一個區(qū)分的服務等級,“比方說你給我最多錢就讓你用三副本的形勢來存儲。”對象存儲在過去幾年時間里面發(fā)展非???,Amazon S3已經有2萬億數據,每秒鐘請求數有110萬。
Erasure Coding很早就出現了,一直在不同的領域變動進化。實際上,其基本思想是,把數據切割成小塊的形式,再對這些小塊數據計算校驗碼得出校驗塊,這樣當原始數據塊丟失時,可以通過校驗塊計算出原始數據,于是可以容忍一定程度上的數據丟失??偨Y來說就是用CPU資源節(jié)省存儲資源。英特爾對此專門來做存儲相關的一個庫,提供英特爾® 架構上erasure code,壓縮等的支持,從實驗數據來看,這個庫性能是很不錯的,我們也正嘗試把它開源。現在這個項目也利用了這個庫在Swift里面支持Erasure Coding。
對于Swift來說,可以這么理解,它是Amazon S3的替代品。最早是由Rackspace共享出來給OpenStack提供存儲對象的一個項目。首先它有一個RESTful的接口來訪問,其提供container模型來組織對象,針對非機構化數據來提供最終一致性。當然最重要的一點就是說它提供了一個很好的擴展性:可以用最普通的硬件組建的服務器就可以把它擴展好。比較具體一點來說Swift 里有個Ring的概念,Ring是一組內部的一致性hash表。當大家在硬盤上存儲數據的時候,Swift通過Ring里的算法,可以保證三個副本放在盡可能不同的位置,不同副本之間盡量不產生影響,同時后臺會有一些不同的進程來維護一致性。值得注意的是,Swift不是分布式文件系統(tǒng),不提供Posix的接口,不支持ACID語義操作,不是NoSQL數據存儲,不提供對塊級別存儲服務。
從總體來看,Swift分成幾個部分,最前面它有Proxy節(jié)點負責處理所有的請求,并將請求發(fā)至后端存儲節(jié)點去訪問真實數據。Swift的結構很清晰,里面正好有一個proxy,像一個程序的入口出口一樣,所以英特爾考慮在這個節(jié)點上做文章,在讀寫請求做Erasure code編解碼。然后以Container為模型來組織數據,通過container的元數據(metadata)來識別其中的對象是否被編碼過。這和現有Swift架構保持一致,還可以同時支持線上和線下的Erasure code。通過更加靈活的配置及優(yōu)化策略,可以更好地做一個Tiering的解決方案,在這里英特爾更多是定義好一個機制而非策略,策略可以根據用戶自己的需要去定義。
基于現有的完整性框架,需要加入一定服務進去來保證編碼數據的完整性,這些代碼都盡量以增量的形式加入,這樣有利于用戶從一些線上服務升級。比如用戶用的是E或者G比較老的版本,現在就可以無故障升級。從Swift糾刪碼(EC)高層架構來看,最后實現就是一個混合存儲方案,同時支持多副本和Erasure coding。比方當是三副本的時候就要存三副本,當是Erasure code時候就要去存Erasure code,同時在這里還定義了Erasure coding interface,這也是另外一個英特爾和Box合作的一個開源項目。并且在Swift中對此也有類似一些修改,主要是增加支持Erasure code plugin的相關模塊。
最主要的修改是引入了多個對象Ring來支撐多種存儲方案,也就是多副本和Erasure coding并存。在Erasure coding的Ring中,重用現有的副本存放位置算法,可以保證各個數據塊與代碼塊盡可能分開存放。這樣可以建立多種存儲策略的基礎??梢韵胂笞罱K得到一個成品,就是說有些objects是用Erasure code存儲的,有些則是多副本的形式存放。
其次是關于Erasure Code庫的接口,英特爾和Box合作定義了云存儲中編解碼需要的接口,可以支持多種編解碼形勢。英特爾又加入后臺進程來保證完整性。后臺有一個審計員在不斷進行MD5校驗,如果數據已經被損壞了則直接進行隔離。同時會有一個reconstructor來進行數據恢復,當發(fā)現有數據片丟失,需要從還存在的數據片中讀取數據并嘗試恢復,并將恢復得數據寫回到硬盤上去。大概所需要做的修改就是這樣幾個部分。
當EC加入Swift以后,讀寫流程會有一些變化。當寫入數據時,其會被切片,一部分數據加一部分較驗,這些塊通過Ring分散到后端的存儲節(jié)點上。然后當去讀的時候,首先去找原始數據切片,如果全部都在,則合并數據并返回給Client;如果發(fā)現有數據片丟失的情況,需要通過校驗碼恢復原始數據片,再把重新拼起來。
總結來說,對象存儲是云計算及大數據的關鍵技術。糾刪碼(Erasure code)技術可以有效降低在分布式存儲的成本支出。同時,Swift作為OpenStack核心項目得到越來越多的重視。英特爾也在同開源社區(qū)通力合作幫助OpenStack Swift糾刪碼的更好實現。(阿明)