淘寶緩存架構
redis很好用,提供緩存服務。相比memcached多了新數據結構和主從模式增加可用性。不過redis有一點不能滿足一些互聯網公司開發者需求。
redis集群中,想用緩存必須得指明redis服務器地址去要。這就增加了程序的維護復雜度。因為redis服務器很可能是需要頻繁變動的。
為什么不能像操作分布式數據庫或者hadoop那樣,增加一個中央節點,讓它去代理所有事情。
所以就開發了這個tair。程序只要跟tair中心節點交互就可以。
還開發了
配置服務器。免去了像操作hadoop那樣,每台hadoop一套一模一樣配置文件。改配置文件得整個集群都跟着改。
tair使用了google在bigtable里面的merge-dump模型。底層存儲可以用redis或者google的levelDB。已經開源了。
開源地址
http://tair.taobao.org/
Tair簡介
分布式 key/value 存儲引擎
持久化和非持久化兩種使用方式
Tair總體結構


tair 作為一個分布式系統, 是由一個中心控制節點和一系列的服務節點組成. 我們稱中心控制節點為config server. 服務節點是data server。
config server 負責管理所有的data server, 維護data server的狀態信息。
data server 對外提供各種數據服務, 並以心跳的形式將自身狀況匯報給config server。
config server是控制點, 而且是單點, 目前采用一主一備的形式來保證其可靠性。
所有的 data server 地位都是等價的。
Tair 的負載均衡算法

tair 的分布采用的是一致性哈希算法, 對於所有的key, 分到Q個桶中, 桶是負載均衡和數據遷移的基本單位.
config server 根據一定的策略把每個桶指派到不同的data server上. 因為數據按照key做hash算法, 所以可以認為每個桶中的數據基本是平衡的. 保證了桶分布的均衡性, 就保證了數據分布的均衡性.
增加或者減少data server的時候會發生什么
當有某台data server故障不可用的時候, config server會發現這個情況, config server負責
重新計算一張新的桶在data server上的分布表, 將原來由故障機器服務的桶的訪問重新指派到其它的data server中. 這個時候, 可能會發生
數據的遷移.
比如原來由data server A負責的桶, 在新表中需要由 B負責. 而B上並沒有該桶的數據, 那么就將數據遷移到B上來. 同時config server會發現哪些桶的備份數目減少了, 然后根據負載情況在負載較低的data server上增加這些桶的備份. 當系統增加data server的時候, config server根據負載, 協調data server將他們控制的部分桶遷移到新的data server上. 遷移完成后
調整路由.
當然, 系統中可能出現減少了某些data server 同時增加另外的一些data server. 處理原理同上. 每次路由的變更, config server都會將新的配置信息推給data server. 在客戶端訪問data server的時候, 會發送
客戶端緩存的路由表的版本號. 如果data server發現客戶端的版本號過舊, 則會通知客戶端去config server取一次新的路由表. 如果客戶端訪問某台data server 發生了不可達的情況(該 data server可能宕機了), 客戶端會主動去config server取新的路由表.
發生遷移的時候data server如何對外提供服務
當遷移發生的時候, 我們舉個例子, 假設data server A 要把 桶 3,4,5 遷移給data server B. 因為遷移完成前, 客戶端的路由表沒有變化, 客戶端對 3, 4, 5 的訪問請求都會路由到A. 現在假設 3還沒遷移, 4 正在遷移中, 5已經遷移完成. 那么如果是對3的訪問, 則沒什么特別, 跟以前一樣. 如果是對5的訪問, 則A會把該請求轉發給B,並且將B的返回結果返回給客戶, 如果是對4的訪問, 在A處理, 同時如果是對4的修改操作, 會記錄修改log.當桶4遷移完成的時候, 還要把log發送到B, 在B上應用這些log. 最終A B上對於桶4來說, 數據完全一致才是真正的遷移完成. 當然, 如果是因為某data server宕機而引發的遷移, 客戶端會收到一張中間臨時狀態的分配表. 這張表中, 把宕機的data server所負責的桶臨時指派給有其備份data server來處理. 這個時候, 服務是可用的, 但是負載可能不均衡. 當遷移完成之后, 才能重新達到一個新的負載均衡的狀態.
桶在data server上分布時候的策略
程序提供了兩種生成分配表的策略, 一種叫做負載均衡優先, 一種叫做位置安全優先: 我們先看負載優先策略. 當采用負載優先策略的時候, config server會盡量的把桶均勻的分布到各個data server上. 所謂盡量是指在不違背下面的原則的條件下盡量負載均衡. 1 每個桶必須有COPY_COUNT份數據 2 一個桶的各份數據不能在同一台主機上; 位置安全優先原則是說, 在不違背上面兩個原則的條件下, 還要滿足位置安全條件, 然后再考慮負載均衡. 位置信息的獲取是通過 _pos_mask(參見安裝部署文檔中關於配置項的解釋) 計算得到. 一般我們通過控制 _pos_mask 來使得不同的機房具有不同的位置信息. 那么在位置安全優先的時候, 必須被滿足的條件要增加一條, 一個桶的各份數據不能都位於相同的一個位置(不在同一個機房). 這里有一個問題, 假如只有兩個機房, 機房1中有100台data server, 機房2中只有1台data server. 這個時候, 機房2中data server的壓力必然會非常大. 於是這里產生了一個控制參數 _build_diff_ratio(參見安裝部署文檔). 當機房差異比率大於這個配置值時, config server也不再build新表. 機房差異比率是如何計出來的呢? 首先找到機器最多的機房, 不妨設使RA, data server數量是SA. 那么其余的data server的數量記做SB. 則機房差異比率=|SA – SB|/SA. 因為一般我們線上系統配置的COPY_COUNT是3. 在這個情況下, 不妨設只有兩個機房RA和RB, 那么兩個機房什么樣的data server數量是均衡的范圍呢? 當差異比率小於 0.5的時候是可以做到各台data server負載都完全均衡的.這里有一點要注意, 假設RA機房有機器6台,RB有機器3台. 那么差異比率 = 6 – 3 / 6 = 0.5. 這個時候如果進行擴容, 在機房A增加一台data server, 擴容后的差異比率 = 7 – 3 / 7 = 0.57. 也就是說, 只在機器數多的機房增加data server會擴大差異比率. 如果我們的_build_diff_ratio配置值是0.5. 那么進行這種擴容后, config server會拒絕再繼續build新表.
Tair 的一致性和可靠性問題
分布式系統中的可靠性和一致性是無法同時保證的, 因為我們必須允許網絡錯誤的發生.
tair 采用
復制技術來提高可靠性, 並且為了提高效率做了一些優化, 事實上在沒有錯誤發生的時候, tair 提供的是一種強一致性. 但是在有data server發生故障的時候, 客戶有可能在一定時間窗口內讀不到最新的數據. 甚至發生最新數據丟失的情況。
參考博客
Tair-分布式K/V結構數據存儲系統:http://ju.outofmemory.cn/entry/41538