一.簡介
Tair是一個高性能、分布式、可擴充、高可靠的Key-Value nosql結構存儲系統,專注于高速緩存場景。
Tair有三種類型mdb,ldb,rdb:
(1) mdb是定位于cache緩存,類似于memcache的一個支援kv 記憶體緩存架構
(2) rdb是 定位于cache緩存,采用了redis的記憶體存儲結構的一個支援kv、list等複雜資料結構的緩存架構
(3) ldb是一個定位于高性能存儲,并可選擇内嵌mdb cache加速,這種情況下cache與持久化存儲的資料一緻性由tair進行維護,支援kv及分級key存儲,資料排序的緩存架構
其中,mdb可用于高速緩存或記憶體存儲,rdb可用于高速緩存,ldb可用于持久存儲。
二.基本概念
1.configID
唯一辨別一個tair叢集,每個叢集都有一個對應的configID,在目前的大部分應用情況下configID是存放在diamond中的,對應了該叢集的configserver位址和groupname。業務在初始化tairclient的時候需要配置此ConfigID。
2.Namespace
又稱area,是tair中配置設定給應用的一個記憶體或者持久化存儲區域,可以認為應用的資料存在自己的namespace中。支援不同的資料使用相同的key而内容不沖突。
3.quota配額
對應了每個namespace儲存區的大小限制,超過配額後資料将面臨最近最少使用(LRU)的淘汰。
4.配額計算
配額大小直接影響資料的命中率和資源利用效率,業務方需要給出一個合适的值,通常的計算方法是評估在保證一定命中率情況下所需要的記錄條數,這樣配額大小即為:記錄條數*平均單條記錄大小。
5.ExpireTime過期時間
expiredTime 是指資料的過期時間,當超過過期時間之後,資料将對應用不可見,這個設定同樣影響到應用的命中率和資源使用率。不同的存儲引擎有不同的政策清理掉過期的資料。調用接口時,expiredTime機關是秒。可以是相對時間(比如:30s),也可以是絕對時間(時間戳,比如:當天23時,轉換成距離1970-1-1 00:00:00的秒數)。
(1) 小于0,不更改之前的過期時間;
(2) 如果不傳或者傳入0,則表示資料永不過期;
(3) 大于0小于目前時間戳是相對時間過期;
(4) 大于目前時間戳是絕對時間過期;
6.version
Tair中存儲的每個資料都有版本号,版本号在每次更新後都會遞增,相應的,在Tair put接口中也有此version參數,這個參數是為了解決并發更新同一個資料而設定的,類似于樂觀鎖。 很多情況下,更新資料是先get,修改get回來的資料,然後put回系統。如果有多個用戶端get到同一份資料,都對其修改并儲存,那麼先儲存的修改就會被後到達的修改覆寫,進而導緻資料一緻性問題,在大部分情況下應用能夠接受,但在少量特殊情況下,這個是我們不希望發生的。
三.Tair架構
一個Tair叢集主要包括3個必選子產品:ConfigServer、DataServer和Client,一個可選子產品:InvalidServer。
通常情況下,一個叢集中包含2台configserver及多台dataServer。兩台configserver互為主備并通過維護和dataserver之間的心跳獲知叢集中存活可用的dataserver,建構資料在叢集中的分布資訊(對照表)。dataserver負責資料的存儲,并按照configserver的訓示完成資料的複制和遷移工作。client在啟動的時候,從configserver擷取資料分布資訊,根據資料分布資訊和相應的dataserver互動完成使用者的請求。invalidserver主要負責對等叢集的删除和隐藏操作,保證對等叢集的資料一緻。
1.ConfigServer功能
(1) 通過維護和DataServer心跳來獲知叢集中存活節點的資訊
(2) 根據存活節點的資訊來建構資料在叢集中的分布表
(3) 提供資料分布表的查詢服務
(4) 排程DataServer之間的資料遷移、複制
2.DataServer功能
(1) 提供存儲引擎
(2) 接受Client的put/get/remove等操作
(3) 執行資料遷移,複制等
(4) 插件:在接受請求的時候處理一些自定義功能
(5) 通路統計
3.InvalidServer功能
(1) 接收來自Client的invalid/hide等請求後,對屬于同一組的叢集(雙機房獨立叢集部署方式)做delete/hide操作,保證同一組叢集的一緻
(2) 叢集斷網之後的,髒資料清理
(3) 通路統計
4.Client功能
(1) 在應用端提供通路Tair叢集的接口
(2) 更新并緩存資料分布表和InvalidServer位址等
(3) LocalCache,避免過熱資料通路影響tair叢集服務
(4) 流控
四.技術點
1. 對照表【别名路由表】
(1) 資料劃分:key/hash
(2) 建表規則:考慮各個機器的負載均衡,考慮機架、叢集
(3) 表重建和同步:重建就意味着會有遷移,有同步、異步遷移模式【主要是依賴于binlog】
(4) Bucket【桶】:資料幾批會同時路由到一條機器
(5) Version:每次表重建都會有個版本
(6) 擴充性:有了對照表,可以随意擴充容量
傳統的路由方法通常是将key的hash值對機器取模,這樣實作簡單,但是在伺服器數量發生變化時對原有分布沖擊很大。Tair中采用對照表的方法改進這個問題:
key的hash值不是對伺服器節點數取模,而是和一個固定的數取模,這個數通常遠大于機器數,固定數範圍内的每個值都與一個節點相對應,一台實體機器可以和多個值對應。這是一緻性hash的一種變型。
2. 資料防丢:
(1) binlog
(2) 單備份
(3) 雙備份
(4) 雙機房雙備份
(5) ConfigServer主備結構
3. 熱點:
(1) load cache
(2) 用戶端本地緩存
(3) 某台server流控
(4) 多執行個體
4. 資料複制
(1) 對用戶端透明:就是說用戶端不應該知道這件事,且不應該對用戶端産生影響
(2) 用戶端隻寫主DS:底層會進行複制同步
(3) 由主DS負責複制