淘寶Tair分佈式緩存系統 總體結構分析

簡介

tair 是淘寶自己開發的一個分佈式 key/value 存儲引擎. tair 分爲持久化和非持久化兩種使用方式. 非持久化的 tair 可以看成是一個分佈式緩存. 持久化的 tair 將數據存放於磁盤中. 爲了解決磁盤損壞導致數據丟失, tair 可以配置數據的備份數目, tair自動將一份數據的不同備份放到不同的主機上, 當有主機發生異常, 無法正常提供服務的時候, 其於的備份會繼續提供服務.

tair 的總體結構

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

http://code.taobao.org/p/tair/file/33/structure.jpg

tair 的負載均衡算法是什麼

tair 的分佈採用的是一致性哈希算法, 對於所有的key, 分到Q個桶中, 桶是負載均衡和數據遷移的基本單位. config server 根據一定的策略把每個桶指派到不同的data server. 因爲數據按照keyhash算法, 所以可以認爲每個桶中的數據基本是平衡的. 保證了桶分佈的均衡性, 就保證了數據分佈的均衡性.

http://code.taobao.org/p/tair/file/32/interface.jpg

增加或者減少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中有100data server, 機房2中只有1data server. 這個時候, 機房2data server的壓力必然會非常大. 於是這裏產生了一個控制參數 _build_diff_ratio(參見安裝部署文檔). 當機房差異比率大於這個配置值時, config server也不再build新表. 機房差異比率是如何計出來的呢? 首先找到機器最多的機房, 不妨設使RA, data server數量是SA. 那麼其餘的data server的數量記做SB. 則機房差異比率=|SA – SB|/SA. 因爲一般我們線上系統配置的COPY_COUNT3. 在這個情況下, 不妨設只有兩個機房RARB, 那麼兩個機房什麼樣的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發生故障的時候,客戶有可能在一定時間窗口內讀不到最新的數據. 甚至發生最新數據丟失的情況.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章