分布式的數據存儲平臺 PNUTS
Yahoo!的PNUTS是一個分布式的數據存儲平臺,它是 Yahoo!云計算平臺重要的一部分。它的上層產品通常也稱為Sherpa。按照官方的 描述,”PNUTS, a massively parallel and geographically distributed database system for Yahoo!’s web applications.” PNUTS顯然就深諳CAP之道,考慮到大部分web應用對一致性并不要求非常嚴格,在設計上放棄了對強一致性的追求。代替的是追求更高的 availability,容錯,更快速的響應調用請求等。
1. PNUTS簡介及特點
- 地理分布式,分布在全球多個數據中心。由于大部分Web應用都對響應時間要求高,因此最好服務器部署在離用戶最近的本地機房。
- 可擴展,記錄數可支持從幾萬條到幾億條。數據容量增加不會影響性能。
- schema-free,即非固定表結構。實際使用key/value存儲的,一條記錄的多個字段實際是用json方式合并存在value中。因此delete和update必須指定primary key。但也支持批量查詢。
- 高可用性及容錯。從單個存儲節點到整個數據中心不可用都不會影響前端Web訪問。
- 適合存相對小型的記錄,不適合存儲大文件,流媒體等。
- 弱一致性保證。
傳統的數據庫提供強一致性保證, 通常稱為“serialization transaction”,保證調用時序的一致性。但在web應用中不是必須,比如用戶A修改了自己的資料或上傳了圖片,他的好友B短時間不能立即看到并 不是大的問題,通常的Web應用都可以接受。PNUTS像大部分分布式key/value系統類似,提供的是弱一致性的支持,也就是支持“最終一致性 (eventually consistent)”。用戶B最終會看到用戶A的修改信息。
未夠!但最終一致性并非可以適應所有場合,比如用戶A修改了相冊的訪問權限,設置用戶C不能訪問,然后用戶A又上傳了新的圖片,如果用戶C處于另外 一個IDC訪問,如果圖片數據先同步成功,而權限記錄后同步的話,C實際上違反了A設置的權限而看到圖片了。因此對于部分場合最終一致性是不夠的。
2. PNUTS實現
2.1 Record-level mastering 記錄級別主節點
每一條記錄都有一個主記錄。比如一個印度的用戶保存的記錄master在印度機房,通常修改都會調用印度。其他地方如美國用戶看這個用戶的資料調用 的是美國數據中心的資料,有可能取到的是舊版的數據。非master機房也可對記錄進行修改,但需要master來統一管理。每行數據都有自己的版本控 制,如下圖所示。
2.2 PNUTS的結構

2.3 Tablets尋址與切分

2.4 API訪問
- Read-any 讀取的版本有可能是舊的,返回本地IDC的數據,不檢查最新版本,性能最好。
- Read-critical(required_version) 讀取指定版本,用戶修改資料之后調用返回比當前版本更新的版本,以保證當前用戶看到的不是修改前的記錄。
- Read-latest 強制讀取最新,可能需要執行遠程IDC調用。比如上面例子介紹的讀取權限列表的調用。
- Write 比如更新用戶資料
- Test-and-set-write(required version) 只有當記錄屬于指定的版本才執行write,比如更新用戶積分等業務,這個調用有點類似以前介紹的atom操作。
Write調用示意圖
3. PNUTS疑問
記錄級別master的問題,比如master選取如何達到效率最佳,如何面對2個修改合并沖突?合并沖突據說是需要client自行來處理,
這篇Details on Yahoo’s distributed database提 到的平均調用latency 100ms的問題。web應用通常對每次數據的訪問最好在10ms之內完成,因為每個web頁面實際上不止一個數據訪問的調用,經常調用10次以上db的 訪問的頁面并不少見,因此如果平均latency在100ms以上那勢必影響頁面加載速度。不過yahoo!的開發人員回復paper中的數據實際是一個 老版本的測試,目前的版本,在實際生產環境的pnuts的latency會在10ms以下。
另外PNUTS為什么要用消息系統代替replication/undo log?有何優點?
4. PNUTS感悟
Web應用使用通用的存儲服務是大勢所趨,類似BigTable, Amazon Dynamo/SimpleDB這樣的方案,但是目前除非使用Amazon提供的商用SimpleDB之外幾乎沒有通用的解決方案,每個公司甚至每個項目 需要面對及考慮數據規模增大的問題。比如初步統計下國內研究可擴展數據存儲及訪問的項目就有
- 手機之家的數據訪問層封裝DAL 2.0
- 盛大陳思儒寫的開源項目Amoeba,類似MySQL proxy
- 國內的Erlang geek @litaocheng 曾經對Dynamo paper深有研究,正在開發開源的erlang Dynamo實現e2dynoma
- 豆瓣的doubanDB,也是類Dynamo實現
當然上面幾個只是冰山一角,大部分互聯網公司都有自己的數據層分布及訪問實現,只不過沒有對外公開而已。架構師、DBA、程序員具備這方面的實踐經 驗及技能當然是好事,但是如果業界能夠有通用穩定的解決方案來解決大家的重復工作則對整個業界更佳。PNUTS雖然聲稱會開源,但是一直沒有進一步消息。 而且即使開源是是開放核心代碼還是全部可用于部署的程序(比如YMB等)這也是一個問題。