簡介
在面對海量數(shù)據(jù)存儲(需要大的存儲空間)和海量查詢(需要高并發(fā)的查詢)時,單服務(wù)器的數(shù)據(jù)存儲模型無法提供高可用性鸥跟。
分區(qū)所做的事情就是將大的數(shù)據(jù)集拆分成多個子數(shù)據(jù)集,然后放在多個數(shù)據(jù)服務(wù)器上盔沫。這樣一來医咨,數(shù)據(jù)存儲被分散在多臺服務(wù)器上,數(shù)據(jù)計算服務(wù)同樣也被分散在多臺服務(wù)器上架诞。
分區(qū)方法
分區(qū)策略是指拟淮,如何拆分?jǐn)?shù)據(jù)集。
在選擇分區(qū)策略時谴忧,首先要考慮的就是分區(qū)粒度
很泊。例如在KV
數(shù)據(jù)庫中角虫,便會將key
作為原子進行分區(qū),拆分結(jié)果便是一組key => 一個數(shù)據(jù)實例
委造。但是以key
作為原子時戳鹅,有可能會出現(xiàn)單個key
中存儲了一個big value
,這時分區(qū)無法對這個big value
進行進一步的分割昏兆。
然后便要考慮哪些key => 一個數(shù)據(jù)實例
枫虏。這相當(dāng)于定義一個映射函數(shù),你可以手動地指定如hash(key) ∈ (s0,s1] => Node_0
亮垫,然后函數(shù)形式就是一張表模软。也可以用數(shù)學(xué)公式key => Node_{hash(key) % n}
,這樣便省去記錄映射表饮潦。在定義映射函數(shù)的時候還要考慮燃异,對于一些相關(guān)key
是否需要映射到同一節(jié)點,以方便涉及多個key
的事務(wù)或者查詢操作继蜡。
最后便是分區(qū)的實現(xiàn)回俐。
- 客戶端分區(qū)
客戶端對于給定key
選擇正確的節(jié)點進行讀取或者寫入。 - 代理輔助分區(qū)
客戶端將請求發(fā)給分區(qū)代理服務(wù)程序稀并,由代理程序轉(zhuǎn)發(fā)請求到正確的節(jié)點仅颇,并將結(jié)果返回客戶端。 - 查詢路由
客戶端將請求發(fā)給任意節(jié)點碘举,由數(shù)據(jù)節(jié)點轉(zhuǎn)發(fā)請求到正確的節(jié)點忘瓦。