天天看點

淘寶的KV存儲系統的設計思路總結-tair系統

tair系統功能:(主要用來對付那些靜态化相關資源)

  • 1、作為架設在各類存儲媒體前邊的一層系統
  • 2、可以用來存儲cache資料,也可以持久化資料

一、要解決的問題

  • 1、當使用者通路資料為海量的時候,并且并發太大的時候直接通路資料庫會讓資料庫被穿透,直接當機
  • 2、淘寶的使用者資訊和産品資訊資料調用量是海量

二、設計思路

1、初期設計思路

(1)、做一層cache來緩存資料,直接給apache增加一個mod來進行資料cache

缺點:當資料量太大的時候,存儲能力以及命中率降低,海量資料的時候命中率如果在90%以下資料庫可能就會被穿透。淘寶的tair需要做到99.98%的命中率

2、支援多個産品線的設計思路

因為是KV資料存儲政策,在單個機房建立多個tair叢集,每個叢集由如下三個角色:對apache節點(client:就是應用通路節點)、config server(存儲資料存放位置的:name server/node server)、data server(存儲資料的)

這裡client我們一般都是在apache應用伺服器加一個mod子產品扮演。但是他是面向多個config server 和data server的

存儲規則如下:

a、隻在一個主節點寫,相當于MySQL的Master/Slave政策,在主庫寫,在從庫讀

b、将資料寫的位置通過 hash(key)%n 這類簡單的方式計算出位置,并将資訊存儲到指定位置。這裡可以拓展到hash到叢集和叢集中的指定節點

通路規則如下:

a、當使用者通路的時候直接去檢視client是否存儲了資訊所在的data server,如果沒有,直接通路config server去擷取,并cache到client,然後到指定的data server取得資料

b、當config server改變的時候,不通知client,但是通知data server,并讓data server 緩存他最新的config server對他的版本标注。當client通路data server的時候做版本比對,如果版本出問題,重新通路config server擷取dataserver最新位置

c、當client通路dataserver時候發現資料改變,将資訊發送到代理server(invalidate host)上,做到本地其他機房資料得以删除,保證使用者通路的時候得以更新

三、如何應對跨機房

1、網絡延遲不可避免,在事務上盡量做到解耦

2、如果是北京上海的這類機房通過,直接通過資料庫(例如:mysql)的記錄檔(例如bin.log)的操作同步,将這些同步行為轉換為對當地機房的資料清理動作

3、如果機房屬于同城的機房,那麼就用上邊提到的invalidate host的方式做資料通知

四、tair某個叢集出現問題時如何處理

1、直接将用戶端的請求切刀其他的機房中。因為跨機房政策,除了主機房,其他機房都是隻讀的政策

2、tair出問題的節點需要快速的根據曆史資訊計算出最熱的節點并恢複使用

五、一些常見的問題

1、某些key的過熱通路處理

當某個商鋪調用的資訊太過頻繁,可以做一定時間段内請求的歸一,例如将300ms(注意,是毫秒)内的幾百個上千個請求隻想data server拿一次資料。

2、髒資料容忍

不同機房都會有髒資料問題,這個不可避免。這個受限于資料同步,但是在産品設計上保證一定的容忍度

轉載:

http://blog.csdn.net/kongqz/article/details/7474784

繼續閱讀