一個Tair集羣主要包括3個必選模塊:configserver、dataserver和client,一個可選模塊:invalidserver。一般狀況下,一個集羣中包含2臺configserver及多臺dataServer。兩臺configserver互爲主備並經過維護和dataserver之間的心跳獲知集羣中存活可用的dataserver,構建數據在集羣中的分佈信息(對照表)。dataserver負責數據的存儲,並按照configserver的指示完成數據的複製和遷移工做。client在啓動的時候,從configserver獲取數據分佈信息,根據數據分佈信息和相應的dataserver交互完成用戶的請求。invalidserver主要負責對等集羣的刪除和隱藏操做,保證對等集羣的數據一致。redis
從架構上看,configserver的角色相似於傳統應用系統的中心節點,整個集羣服務依賴於configserver的正常工做。但實際上相對來講,tair的configserver是很是輕量級的,當正在工做的服務器宕機的時候另一臺會在秒級別時間內自動接管。並且,若是出現兩臺服務器同時宕機的最惡劣狀況,只要應用服務器沒有新的變化, tair依然服務正常。而有了configserver這個中心節點,帶來的好處就是應用在使用的時候只須要配置configserver的地址(如今能夠直接配置Diamond key),而不須要知道內部節點的狀況。數據庫
1) 經過維護和dataserver心跳來獲知集羣中存活節點的信息後端
2) 根據存活節點的信息來構建數據在集羣中的分佈表。緩存
3) 提供數據分佈表的查詢服務。服務器
4) 調度dataserver之間的數據遷移、複製。數據結構
1) 提供存儲引擎架構
2) 接受client的put/get/remove等操做異步
3) 執行數據遷移,複製等分佈式
4) 插件:在接受請求的時候處理一些自定義功能ide
5) 訪問統計
1.1.3 InvalidServer的功能
1) 接收來自client的invalid/hide等請求後,對屬於同一組的集羣(雙機房獨立集羣部署方式)作delete/hide操做,保證同一組集羣的一致。
2) 集羣斷網以後的,髒數據清理。
3) 訪問統計。
1.1.4 client的功能
1) 在應用端提供訪問Tair集羣的接口。
2) 更新並緩存數據分佈表和invalidserver地址等。
3) LocalCache,避免過熱數據訪問影響tair集羣服務。
4) 流控
1. 數據能夠以key/value的形式存儲
2. 數據能夠接受丟失
3. 訪問速度要求很高
4. 單個數據大小不是很大,通常在KB級別
5. 數據量很大,而且有較大的增加可能性
6. 數據更新不頻繁
1. 數據能夠以key/value的形式存儲
2. 數據須要持久化
3. 數據量很大,而且有較大的增加可能性
4. 單個數據大小不是很大,通常在KB級別
5. 數據的讀寫比例較高
1.對數據有查詢需求,好比對key的模糊查詢,或者根據value反查詢key等
2.單條數據很大
3.讀寫比例很低
產品比較項 |
Tair |
REDIS |
開源狀況 |
徹底開源 |
徹底開源 |
使用語言 |
服務器端C++;客戶端支持C、JAVA、PHP等 |
ANSI C語言編寫 ,提供多種語言(C/C++/JAVA/PHP等)的API |
分佈式 |
支持 |
目前redis的3.0已經支持分佈式式,特色是主從的方式支持即主從庫方式添加代理進行管理。3.0版本處於測試版 |
集羣 |
支持 |
不支持,3.0測試版支持 |
動態擴展 |
支持 |
不支持,3.0測試版支持 |
持久化 |
可配,fdb方式實現持久化 |
支持,快照及aof方式都支持 |
效率 |
mdb 較高,fdb稍次 |
較高 |
容錯 |
支持,數據在寫入主節點後,會異步同步到輔節點;若是主節點不可用,則輔節點會自動接管爲主節點;當有節點不可用時,能自動複製數據,保證數據的備份數。 |
支持,主從節點互爲備份 |
緩存過時移除策略 |
支持 |
支持 |
緩存數據方式 |
持久化和非持久化兩種,前者和memcached相似的緩存數據方式。 |
支持,一是 key/value,一是關係數據庫。 |
吞吐量 |
每秒高達66000次(mdb),fdb時,吞吐量減半 |
每秒高達60000次 |
KEY/VALUE |
key :1024個字符;value: 1M個字節。 |
key :254個字符;value: 高達1G個字節。 |
單點故障 |
已解決,經過備份 |
存在 |
內存管理 |
支持 |
支持 |
其餘數據結構 |
支持redis的內存存儲結構。支持k/v,list,hash,set等數據結構。 |
自己支持持k/v,list,hash,set,sortedset等數據結構 |
跨機房管理 |
支持 |
不支持 |
多集羣管理 |
支持 |
不支持 |
是否支持副本 |
支持 |
不支持 |
使用狀況 |
國內淘寶網 在最大規模的使用 |
國內新浪微博,之前曾出現過故障 |
|
|
|
tair及redis集成關係:Tair是淘寶開源的分佈式KV緩存系統,內部將功能模塊化,抽離出底層存儲細節,能夠接入不一樣的存儲引擎。redis是一個開源的、高效的key-value存儲,提供了strings、hashs、lists、sets、sorted sets等多種高級數據結構。redis做爲Tair的存儲引擎接入,稱爲rdb,rdb從redis繼承了豐富的操做,包括list、hash、sorted set、set(與mdb相比,list再也不那麼ugly)。
總結:rdb:是tair集成從redis繼承了豐富的操做,包括list、hash、sorted set、set(與mdb相比,list再也不那麼ugly),Tair將Redis的存儲部分抽離出來,做爲非持久化的存儲引擎rdb(目前代碼裏面沒有rdb代碼,即沒有開源);
首先增長一個代理端,做用是檢測處理應用請求,若是是讀代理會嘗試在tair及redis兩個系統查找數據,返回給應用;若是是寫數據代理直接將數據寫入tair。
4.2.1 tair支持的集羣一個機房
支持副本,管理結點是主從,數據結點是多個,不一樣數據結點之間沒有主從關係,有副本。
4.2.2 tair雙機房單集羣單份
雙機房單集羣單備份數是指,該Tair集羣部署在兩個機房中(也就是該Tair集羣的機器分別在兩個機房), 數據存儲份數爲1, 該類型集羣部署示意圖以下所示。數據服務器(Dataserver)分佈在兩個機房中,他們都屬於同一集羣
4.2.3 雙機房獨立集羣是指,在兩個機房中同時部署2個獨立的Tair集羣,這兩個集羣沒有直接關係。下圖是一個典型的雙機房獨立集部署示意圖,能夠看到,cm3和cm4各有一個完整的tair集羣(2個configserver+多個dataserver)。圖中還多了一個invalidserver的角色, invalidserver接收客戶端的invalid或者hide請求後,會對各機房內的集羣進行delete或者hide操做,以此保障Tair中的數據和後端數據源保持一致的。
4.2.3 雙機房單集羣雙份
雙機房單集羣雙份,是指一個Tair集羣部署在2個機房中,數據保存2份,而且同一數據的2個備份不會放在同一個數據服務器上。根據數據分佈策略的不一樣,還能夠將同一份數據的不一樣備份分佈到不一樣的機房上。該類型的集羣部署方式與雙機房單集羣單份數據的部署方式同樣。其不一樣之處,數據保存份數不同。該類型集羣部署方式示意圖以下圖所示,數據服務器分別部署在兩個不一樣的機房裏,全部的數據服務器都被相同的配置服務器管理,在邏輯上,他們構成一個獨立的集羣。
4.2.4 雙機房主備集羣
這種部署方式中,存在一個主集羣和一個備份集羣,分別在兩個機房中。以下圖所示,不妨假設CM3中部署的是主集羣,CM4中部署的是備份集羣。那麼,在正常狀況下,用戶只使用主集羣,讀寫數據都與主集羣交互。主備集羣會自動同步數據(不須要業務去更新兩邊),保證兩個機房數據的最終一致性。當一個機房發生故障後,備集羣會自動切換成主集羣,提供服務,保證系統可用性。
a.在分佈式集羣支持方面tair支持副本,支持多種集羣結構,如:一機房一個集羣、雙 機房單集羣單份、雙機房獨立集羣、雙機房單集羣雙份、雙機房主備集羣;
b.對於讀寫性能根據結點添加對線性上升,緣由是各個結點之間是沒有關係,節點增多相應性能提高。
c.高可用比較強,任何小於副本數結點掛掉,不會影響正常業務。
e.淘寶在多個實際應用場景應用,知足不一樣業務需求。
F.支持跨機房數據分佈。
a.在單節點的性能比較方面,redis是性能比tair高大概1/5
b.redis目前研究人員比較少,社區不是很活躍。
a.在單節點的性能比較方面,redis是性能比tair高大概1/5
b.redis目前研究人員比較多,社區比較活躍。
c.在支持多種數據結構方面tair沒有redis支持的全面。
a.目前發佈版不支持分佈式,測試版支持,測試版對分佈式支持比較弱,是用主備支持高可能,沒有副本。
b.容災性相比tair弱,緣由是redis的分佈式不支持多副本。