PNUTS是Yahoo!的分布式數據庫系統,支持地域上分布的大規模并發操作。它根據主鍵的范圍區間或者其哈希值的范圍區間將表拆分為表單元(Tablet),多個表單元存儲在一個服務器上。一個表單元控制器根據服務器的負載情況,進行表單元的遷移和拆分。每條記錄的數據都沒有固定的模式(采用JSON格式的文本)
組件
?
- 區域(Region):一個區域包含全部表的數據和相關組件。
- 表單元控制器(Tablet controller):一個表單元是是表中被劃分出來的一組記錄的集合。表單元控制器管理著表單元的創建,切分,維護存儲單元與表單元的映射關系。有主備服務器來保證其可用性。
- 路由器(Router):根據從表單元控制器中讀取到的信息將數據路由到正確的存儲單元。另外也支持數據的聚合。
- 存儲單元(Storage unit):存儲表單元。可以是一個Ulix文件系統(hash表)或者MySQL InnoDB(順序表)
- 消息中間件(YMB):分發備份記錄到其他的Region或者更新通知給客戶端。
?
一致性
? ? ? ? ? 由于PNUTS設計數據分布在地理上的不同位置,所以它沒有采用代價比較高的事務操作。另外由于最終一致性可能會出現一些不希望看到的中間結果,所以PNUTS主要實現一種時序上的一致性。
? ? ? ? ??在每條記錄中,有一個字段標志該記錄Master所屬的區域,所有的更新先發往Master,由Master將數據同步到其他的備份中。為了避免插入操作的沖突,表也分為主備,所有的記錄插入操作都先在主表上執行。在底層,通過消息中間件(YMB, Yahoo! Message Broker)來保證數據分發的順序。
? ? ? ? ??另外每條記錄都有一個版本號,由應用根據自己的需要,來決定讀寫記錄的方式: 可以讀取任意的備份,也可以讀取最新的記錄,或者讀取指定的版本,在寫的時候既可以直接覆蓋,也可以實現樂觀鎖的控制。通過這種方式,來保證應用的讀寫一致性和寫讀一致性。
可用性
? ? ? ? ? 數據的可用性主要是通過YMB來保證,YMB也同時管理日志,數據發布到YMB視為數據的提交,初始時YMB將數據寫到兩個服務器的日志中, 只有當數據分發到所有的區域上后,YMB才將日志刪除。
? ? ? ? ? 在一條記錄的master區域不可用時,應用程序可以決定是否繼續更新,如果更新則需要手動解決潛在的沖突。
? ? ? ? ? 客戶端支持自動的failover
高性能
? ? ? ? ? 主要通過本地化操作實現,系統統計最近三次請求的來源,將master遷移到相應的Region中。
? ? ? ? ? 表單元控制器檢測系統的負載情況,通過遷移或者拆分tablet來均衡負載。
? ? ? ? ? 另外,數據拷貝的傳輸為異步操作。? ? ? ? ?
? ? ? ? ?
? ? ? ? ??
?