一.簡介
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負責複製