Tair是一個Key/Value結構數據的解決方案,它默認支持基於記憶體和檔案的兩種存儲方式,分別與快取和持久化存儲對應。TAIR的功能是get、put、delete以及批量接口。
基本介紹
- 外文名:TAIR
- 屬於:Key/Value結構數據的解決方案
- 基於:記憶體和檔案的兩種存儲方式
- 功能:get、put、delete以及批量接口
功能,Version支持,原子計數器,Item支持,結構特點,輕量級,內部結構,
功能
Tair除了普通Key/Value系統提供的功能,比如get、put、delete以及批量接口外,還有一些附加的實用功能,使得其有更廣的適用場景,包括:
Version支持
原子計數器
Item支持
Version支持
Tair中的每個數據都包含版本號,版本號在每次更新後都會遞增。這個特性有助於防止由於數據的並發更新導致的問題。
比如,系統有一個value為“a,b,c”,A和B同時get到這個value。A執行操作,在後面添加一個d,value為 “a,b,c,d”。B執行操作添加一個e,value為”a,b,c,e”。如果不加控制,無論A和B誰先更新成功,它的更新都會被後到的更新覆蓋。
Tair無法解決這個問題,但是引入了version機制避免這樣的問題。還是拿剛才的例子,A和B取到數據,假設版本號為10,A先更新,更新成 功後,value為”a,b,c,d”,與此同時,版本號會變為11。當B更新時,由於其基於的版本號是10,伺服器會拒絕更新,從而避免A的更新被覆 蓋。B可以選擇get新版本的value,然後在其基礎上修改,也可以選擇強行更新。
原子計數器
Tair從伺服器端支持原子的計數器操作,這使得Tair成為一個簡單易用的分散式計數器。
Item支持
Tair還支持將value視為一個item數組,對value中的部分item進行操作。比如有個key的value為[1,2,3,4,5], 可以只獲取前兩個item,返回[1,2],也可以刪除第一個item,還支持將數據刪除,並返回被刪除的數據,通過這個接口可以實現一個原子的分布 式FIFO的佇列。
結構特點
一個Tair集群主要包括client、configserver和dataserver 3個模組。Configserver通過和dataserver的心跳(HeartBeat)維護集群中可用的節點,並根據可用的節點,構建數據的在集群 中的分布信息(見下文的對照表)。Client在初始化時,從configserver處獲取數據的分布信息,根據分布信息和相應的dataserver 互動完成用戶的請求。Dataserver負責數據的存儲,並按照configserver的指示完成數據的複製和遷移工作。
輕量級
從Tair的整體架構圖上看,configserver很類似傳統分散式集群中的中心節點。整個集群服務都依賴於configserver的正常工作。
但Tair的configserver卻是一個輕量級的中心節點,在大部分時候,configserver不可用對集群的服務是不造成影響的。
Tair用戶和configserver的互動主要是為了獲取數據分布的對照表,當client獲取到對照表後,會cache這張表,然後通過查這 張表決定數據存儲的節點,所以請求不需要和configserver互動,這使得Tair對外的服務不依賴configserver,所以它不是傳統意義 上的中心節點。
configserver維護的對照表有一個版本號,每次新生成表,該版本號都會增加。當有數據節點狀態發生變化(比如新增節點或者有節點不可用了)時,configserver會根據當前可用的節點重新生成對照表,並通過數據節點的心跳,將新表同步給數據節點。
當客戶端請求數據節點時,數據節點每次都會將自己的對照表的版本號放入response中返回給客戶端,客戶端接收到response後,會將數據節點返回的版本號和自己的版本號比較,如果不相同,則主動和configserver通信,請求新的對照表。
所以客戶端也不需要和configserver保持心跳,以便及時地更新對照表。這使得在正常的情況下,客戶端不需要和configserver通信,即使configserver不可用了,也不會對整個集群的服務造成大的影響。
僅有當configserver不可用,此時有客戶端需要初始化,那么客戶端將取不到對照表信息,這將使得客戶端無法正常工作。
內部結構
DataServer負責數據的物理存儲,並根據configserver構建的對照表完成數據的複製和遷移工作。DataServer具備抽象的存儲引擎層,可以很方便地添加新存儲引擎。DataServer還有一個外掛程式容器,可以動態地載入/卸載外掛程式。
抽象的存儲引擎層 Tair的存儲引擎有一個抽象層,只要滿足存儲引擎需要的接口,便可以很方便地替換Tair底層的存儲引擎。比如可以很方便地將bdb、tc甚至MySQL作為Tair的存儲引擎,而同時使用Tair的分布方式、同步等特性。
Tair默認包含兩個存儲引擎:mdb和fdb。
mdb是一個高效的快取存儲引擎,它有著和memcached類似的記憶體管理方式。mdb支持使用share memory,這使得在重啟Tair數據節點的進程時不會導致數據的丟失,從而使升級對套用來說更平滑,不會導致命中率的較大波動。
fdb是一個簡單高效的持久化存儲引擎,使用樹的方式根據數據key的hash值索引數據,加快查找速度。索引檔案和數據檔案分離,儘量保持索引檔案在記憶體中,以便減小IO開銷。使用空閒空間池管理被刪除的空間。
自動的複製和遷移 為了增強數據的安全性,Tair支持配置數據的備份數。比如可以配置備份數為3,則每個數據都會寫在不同的3台機器上。得益於抽象的存儲引擎層,無論是作為cache的mdb,還是持久化的fdb,都支持可配的備份數。
當數據寫入一個節點(通常稱其為主節點)後,主節點會根據對照表自動將數據寫入到其他備份節點,整個過程對用戶是透明的。
當有新節點加入或者有節點不可用時,configserver會根據當前可用的節點,重新build一張對照表。數據節點同步到新的對照表時,會自 動將在新表中不由自己負責的數據遷移到新的目標節點。遷移完成後,客戶端可以從configserver同步到新的對照表,完成擴容或者容災過程。整個過 程對用戶是透明的,服務不中斷。
外掛程式容器 Tair還內置了一個外掛程式容器,可以支持熱插拔外掛程式。
外掛程式由configserver配置,configserver會將外掛程式配置同步給各個數據節點,數據節點會負責載入/卸載相應的外掛程式。
外掛程式分為request和response兩類,可以分別在request和response時執行相應的操作,比如在put前檢查用戶的quota信息等。
外掛程式容器也讓Tair在功能方便具有更好的靈活性。