PNUTS分布式的數(shù)據(jù)存儲平臺
Yahoo!的PNUTS是一個(gè)分布式的數(shù)據(jù)存儲平臺,它是Yahoo!云計(jì)算平臺重要的一部分。它的上層產(chǎn)品通常也稱為Sherpa。按照官方的 描述,”PNUTS, a massively parallel and geographically distributed database system for Yahoo!’s web applications.” PNUTS顯然就深諳CAP之道,考慮到大部分web應(yīng)用對一致性并不要求非常嚴(yán)格,在設(shè)計(jì)上放棄了對強(qiáng)一致性的追求。代替的是追求更高的 availability,容錯(cuò),更快速的響應(yīng)調(diào)用請求等。
1. PNUTS簡介及特點(diǎn)
- 地理分布式,分布在全球多個(gè)數(shù)據(jù)中心。由于大部分Web應(yīng)用都對響應(yīng)時(shí)間要求高,因此最好服務(wù)器部署在離用戶最近的本地機(jī)房。
- 可擴(kuò)展,記錄數(shù)可支持從幾萬條到幾億條。數(shù)據(jù)容量增加不會影響性能。
- schema-free,即非固定表結(jié)構(gòu)。實(shí)際使用key/value存儲的,一條記錄的多個(gè)字段實(shí)際是用json方式合并存在value中。因此delete和update必須指定primary key。但也支持批量查詢。
- 高可用性及容錯(cuò)。從單個(gè)存儲節(jié)點(diǎn)到整個(gè)數(shù)據(jù)中心不可用都不會影響前端Web訪問。
- 適合存相對小型的記錄,不適合存儲大文件,流媒體等。
- 弱一致性保證。
傳統(tǒng)的數(shù)據(jù)庫提供強(qiáng)一致性保證, 通常稱為“serialization transaction”,保證調(diào)用時(shí)序的一致性。但在web應(yīng)用中不是必須,比如用戶A修改了自己的資料或上傳了圖片,他的好友B短時(shí)間不能立即看到并 不是大的問題,通常的Web應(yīng)用都可以接受。PNUTS像大部分分布式key/value系統(tǒng)類似,提供的是弱一致性的支持,也就是支持“最終一致性 (eventually consistent)”。用戶B最終會看到用戶A的修改信息。
未夠!但最終一致性并非可以適應(yīng)所有場合,比如用戶A修改了相冊的訪問權(quán)限,設(shè)置用戶C不能訪問,然后用戶A又上傳了新的圖片,如果用戶C處于另外 一個(gè)IDC訪問,如果圖片數(shù)據(jù)先同步成功,而權(quán)限記錄后同步的話,C實(shí)際上違反了A設(shè)置的權(quán)限而看到圖片了。因此對于部分場合最終一致性是不夠的。
2. PNUTS實(shí)現(xiàn)
2.1 Record-level mastering 記錄級別主節(jié)點(diǎn)
每一條記錄都有一個(gè)主記錄。比如一個(gè)印度的用戶保存的記錄master在印度機(jī)房,通常修改都會調(diào)用印度。其他地方如美國用戶看這個(gè)用戶的資料調(diào)用 的是美國數(shù)據(jù)中心的資料,有可能取到的是舊版的數(shù)據(jù)。非master機(jī)房也可對記錄進(jìn)行修改,但需要master來統(tǒng)一管理。每行數(shù)據(jù)都有自己的版本控 制,如下圖所示。
2.2 PNUTS的結(jié)構(gòu)
2.3 Tablets尋址與切分
2.4 API訪問
- Read-any 讀取的版本有可能是舊的,返回本地IDC的數(shù)據(jù),不檢查最新版本,性能最好。
- Read-critical(required_version) 讀取指定版本,用戶修改資料之后調(diào)用返回比當(dāng)前版本更新的版本,以保證當(dāng)前用戶看到的不是修改前的記錄。
- Read-latest 強(qiáng)制讀取最新,可能需要執(zhí)行遠(yuǎn)程IDC調(diào)用。比如上面例子介紹的讀取權(quán)限列表的調(diào)用。
- Write 比如更新用戶資料
- Test-and-set-write(required version) 只有當(dāng)記錄屬于指定的版本才執(zhí)行write,比如更新用戶積分等業(yè)務(wù),這個(gè)調(diào)用有點(diǎn)類似以前介紹的atom操作。
Write調(diào)用示意圖
3. PNUTS疑問
記錄級別master的問題,比如master選取如何達(dá)到效率最佳,如何面對2個(gè)修改合并沖突?合并沖突據(jù)說是需要client自行來處理,
這篇Details on Yahoo’s distributed database提 到的平均調(diào)用latency 100ms的問題。web應(yīng)用通常對每次數(shù)據(jù)的訪問最好在10ms之內(nèi)完成,因?yàn)槊總€(gè)web頁面實(shí)際上不止一個(gè)數(shù)據(jù)訪問的調(diào)用,經(jīng)常調(diào)用10次以上db的 訪問的頁面并不少見,因此如果平均latency在100ms以上那勢必影響頁面加載速度。不過yahoo!的開發(fā)人員回復(fù)paper中的數(shù)據(jù)實(shí)際是一個(gè) 老版本的測試,目前的版本,在實(shí)際生產(chǎn)環(huán)境的pnuts的latency會在10ms以下。
另外PNUTS為什么要用消息系統(tǒng)代替replication/undo log?有何優(yōu)點(diǎn)?
4. PNUTS感悟
Web應(yīng)用使用通用的存儲服務(wù)是大勢所趨,類似BigTable, Amazon Dynamo/SimpleDB這樣的方案,但是目前除非使用Amazon提供的商用SimpleDB之外幾乎沒有通用的解決方案,每個(gè)公司甚至每個(gè)項(xiàng)目 需要面對及考慮數(shù)據(jù)規(guī)模增大的問題。比如初步統(tǒng)計(jì)下國內(nèi)研究可擴(kuò)展數(shù)據(jù)存儲及訪問的項(xiàng)目就有
- 手機(jī)之家的數(shù)據(jù)訪問層封裝DAL 2.0
- 盛大陳思儒寫的開源項(xiàng)目Amoeba,類似MySQL proxy
- 國內(nèi)的Erlang geek @litaocheng 曾經(jīng)對Dynamo paper深有研究,正在開發(fā)開源的erlang Dynamo實(shí)現(xiàn)e2dynoma
- 豆瓣的doubanDB,也是類Dynamo實(shí)現(xiàn)
當(dāng)然上面幾個(gè)只是冰山一角,大部分互聯(lián)網(wǎng)公司都有自己的數(shù)據(jù)層分布及訪問實(shí)現(xiàn),只不過沒有對外公開而已。架構(gòu)師、DBA、程序員具備這方面的實(shí)踐經(jīng) 驗(yàn)及技能當(dāng)然是好事,但是如果業(yè)界能夠有通用穩(wěn)定的解決方案來解決大家的重復(fù)工作則對整個(gè)業(yè)界更佳。PNUTS雖然聲稱會開源,但是一直沒有進(jìn)一步消息。 而且即使開源是是開放核心代碼還是全部可用于部署的程序(比如YMB等)這也是一個(gè)問題。
介紹內(nèi)容來自:http://timyang.net/architecture/yahoo-pnuts/
