久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    Tair

     月影曉風 2017-11-06

    簡介

    tair 是淘寶自己開發的一個分布式 key/value 存儲引擎. tair 分為持久化和非持久化兩種使用方式. 非持久化的 tair
    可以看成是一個分布式緩存. 持久化的 tair 將數據存放于磁盤中. 為了解決磁盤損壞導致數據丟失, tair 可以配置數據的備份數目,
    tair 自動將一份數據的不同備份放到不同的主機上, 當有主機發生異常, 無法正常提供服務的時候, 其于的備份會繼續提供服務.

    tair 的總體結構

    tair 作為一個分布式系統, 是由一個中心控制節點和一系列的服務節點組成. 我們稱中心控制節點為config server.
    服務節點是data server. config server 負責管理所有的data server, 維護data server的狀態信息.
    data server 對外提供各種數據服務, 并以心跳的形式將自身狀況匯報給config server. config server是控制點,
    而且是單點, 目前采用一主一備的形式來保證其可靠性. 所有的 data server 地位都是等價的.

    tair 的負載均衡算法是什么

    tair 的分布采用的是一致性哈希算法, 對于所有的key, 分到Q個桶中, 桶是負載均衡和數據遷移的基本單位. config server
    根據一定的策略把每個桶指派到不同的data server上. 因為數據按照key做hash算法, 所以可以認為每個桶中的數據基本是平衡的.
    保證了桶分布的均衡性, 就保證了數據分布的均衡性.

    增加或者減少data server的時候會發生什么

    當有某臺data server故障不可用的時候, config server會發現這個情況, config
    server負責重新計算一張新的桶在data server上的分布表, 將原來由故障機器服務的桶的訪問重新指派到其它的data server中.
    這個時候, 可能會發生數據的遷移. 比如原來由data server A負責的桶, 在新表中需要由 B負責. 而B上并沒有該桶的數據,
    那么就將數據遷移到B上來. 同時config server會發現哪些桶的備份數目減少了, 然后根據負載情況在負載較低的data
    server上增加這些桶的備份. 當系統增加data server的時候, config server根據負載, 協調data
    server將他們控制的部分桶遷移到新的data server上. 遷移完成后調整路由. 當然, 系統中可能出現減少了某些data
    server 同時增加另外的一些data server. 處理原理同上. 每次路由的變更, config
    server都會將新的配置信息推給data server. 在客戶端訪問data server的時候, 會發送客戶端緩存的路由表的版本號.
    如果data server發現客戶端的版本號過舊, 則會通知客戶端去config server取一次新的路由表. 如果客戶端訪問某臺data
    server 發生了不可達的情況(該 data server可能宕機了), 客戶端會主動去config server取新的路由表.

    發生遷移的時候data server如何對外提供服務

    當遷移發生的時候, 我們舉個例子, 假設data server A 要把 桶 3,4,5 遷移給data server B. 因為遷移完成前,
    客戶端的路由表沒有變化, 客戶端對 3, 4, 5 的訪問請求都會路由到A. 現在假設 3還沒遷移, 4 正在遷移中, 5已經遷移完成.
    那么如果是對3的訪問, 則沒什么特別, 跟以前一樣. 如果是對5的訪問, 則A會把該請求轉發給B,并且將B的返回結果返回給客戶,
    如果是對4的訪問, 在A處理, 同時如果是對4的修改操作, 會記錄修改log.當桶4遷移完成的時候, 還要把log發送到B,
    在B上應用這些log. 最終A B上對于桶4來說, 數據完全一致才是真正的遷移完成. 當然, 如果是因為某data
    server宕機而引發的遷移, 客戶端會收到一張中間臨時狀態的分配表. 這張表中, 把宕機的data
    server所負責的桶臨時指派給有其備份data server來處理. 這個時候, 服務是可用的, 但是負載可能不均衡. 當遷移完成之后,
    才能重新達到一個新的負載均衡的狀態.

    桶在data server上分布時候的策略

    程序提供了兩種生成分配表的策略, 一種叫做負載均衡優先, 一種叫做位置安全優先: 我們先看負載優先策略. 當采用負載優先策略的時候,
    config server會盡量的把桶均勻的分布到各個data server上. 所謂盡量是指在不違背下面的原則的條件下盡量負載均衡. 1
    每個桶必須有COPY_COUNT份數據 2 一個桶的各份數據不能在同一臺主機上; 位置安全優先原則是說, 在不違背上面兩個原則的條件下,
    還要滿足位置安全條件, 然后再考慮負載均衡. 位置信息的獲取是通過 _pos_mask(參見安裝部署文檔中關于配置項的解釋) 計算得到.
    一般我們通過控制 _pos_mask 來使得不同的機房具有不同的位置信息. 那么在位置安全優先的時候, 必須被滿足的條件要增加一條,
    一個桶的各份數據不能都位于相同的一個位置(不在同一個機房). 這里有一個問題, 假如只有兩個機房, 機房1中有100臺data server,
    機房2中只有1臺data server. 這個時候, 機房2中data server的壓力必然會非常大. 于是這里產生了一個控制參數
    _build_diff_ratio(參見安裝部署文檔). 當機房差異比率大于這個配置值時, config server也不再build新表.
    機房差異比率是如何計出來的呢? 首先找到機器最多的機房, 不妨設使RA, data server數量是SA. 那么其余的data
    server的數量記做SB. 則機房差異比率=|SA – SB|/SA. 因為一般我們線上系統配置的COPY_COUNT是3. 在這個情況下,
    不妨設只有兩個機房RA和RB, 那么兩個機房什么樣的data server數量是均衡的范圍呢? 當差異比率小于
    0.5的時候是可以做到各臺data server負載都完全均衡的.這里有一點要注意, 假設RA機房有機器6臺,RB有機器3臺. 那么差異比率 =
    6 – 3 / 6 = 0.5. 這個時候如果進行擴容, 在機房A增加一臺data server, 擴容后的差異比率 = 7 – 3 / 7 =
    0.57. 也就是說, 只在機器數多的機房增加data server會擴大差異比率.
    如果我們的_build_diff_ratio配置值是0.5. 那么進行這種擴容后, config server會拒絕再繼續build新表.

    tair 的一致性和可靠性問題

    分布式系統中的可靠性和一致性是無法同時保證的, 因為我們必須允許網絡錯誤的發生. tair 采用復制技術來提高可靠性,
    并且為了提高效率做了一些優化, 事實上在沒有錯誤發生的時候, tair 提供的是一種強一致性. 但是在有data server發生故障的時候,
    客戶有可能在一定時間窗口內讀不到最新的數據. 甚至發生最新數據丟失的情況.

    tair提供的客戶端

    tair 的server端是C++寫的, 因為server和客戶端之間使用socket通信,
    理論上只要可以實現socket操作的語言都可以直接實現成tair客戶端. 目前實際提供的客戶端有java 和 C++.
    客戶端只需要知道config server的位置信息就可以享受tair集群提供的服務了.

    主要的性能數據

    待補充

    1. Tair總述

    1.1 系統架構

    一個Tair集群主要包括3個必選模塊:configserver、dataserver和client,一個可選模塊:invalidserver。通
    常情況下,一個集群中包含2臺configserver及多臺dataServer。兩臺configserver互為主備并通過維護和
    dataserver之間的心跳獲知集群中存活可用的dataserver,構建數據在集群中的分布信息(對照表)。dataserver負責數據的存
    儲,并按照configserver的指示完成數據的復制和遷移工作。client在啟動的時候,從configserver獲取數據分布信息,根據數據
    分布信息和相應的dataserver交互完成用戶的請求。invalidserver主要負責對等集群的刪除和隱藏操作,保證對等集群的數據一致。

    從架構上看,configserver的角色類似于傳統應用系統的中心節點,整個集群服務依賴于configserver的正常工作。但實際上相對來
    說,tair的configserver是非常輕量級的,當正在工作的服務器宕機的時候另外一臺會在秒級別時間內自動接管。而且,如果出現兩臺服務器同時
    宕機的最惡劣情況,只要應用服務器沒有新的變化,
    tair依然服務正常。而有了configserver這個中心節點,帶來的好處就是應用在使用的時候只需要配置configserver的地址(現在可
    以直接配置Diamond key),而不需要知道內部節點的情況。

    1.1.1 ConfigServer的功能

    1) 通過維護和dataserver心跳來獲知集群中存活節點的信息
    2) 根據存活節點的信息來構建數據在集群中的分布表。
    3) 提供數據分布表的查詢服務。
    4) 調度dataserver之間的數據遷移、復制。

    1.1.2 DataServer的功能

    1) 提供存儲引擎
    2) 接受client的put/get/remove等操作
    3) 執行數據遷移,復制等
    4) 插件:在接受請求的時候處理一些自定義功能
    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.2 存儲引擎與應用場景

    Tair經過這兩年的發展演進,除了應用于cache緩存外,在存儲(持久化)上支持的應用需求也越來越廣泛。現在主要有mdb,rdb,ldb三種存儲引擎。

    1.2.1 mdb

    定位于cache緩存,類似于memcache。
    支持k/v存取和prefix操作

    1.2.1.1 mdb的應用場景
    在實際業務中,大部分當緩存用(后端有DB之類的數據源)。
    也可用做大訪問少量臨時數據的存儲(例如session登錄,防攻擊統計等)。
    集團內絕對多數cache服務都是采用的tair mdb。

    1.2.2 rdb

    定位于cache緩存,采用了redis的內存存儲結構。
    支持k/v,list,hash,set,sortedset等數據結構。

    1.2.2.1 rdb的應用場景
    適用于需要高速訪問某些數據結構的應用,例如SNS中常見的的粉絲存儲就可以采用set等結構;或者存儲一個商品的多個屬性(hashmap);高效的消息隊列(list)等。現在有30個左右的應用在使用rdb服務。

    1.2.3 ldb

    定位于高性能存儲,并可選擇內嵌mdb cache加速,這種情況下cache與持久化存儲的數據一致性由tair進行維護。
    支持k/v,prefix等數據結構。今后將支持list,hash,set,sortedset等redis支持的數據結構。

    1.2.3.1 ldb的應用場景
    存儲,里面可以細分如下場景:
    1) 持續大數據量的存入讀取,類似淘寶交易快照。
    2) 高頻度的更新讀取,例如計數器,庫存等。
    3) 離線大批量數據導入后做查詢。參見fastdump
    也可以用作cache:
    數據量大,響應時間敏感度不高的cache需求可以采用。例如天貓實時推薦。

    1.3 基本概念

    1.3.1 configID

    唯一標識一個tair集群,每個集群都有一個對應的configID,在當前的大部分應用情況下configID是存放在diamond中的,對應了該集
    群的configserver地址和groupname。業務在初始化tairclient的時候需要配置此ConfigID。

    1.3.2 namespace

    又稱area, 是tair中分配給應用的一個內存或者持久化存儲區域, 可以認為應用的數據存在自己的namespace中。
    同一集群(同一個configID)中namespace是唯一的。
    通過引入namespace,我們可以支持不同的應用在同集群中使用相同的key來存放數據,也就是key相同,但內容不會沖突。一個namespace
    下是如果存放相同的key,那么內容會受到影響,在簡單K/V形式下會被覆蓋,rdb等帶有數據結構的存儲引擎內容會根據不同的接口發生不同的變化。

    1.3.3 quota配額

    對應了每個namespace儲存區的大小限制,超過配額后數據將面臨最近最少使用(LRU)的淘汰。
    持久化引擎(ldb)本身沒有配額,ldb由于自帶了mdb cache,所以也可以設置cache的配額。超過配額后,在內置的mdb內部進行淘汰。

    1.3.3.1 配額是怎樣計算的
    配額大小直接影響數據的命中率和資源利用效率,業務方需要給出一個合適的值,通常的計算方法是評估在保證一定命中率情況下所需要的記錄條數,這樣配額大小即為: 記錄條數 * 平均單條記錄大小。

    1.3.3.2 管理員如何配置配額
    單份數據情況下,業務提供的配額就是需要配置在Tair系統中的配額。但對于多備份,在系統中實際計算的配額為: 業務配額 * 備份數

    1.3.4 expireTime:過期時間

    expiredTime
    是指數據的過期時間,當超過過期時間之后,數據將對應用不可見,這個設置同樣影響到應用的命中率和資源利用率。不同的存儲引擎有不同的策略清理掉過期的數
    據。調用接口時,expiredTime單位是秒,可以是相對時間(比如:30s),也可以是絕對時間(比如:當天23時,轉換成距1970-1-1
    00:00:00的秒數)。
    小于0,不更改之前的過期時間
    如果不傳或者傳入0,則表示數據永不過期;
    大于0小于當前時間戳是相對時間過期;
    大于當前時間戳是絕對時間過期;

    1.3.5 version

    Tair中存儲的每個數據都有版本號,版本號在每次更新后都會遞增,相應的,在Tair put接口中也有此version參數,這個參數是為了解決并發更新同一個數據而設置的,類似于樂觀鎖。
    很多情況下,更新數據是先get,修改get回來的數據,然后put回系統。如果有多個客戶端get到同一份數據,都對其修改并保存,那么先保存的修改就
    會被后到達的修改覆蓋,從而導致數據一致性問題,在大部分情況下應用能夠接受,但在少量特殊情況下,這個是我們不希望發生的。
    比如系統中有一個值”1”,
    現在A和B客戶端同時都取到了這個值。之后A和B客戶端都想改動這個值,假設A要改成12,B要改成13,如果不加控制的話,無論A和B誰先更新成功,它
    的更新都會被后到的更新覆蓋。Tair引入的version機制避免了這樣的問題。剛剛的例子中,假設A和B同時取到數據,當時版本號是10,A先更新,
    更新成功后,值為12,版本為11。當B更新的時候,由于其基于的版本號是10,此時服務器會拒絕更新,返回version
    error,從而避免A的更新被覆蓋。B可以選擇get新版本的value,然后在其基礎上修改,也可以選擇強行更新。

    1.3.5.1 如何獲取到當前key的version
    get接口返回的是DataEntry對象,該對象中包含get到的數據的版本號,可以通過getVersion()接口獲得該版本號。在put時,將該
    版本號作為put的參數即可。 如果不考慮版本問題,則可設置version參數為0,系統將強行覆蓋數據,即使版本不一致。

    1.3.5.2 version是如何改變的
    Version改變的邏輯如下:
    1) 如果put新數據且沒有設置版本號,會自動將版本設置成1。
    2) 如果put是更新老數據且沒有版本號,或者put傳來的參數版本與當前版本一致,版本號自增1。
    3) 如果put是更新老數據且傳來的參數版本與當前版本不一致,更新失敗,返回VersionError。
    4) put時傳入的version參數為0,則強制更新成功,版本號自增1。

    1.3.5.3 version返回不一致的時候,該如何處理
    如果更新所基于的version和系統中當前的版本不一致,則服務器會返回ResultCode.VERERROR。
    這時你可以重新get數據,然后在新版本的數據上修改;或者設置version為0重新請求,以達到強制更新的效果,應用可以根據自身對數據一致性的要求
    在這兩種策略間進行選擇。

    1.3.5.4 version具體使用案例
    如果應用有10個client會對key進行并發put,那么操作過程如下:
    1) get key。如果get key成功,則進入步驟2;如果數據不存在,則進入步驟3.
    2) 在調用put的時候將get key返回的verison重新傳入put接口。服務端根據version是否匹配來返回client是否put成功。
    3) get
    key數據不存在,則新put數據。此時傳入的version必須不是0和1,其他的值都可以(例如1000,要保證所有client是一套邏輯)。因為
    傳入0,tair會認為強制覆蓋;而傳入1,第一個client寫入會成功,但是新寫入時服務端的version以0開始計數啊,所以此時version
    也是1,所以下一個到來的client寫入也會成功,這樣造成了沖突

    1.3.5.5 version分布式鎖
    Tair中存在該key,則認為該key所代表的鎖已被lock;不存在該key,在未加鎖。操作過程和上面相似。業務方可以在put的時候增加expire,已避免該鎖被長期鎖住。
    當然業務方在選擇這種策略的情況下需要考慮并處理Tair宕機帶來的鎖丟失的情況。

    1.3.5.6 什么情況下需要使用version
    業務對數據一致性有較高的要求,并且訪問并發高,那么通過version可以避免數據的意外結果。
    如果不關心并發,那么建議不傳入version或者直接傳0。

    1.4 集群部署方式

    Tair通過多種集群部署方式,來滿足各類應用的容災需求。
    下面所述的雙機房可以擴展到多機房,現階段基本還是采用的雙機房。
    現總共有4種方式:
    mdb存儲引擎適用于雙機房單集群單份,雙機房獨立集群,雙機房單集群雙份。
    rdb存儲引擎適用于雙機房單集群單份。
    ldb存儲引擎適用于雙機房主備集群,雙機房單集群單份。

    1.4.1 雙機房單集群單份

    雙機房單集群單備份數是指,該Tair集群部署在兩個機房中(也就是該Tair集群的機器分別在兩個機房), 數據存儲份數為1, 該類型集群部署示意圖如下所示。數據服務器(Dataserver)分布在兩個機房中,他們都屬于同一集群。

    使用場景:
    1) 后端有無數據源都可。
    2) 后端有數據源,且更新比例很高的場景。
    優點:
    1) 服務器存在于雙機房,任一機房宕機保持可用。
    2) 單份數據,無論應用在哪個機房,看到的都是同一個數據。
    缺點:
    1) 應用服務器會跨機房訪問。如上圖,并假設應用服務器在cm3和cm4,那么cm3的應用服務器也可能調用到cm4的tair機器,cm4的亦然。
    2) 當一邊機房出現故障時,tair中的數據會失效一半(一半這個數值是按兩邊機房tair機器數相同估計的,如果不相同,則按對應比例估算)
    該部署方式,應用在刪除數據時,只需要調用delete即可,無需調用invalid。當然,調用invalid也可,這種方式下會直接退化到delete。

    1.4.2 雙機房獨立集群

    雙機房獨立集群是指,在兩個機房中同時部署2個獨立的Tair集群,這兩個集群沒有直接關系。下圖是一個典型的雙機房獨立集部署示意圖,可以看到,cm3
    和cm4各有一個完整的tair集群(2個configserver+多個dataserver)。圖中還多了一個invalidserver的角色,
    invalidserver接收客戶端的invalid或者hide請求后,會對各機房內的集群進行delete或者hide操作,以此保障Tair中的
    數據和后端數據源保持一致的。

    適用場景:
    1) 后端必須要有數據源,否則則退化成單機房集群,Tair集群本身不做同步。
    2)
    讀寫比不能過小,不然可能會帶來Tair命中率降低。例如某個key,在數據庫中被頻繁更新,那么此時應用必須調用invalid來確保Tair和DB的
    一致性。此時應用讀Tair一直會不命中,導致整體命中率低,可能造成DB壓力比較大。 如果依然有疑問的話,請聯系 tair答疑。
    優點:
    1) 每個機房擁有獨立Tair集群,應用在哪個機房就訪問相同機房的Tair集群,不會出現跨機房調用和流量。
    2) 單邊機房故障,不會影響業務訪問tair命中率。
    缺點:
    1) 后端必須要有數據源,也就是這種部署方式下,Tair必然是當作傳統意義上的cache存在的。因為Tair mdb集群之間本身不會做數據同步,多集群間一致性保證依賴于后端數據源,如DB。
    2)
    當后端數據源數據發生更新后,業務不能直接把數據put到Tair,而是先需要調用invalid接口來失效這些對等集群中的數據(來保持各Tair集群
    的數據和后端數據源的一致性)。之后業務可以把數據put到當前Tair集群(注意:只會put到本機房的Tair集群,不會put到對端集群)或者在讀
    Tair時發生not exist的時候從后端數據源取來放入Tair。

    1.4.3 雙機房單集群雙份

    雙機房單集群雙份,是指一個Tair集群部署在2個機房中,數據保存2份,并且同一數據的2個備份不會放在同一個數據服務器上。根據數據分布策略的不同,
    還可以將同一份數據的不同備份分布到不同的機房上。該類型的集群部署方式與雙機房單集群單份數據的部署方式一樣。其不同之處,數據保存份數不一樣。該類型
    集群部署方式示意圖如下圖所示,數據服務器分別部署在兩個不同的機房里,所有的數據服務器都被相同的配置服務器管理,在邏輯上,他們構成一個獨立的集群。

    現只有tbsession集群使用了這種部署方式。
    適用場景:
    后端無數據源,臨時數據的存放,非cache。
    cache類應用推薦使用雙機房獨立集群和雙機房單集群單份部署方式。
    優點:
    1) 數據存放兩份,數據安全性有一定保障。但由于存儲引擎是mdb,數據存放在內存中,無法絕對保證數據不丟失。
    2) 當一邊機房故障時,另外一邊機房依然可以服務,并且數據不丟失。
    缺點:
    1) 如果機房間網絡出現異常情況,依然有較小幾率丟失數據。

    1.4.4 雙機房主備集群

    這種部署方式中,存在一個主集群和一個備份集群,分別在兩個機房中。如下圖所示,不妨假設CM3中部署的是主集群,CM4中部署的是備份集群。那么,在正
    常情況下,用戶只使用主集群,讀寫數據都與主集群交互。主備集群會自動同步數據(不需要業務去更新兩邊),保證兩個機房數據的最終一致性。當一個機房發生
    故障后,備集群會自動切換成主集群,提供服務,保證系統可用性。

    適用場景:
    該方式只在ldb存儲引擎中存在,也就是業務將Tair當作最終存儲使用。我們會在當前主集群存兩份數據,并由Tair異步將數據更新到備集群,確保數據安全和服務可用。
    優點:
    1) 數據安全和服務可用性高。
    2) 用戶調用方便,無需考慮多集群間數據一致性的問題。
     一 如何安裝tair:

    1. 確保安裝了automake autoconfig 和 libtool,使用automake --version查看,一般情況下已安裝
    2. 獲得底層庫 tbsys 和 tbnet的源代碼:(svn checkout http://code./svn/tb-common-utils/trunk/ tb-common-utils).
    3. 獲得tair源代碼:(svn checkout http://code./svn/tair/trunk/ tair).
    4. 安裝boost-devel庫,在用rpm管理軟件包的os上可以使用rpm -q boost-devel查看是否已安裝該庫
    5. 編譯安裝tbsys和tbnet
    6. 編譯安裝tair
    1.     tair 的底層依賴于tbsys庫和tbnet庫, 所以要先編譯安裝這兩個庫:
        取得源代碼后, 先指定環境變量 TBLIB_ROOT 為需要安裝的目錄. 這個環境變量在后續 tair 的編譯安裝中仍舊會被使用到. 比如要安裝到當前用戶的lib目錄下, 則指定 export TBLIB_ROOT="~/lib"
        進入common文件夾, 執行build.sh進行安裝. 
    1.     編譯安裝tair:
        進入 tair 目錄
        運行 bootstrap.sh
        運行 configure.  注意, 在運行configue的時候, 可以使用 --with-boost=xxxx 來指定boost的目錄. 使用--with-release=yes 來編譯release版本.
        運行 make 進行編譯
        運行 make install 進行安裝
        二 如何配置tair:
            tair的運行, 至少需要一個 config server 和一個 data server. 推薦使用兩個 config server 多個data server的方式. 兩個config server有主備之分.
        源代碼目錄中 share 目錄下有三個配置文件的樣例, 下面會逐個解說.
        configserver.conf  group.conf 這兩個配置文件是config server所需要的. 先看這兩個配置文件的配置
    1.     配置文件 configserver.conf
        [public]
        config_server=x.x.x.x:5198
        config_server=x.x.x.x:5198
        [configserver]
        port=5198
        log_file=logs/config.log
        pid_file=logs/config.pid
        log_level=warn
        group_file=etc/group.conf
        data_dir=data/data
        dev_name=eth0
        public 下面配置的是兩臺config server的 ip 和端口. 其中排在前面的是主config server. 這一段信息會出現在每一個配置文件中. 請保持這一段信息的嚴格一致.
        configserver下面的內容是本config server的具體配置:
        port 端口號, 注意 config server會使用該端口做為服務端口, 而使用該端口+1 做為心跳端口
        log_file 日志文件
        pid_file  pid文件, 文件中保存當前進程中的pid
        log_level 日志級別
        group_file 本config server所管理的 group 的配置文件
        data_dir   本config server自身數據的存放目錄
        dev_name   所使用的網絡設備名
        注意: 例子中, 所有的路徑都配置的是相對路徑. 這樣實際上限制了程序啟動時候的工作目錄. 這里當然可以使用絕對路徑. 
        注意: 程序本身可以把多個config server 或 data server跑在一臺主機上, 只要配置不同的端口號就可以.
    但是在配置文件的時候, 他們的數據目錄必須分開, 程序不會對自己的數據目錄加鎖, 所以如果跑在同一主機上的服務, 數據目錄配置相同,
    程序自己不會發現, 卻會發生很多莫名其妙的錯誤. 多個服務跑在同一臺主機上, 一般只是在做功能測試的時候使用.
    1.     配置文件 group.conf
        #group name
        [group_1]
        # data move is 1 means when some data serve down, the migrating will be start.
        # default value is 0
        _data_move=1
      
     #_min_data_server_count: when data servers left in a group less than
    this value, config server will stop serve for this group
        #default value is copy count.
        _min_data_server_count=4
        _copy_count=3
        _bucket_number=1023
        _plugIns_list=libStaticPlugIn.so
        _build_strategy=1 #1 normal 2 rack
        _build_diff_ratio=0.6 #how much difference is allowd between different rack
      
     # diff_ratio =  |data_sever_count_in_rack1 -
    data_server_count_in_rack2| / max (data_sever_count_in_rack1,
    data_server_count_in_rack2)
        # diff_ration must less than _build_diff_ratio
      
     _pos_mask=65535  # 65535 is 0xffff  this will be used to gernerate
    rack info. 64 bit serverId & _pos_mask is the rack info,
        _server_list=x.x.x.x:5191
        _server_list=x.x.x.x:5191
        _server_list=x.x.x.x:5191
        _server_list=x.x.x.x:5191
        #quota info
        _areaCapacity_list=1,1124000;   
        _areaCapacity_list=2,1124000;  
         每個group配置文件可以配置多個group, 這樣一組config server就可以同時服務于多個 group 了. 不同的 group 用group name區分
         _data_move 當這個配置為1的時候, 如果發生了某個data server宕機,
    則系統會盡可能的通過冗余的備份對數據進行遷移. 注意, 如果 copy_count 為大于1的值, 則這個配置無效, 系統總是會發生遷移的.
    只有copy_count為1的時候, 該配置才有作用. 
         _min_data_server_count  這個是系統中需要存在的最少data server的個數.  當系統中可正常工作的data server的個數小于這個值的時候, 整個系統會停止服務, 等待人工介入
         _copy_count  這個表示一條數據在系統中實際存儲的份數. 如果tair被用作緩存, 這里一般配置1.
    如果被用來做存儲, 一般配置為3。 當系統中可工作的data server的數量少于這個值的時候, 系統也會停止工作. 比如
    _copy_count 為3, 而系統中只有 2 臺data server. 這個時候因為要求一條數據的各個備份必須寫到不同的data
    server上, 所以系統無法完成寫入操作, 系統也會停止工作的.
         _bucket_number  這個是hash桶的個數, 一般要 >> data server的數量(10倍以上). 數據的分布, 負載均衡, 數據的遷移都是以桶為單位的.
         _plugIns_list  需要加載的插件的動態庫名
         _accept_strategy  默認為0,ds重新連接上cs的時候,需要手動touch group.conf。如果設置成1,則當有ds重新連接會cs的時候,不需要手動touch group.conf。 cs會自動接入該ds。
         _build_strategy  在分配各個桶到不同的data server上去的時候所采用的策略. 目前提供兩種策略.
    配置為1 則是負載均衡優先, 分配的時候盡量讓各個 data server 的負載均衡. 配置為 2 的時候, 是位置安全優先,
    會盡量將一份數據的不同備份分配到不同機架的機器上. 配置為3的時候,如果服務器分布在多個機器上,那么會優先使用位置安全優先,即策略2.
    如果服務器只在一個機架上,那么退化成策略1,只按負載分布。
         _build_diff_ratio 這個值只有當 _build_strategy 為2的時候才有意義.
    實際上是用來表示不同的機架上機器差異大小的. 當位置安全優先的時候, 如果某個機架上的機器不斷的停止服務, 必然會導致負載的極度不平衡.
     當兩個機架上機器數量差異達到一定程度的時候, 系統也不再繼續工作, 等待人工介入.
         _pos_mask  機架信息掩碼. 程序使用這個值和由ip以及端口生成的64為的id做與操作, 得到的值就認為是位置信息.
     比如 當此值是65535的時候 是十六進制 0xffff. 因為ip地址的64位存儲的時候采用的是網絡字節序, 最前32位是端口號,
    后32位是網絡字節序的ip地址. 所以0xffff 這個配置, 將認為10.1.1.1 和 10.2.1.1 是不同的機架.
         _areaCapacity_list  這是每一個area的配額信息. 這里的單位是 byte. 需要注意的是,
    該信息是某個 area 能夠使用的所有空間的大小. 舉個具體例子:當copy_count為3 共有5個data server的時候,
    每個data server上, 該area實際能使用的空間是這個值/(3 * 5). 因為fdb使用mdb作為內部的緩存,
    這個值的大小也決定了緩存的效率.
    1.     data server的配置文件
        [public]
        config_server=172.23.16.225:5198
        config_server=172.23.16.226:5198
        [tairserver]
        storage_engine=mdb
        mdb_type=mdb_shm
        mdb_shm_path=/mdb_shm_path01
        #tairserver listen port
        port=5191
        heartbeat_port=6191
        process_thread_num=16
        slab_mem_size=22528
        log_file=logs/server.log
        pid_file=logs/server.pid
        log_level=warn
        dev_name=bond0
        ulog_dir=fdb/ulog
        ulog_file_number=3
        ulog_file_size=64
        check_expired_hour_range=2-4
        check_slab_hour_range=5-7
        [fdb]
        # in
        # MB
        index_mmap_size=30
        cache_size=2048
        bucket_size=10223
        free_block_pool_size=8
        data_dir=fdb/data
        fdb_name=tair_fdb
        下面解釋一下data server的配置文件:
        public 部分不再解說
        storage_engine 這個可以配置成 fdb 或者 mdb.  分別表示是使用內存存儲數據(mdb)還是使用磁盤(fdb).
        mdb_type 這個是兼容以前版本用的, 現在都配成mdb_shm就可以了
        mdb_shm_path 這個是用作映射共享內存的文件.
        port data server的工作端口
        heartbeat_port data server的心跳端口
        process_thread_num 工作線程數.  實際上啟動的線程會比這個數值多, 因為有一些后臺線程.  真正處理請求的線程數量是這里配置的.
        slab_mem_size 所占用的內存數量.  這個值以M為單位, 如果是mdb, 則是mdb能存放的數據量, 如果是fdb, 此值無意義
        ulog_dir 發生遷移的時候, 日志文件的文件目錄
        ulog_file_number 用來循環使用的log文件數目
        ulog_file_size 每個日志文件的大小, 單位是M
        check_expired_hour_range 清理超時數據的時間段.  在這個時間段內, 會運行一個后臺進程來清理mdb中的超時數據.  一般配置在系統較空閑的時候
        check_slab_hour_range 對slap做平衡的時間段.  一般配置在系統較空閑的時候
        index_mmap_size fdb中索引文件映射到內存的大小, 單位是M
        cache_size fdb中用作緩存的共享內存大小, 單位是M 
        bucket_size fdb在存儲數據的時候, 也是一個hash算法, 這兒就是hash桶的數目
        free_block_pool_size 這個用來存放fdb中的空閑位置, 便于重用空間
        data_dir fdb的數據文件目錄
        fdb_name fdb數據文件名
        三 運行前的準備:
        因為系統使用共享內存作為數據存儲的空間(mdb)或者緩存空間(fdb), 所以需要先更改配置, 使得程序能夠使用足夠的共享內存.  scripts 目錄下有一個腳本 set_shm.sh 是用來做這些修改的, 這個腳本需要root權限來運行.
        四 如何啟動集群:
        在完成安裝配置之后, 可以啟動集群了.  啟動的時候需要先啟動data server 然后啟動cofnig server.
     如果是為已有的集群添加dataserver則可以先啟動dataserver進程然后再修改gruop.conf,如果你先修改group.conf
    再啟動進程,那么需要執行touch group.conf;在scripts目錄下有一個腳本 tair.sh 可以用來幫助啟動 tair.sh
    start_ds 用來啟動data server.  tair.sh start_cs 用來啟動config server.
     這個腳本比較簡單, 它要求配置文件放在固定位置, 采用固定名稱.  使用者可以通過執行安裝目錄下的bin下的 tair_server
    (data server) 和 tair_cfg_svr(config server) 來啟動集群.

    Tair用戶指南

    本文檔介紹了Tair客戶端的工作原理,以及Java和c++客戶端的使用方法和接口介紹。

    工作原理

    Tair是一個分布式的key/value存儲系統,數據往往存儲在多個數據節點上。客戶端需要決定數據存儲的具體節點,然后才能完成具體的操作。

    Tair的客戶端通過和configserver交互獲取這部分信息。configserver會維護一張表,這張表包含hash值與存儲其對應數據的節點的對照關系。客戶端在啟動時,需要先和configserver通信,獲取這張對照表。

    在獲取到對照表后,客戶端便可以開始提供服務。客戶端會根據請求的key的hash值,查找對照表中負責該數據的數據節點,然后通過和數據節點通信完成用戶的請求。

    支持的客戶端

    Tair當前支持Java http://baike.corp.taobao.com/index.php/GetClient和c++語言的客戶端。

    java客戶端使用指南

    java版本兼容性

    Tair的java客戶端需要JDK 1.5或與其兼容的環境。我們使用Sun公司的JDK 1.5在 Linux和Windows上測試過。

    依賴

    Tair客戶端使用mina(  http://mina./ )通信框架與Tair server通信,所以使用Tair java客戶端需要確保運行環境中包含mina的jar包以及其依賴的庫,mina請使用1.1.x的版本。

    配置java客戶端

    支持的配置項
    配置項名稱 類型 是否必選 默認值 說明
    configServerList List<String> configserver地址列表,ip:port格式
    groupName String group的name,一個configserver服務可以管理多個group,所以需要使用groupName加以區分
    charset String UTF-8 字符集,這個選項在將String對象序列化時使用
    compressionThreshold int 8192 壓縮閥值,單位為字節。當數據的大小超過這個閥值時,客戶端將自動采用zip壓縮算法壓縮數據,并在接受到數據時自動解壓。
    maxWaitThread int 100 最大等待線程數,當超過這個數量的線程在等待時,新的請求將直接返回超時
    timeout int 2000 請求的超時時間,單位為毫秒
    初始化Java客戶端
    // 創建config server列表
    List<String> confServers = new ArrayList<String>();
    confServers.add("CONFIG_SERVER_ADDREEE:PORT");
    confServers.add("CONFIG_SERVER_ADDREEE_2:PORT"); // 可選
    
    // 創建客戶端實例
    DefaultTairManager tairManager = new DefaultTairManager();
    tairManager.setConfigServerList(confServers);
    
    // 設置組名
    tairManager.setGroupName("GROUP_NAME");
    // 初始化客戶端
    tairManager.init();
    

    如果你的系統使用spring,那么可以使用類似下面的bean配置:

    <bean id="tairManager" class="com.taobao.tair.impl.DefaultTairManager" init-method="init">
            <property name="configServerList">
                    <list>
                            <value>CONFIG_SERVER_ADDREEE:PORT</value>
                            <value>CONFIG_SERVER_ADDREEE_2:PORT</value> <!-- 可選 -->
                    </list>
            </property>
            <property name="groupName">
                    <value>GROUP_NAME</value>
            </property>
    </bean>
    

    接口介紹

    預備知識

    由于Tair中的value除了用戶的數據外,好包括version等元信息。所以返回的用戶數據將和元數據一起封裝在DataEntry對象中。

    Tair客戶端的所有接口都不拋出異常,操作的結果狀態使用ResultCode表示。如果接口會返回數據,則返回的數據和ResultCode一起封裝在Result中。

    Result和ResultCode都包含有isSuccess方法,如果該方法返回true,則表示請求成功(當get的數據不存在時,該方法也返回 true)。

    基本接口
    • get接口

    get接口用于獲取單個數據,要獲取的數據由namespace和key指定。

    當數據存在時,返回成功,數據存放在DataEntry對象中;

    當數據不存在時,返回成功,ResultCode為ResultCode.DATANOTEXSITS,value為null。

    示例:

    Result<DataEntry> result = tairManager.get(namespace, key);
    if (result.isSuccess()) {
        DataEntry entry = result.getValue();
        if(entry != null) {
            // 數據存在
        } else {
            // 數據不存在
        }
    } else {
        // 異常處理
    }
    
    
    • mget接口

    mget接口用于批量獲取同一個namespace中的多個key對應的數據集合。mget在客戶端將key列表根據key所在的服務器分組,然后將分組后的key列表發送到對應的服務器上,發送到多個服務器這個步驟是異步的,所以需要的時間不是線性的。

    當得到返回結果時

    • 如果返回的個數為0,ResultCode為ResultCode.DATANOTEXSITS
    • 如果返回的個數小于請求的個數,ResultCode為ResultCode.PARTSUCC
    • 全部返回,則返回成功

    當有數據返回時,Result對象中的value是一個List<DataEntry>,這個List包含了所有取到的數據,每個 DataEntry都會包括請求的key,返回的value和version信息。

    • put接口

    put接口有3個簽名,分別為:

    ResultCode put(int namespace, Serializable key, Serializable value); // version為0,即不關心版本;expireTime為0,即不失效
    ResultCode put(int namespace, Serializable key, Serializable value, int version); // expireTime為0,即不失效
    ResultCode put(int namespace, Serializable key, Serializable value, int version, int expireTime);
    

    示例:

    ResultCode rc = tairManager.put(namespace, key, value);
    if (rc.isSuccess()) {
        // put成功
    } else if (ResultCode.VERERROR.equals(rc) {
        // 版本錯誤的處理代碼
    } else {
        // 其他失敗的處理代碼
    }
    
    // version應該從get返回的DataEntry對象中獲取
    // 出給使用0強制更新,否則不推薦隨意指定版本
    rc = tairManager.put(namespace, key, value, version);
    
    // 使用全參數版本的put
    rc = tairManager.put(namespace, key, value, version, expireTime);
    
    
    • delete接口

    delete接口用于刪除有namespac和key指定的value。如果請求刪除的key不存在,tair也將返回成功。

    示例:

    // 使用刪除接口
    ResultCode rc = tairManager.delete(namespace, key);
    if (rc.isSuccess()) {
        // 刪除成功
    } else {
        // 刪除失敗
    }
    
    • mdelete接口

    mdelete接口用于批量刪除數據,該接口只能刪除同一個namespace中的多條數據。其工作原理和mget接口類似。

    示例:

    // 使用批量刪除接口
    ResultCode rc = tairManager.mdelete(namespace, keys);
    if (rc.isSuccess()) {
        // 刪除成功
    } else {
        // 部分成功處理代碼
    }
    
    • incr接口

    incr和decr接口配合使用可以提供計數器的功能。使用get和put接口也能實現計數器的功能,但由于兩個操作不是原子的,很多情況下這不能滿足需求。所以我們提供了incr和decr接口,通過這兩個接口提供原子的計數器操作。

    incr接口的方法簽名為: Result<Integer> incr(int namespace, Serializable key, int value, int defaultValue, int expireTime);

    接口參數的含義為:

    參數名 含義
    namespace 計數器所在的namespace
    key 計數器的key
    value 本次增加的數量
    defaultValue 當計數器不存在時的初始化值
    expireTime 失效時間,單位為秒

    示例:

    Result<Integer> result = tairManager.incr(namespace, key, 1, 0);
    if (result.isSuccess()) {
        int rv = result.getValue(); // 這里是1
    } else {
        // 錯誤處理
    }
    
    // 將返回4
    result = tairManager.incr(namespace, key, 3, 0);
    
    // 將返回2
    result = tairManager.decr(namespace, key, 2, 0);
    
    • item接口

    item接口是對原有key/value接口的擴充,item接口將value視為一個數組,配合服務器端的支持,可以完成以下操作:

    • 向item末尾添加新的items
    • 獲取指定范圍的items
    • 刪除指定范圍的items
    • 獲取并刪除指定范圍的items
    • 獲取item的個數

    Item接口內部使用json格式,只支持基本類型,包括:

    • String
    • Long
    • Integer
    • Double

    同一個Value中的類型需要保持一致,否則將返回序列化錯誤。

    每個item可以指定maxcount,當item的條數操作指定的maxcount是,服務器將自動刪除最早插入的item。

    List<Integer> intList = new ArrayList<Integer>();
    intList.add(1);
    intList.add(2);
    
    // 添加新的itmes
    ResultCode rc = tairManager.addItems(1, key, intList, 50, 0, 0);
    
    // 獲取item的總條數
    Result<Integer> ic = tairManager.getItemCount(1, key);
    int totalCount = ic.getValue();
    
    // 獲取所有items
    Result<DataEntry> rets = tairManager.getItems(1, key, 0, totalCount);
    
    // 獲取第一個item,并將其從系統中刪除
    rets = tairManager.getAndRemove(1, key, 0, 1);
    

    C++客戶端使用指南

    數據操作接口

    put
    get
    remove

    incr
    decr

    初始化(連接到tair)

    startup

    清理

    close

    超時時間設置

    setTimeout
    超時時間意味著客戶端對單個請求的最大等待時間,即當客戶端發出一個請求后在該時間內還未收到服務端的回應即返回超時。
    各個接口的參數詳見頭文件。

    使用流程

    CTAIRClinetAPI *tairClient = new CTAIRClientAPI();
    assert(tairClient != 0);
    if ( !tairClient->startup(configserver_master,configserver_slave,group_name)){
        //沒連上,處理錯誤
    }
    
    tairClinet->put(...);
    tairClient->get(...);
    ......
    
    delete tairClient;
    
    or
    
    
    CTAIRClientAPI tairClient;
    tairClient.startup();
    
    //put
    //get
    //etc.
    
    tairClient.close(); //可選,析構時會自動清理
    
    

    錯誤代碼說明:

    對幾個常見的Tair錯誤碼做一個簡要的解釋

    0, "success"

    1, -3998 "data not exist" 數據不存在

    -3988, "data expired" 數據過期,由于tair的數據刪采用的是lazy
    delete,也就是刪除的數據不會馬上做物理刪除,而是邏輯上無法讀到,所以有時候過期數據也可能返回data not
    exist,新版本統一成了返回data not exist。

    -1, "connection error or timeout" -3989, "timeout" 超時。

    -3997, "version error" 版本錯誤,tair操作中的版本相當于一種樂觀鎖的機制,參見

    -3994, "serialize error"
    被問到次數最多的錯誤。。。Tair存儲的key和value都必須是可序列化的對象,如果是String
    ,integer等基本類型就會按照java的序列化方式進行序列化,如果是自定義的對象,需要繼承Serializable,出現這種錯誤一般是一個應
    用put了一個自定義的對象,另外一個應用找不到這個類的定義,或者put后對對象進行了修改導致。

    -3984, "migrate busy" tair的遷移的過程要保證仍然對外提供服務,因此遷移過程會分成很多輪,當遷移過程中的數據增量小到一定的閾值后,會有很小的一段時間停止寫服務,這是就會返回migrate busy,稍稍過幾秒鐘重試應該就可以成功。

    -3986, "write not on master"
    操作沒有發生在主桶上,這一般是拿到了錯誤的或者過時的對照表,當集群狀態發生變化時,client拿著老的對照表讀寫數據可能會出現這個錯誤,然后
    client就會去config
    server獲取新的對照表,因此如果有節點的變化(擴容或者節點當機下線)短暫出現這個錯誤是可以理解,如果一直報這個錯誤可能是服務端配置不正確。

    -5, "key length error" -6, "value length error" key不能超過1K value不能超過1M

    -20008, "not support"
    不支持的操作,一般是Tair客戶端的版本和服務器版本不匹配,不同的存儲引擎支持的操作也有所不同.

    TAIR命令說明

    • ./tairclient
    • 說明:輸出如下幫助信息
            ./tairclient -c configserver:port -g groupname
                -c, --configserver     	default port: 5198
                -g, --groupname        	group name
                -l, --cmd_line         	exec cmd
                -q, --cmd_file         	script file
                -h, --help             	print this message
                -v, --verbose         	print debug info
                -V, --version        	print version
      
    • ./tairclient –c configserver:port –g groupname
    • 說明:連接到指定的configserver,同時連接到指定的dataserver。 如:“./tairclient –c
      192.168.0.15 –g group_1” 或者 “./tairclient –c 192.168.0.15:6155 –g
      group_1”
    • configserver:configserver所在機器的ip號
    • port: configerserver.conf中配置的IP端口號,即configserver那臺機器開啟的端口號。
    • groupname: group.conf文件中配置的group name
    • ./tairclient -V
    • 說明:查看版本信息
    • ./tairclient –c configserver:port –g groupname –v
    • 說明:按照上述命令連接后,在進行put以及get操作的時候,每次都會打印一些調試的信息。
    • ./tairclient –h
    • 說明:打印幫助信息(和./tairclient命令的效果一樣)
    • ./tairclient –c configserver:port –g groupname –l cmd_line
    • 說明:在-l之后直接添加命令,實現put、get等。如“./tairclient –c 192.168.0.15 –g
      group_1 “put key data””。“./tairclient –c 192.168.0.15 –g group_1 “get
      key ””。
    • ./tairclient –c configserver:port –g groupname –q cmd_file
    • 說明:將命令寫進文件,然后在連接的時候通過指定命令所在的文件來執行所需的命令。如“./tairclient –c 192.168.0.15 –g group_1 –q cmdfile.txt”。
    • 在TAIR>提示符下:
    • help
    • 作用:輸出幫助信息
    • 說明:輸出如下幫助信息
      ------------------------------------------------
      SYNOPSIS   : put key data [area] [expired]
      DESCRIPTION: area   - namespace , default: 0
      expired- in seconds, default: 0,never expired
      ------------------------------------------------
      SYNOPSIS   : incr key [count] [initValue] [area]
      DESCRIPTION: initValue , default: 0
      ------------------------------------------------
      SYNOPSIS   : get key [area]
      ------------------------------------------------
      SYNOPSIS   : remove key [area]
      ------------------------------------------------
      SYNOPSIS   : stat
      DESCRIPTION: get stat info
      ------------------------------------------------
      SYNOPSIS   : delall area
      DESCRIPTION: delete all data of [area]
      ------------------------------------------------
      SYNOPSIS   : dump dumpinfo.txt
      DESCRIPTION: dumpinfo.txt is a config file of dump,syntax:
      area start_time end_time,eg:10 2008-12-09 12:08:07 2008-12-10 12:10:00
      
    • 在TAIR>提示符下 put
    • 作用:將(key,data)存至DataServer上。
    • 說明:輸出如下幫助信息
      SYNOPSIS   : put key data [area] [expired]
      DESCRIPTION: area   - namespace , default: 0
      expired- in seconds, default: 0,never expired
      
    • area: 可以通過該選項指定不同的命名空間,以int型指定,范圍在0~1024之間(包括1024),默認情況下為0。
    • expired: 數據在DataServer中存放的期限,單位秒,在有效期內對相應key進行get可以得到對應的數據,過了有效期后,對相應的key進行get將失敗,提示數據過期,默認情況為0,表示一直有效。
    • 在TAIR>提示符下 get
    • 作用:根據key值獲取對應的數據
    • 說明:輸出如下幫助信息。
      SYNOPSIS : get key [area]
      key: 希望獲取的數據對應的key值
      area:指定命名空間,獲取數據時將到相應的命名空間下取數據,默認為0。
      
    • 在TAIR>提示符下incr
    • 作用:增加計數
    • 說明:輸出如下幫助信息
      SYNOPSIS   : incr key [count] [initValue] [area]
      DESCRIPTION: initValue , default: 0
      
    • count: 本次增加的數量
    • initValue:當計數器不存在時的初始化值
    • area: 指定命名空間,默認為0。
    • 在TAIR>提示符下 stat
    • 作用:輸出一些統計信息。
    • 說明:輸出一些狀態信息,包括DataServer上的不同命名空間的一些統計信息,如get、put的次數,占據空間的大小等。
    • 在TAIR>提示符下 remove
    • 作用:移除指定的(key,data)
    • 說明:輸出如下幫助信息
      SYNOPSIS   : remove key [area]
      key: 	指定想要移除的key。
      area:	指定某個命名空間,默認值為0。
      
    • 在TAIR>提示符下 delall area
    • 作用:移除指定的命名空間的全部內容。
    • 說明:area: 指定的命名空間的值。
    • ./tair_cfg_svr
    • 說明:輸出如下信息
      -f, --config_file  config file
      -h, --help         this help
      -V, --version      version
      -f  config_file:指定configserver的配置文件
      -h:	   		 輸出上述幫助信息
      -V:			 輸出版本信息
      
    • ./tair_server
    • 說明:輸出如下信息
      -f, --config_file  config file name
      -h, --help         display this help and exit
      -V, --version      version and build time
      -f config_file:指定DataServer的配置信息
      -h:			輸出上述幫助信息
      -V:			輸出版本信息
      
    • ./parameter_printer
    • 說明:輸出一些參數的設置,如key的最大長度,area的最大值等。
    • ./stat_info_test
    • 說明:測試系統的狀態是否正常。
    • ./cst_monitor
    • 說明:找到configserver里的桶分配表,將其二進制文件轉換成txt文件并輸出。如“./cst_monitor ../configserverdir/data/group_1_server_table”。
    • ./cst_transfer
    • 說明:用法和./cst_monitor相反,將txt格式的信息轉換成二進制的信息。
    • ./sif_monitor
    • 說明:打印出configerserver的信息。如“./sif_monitor ../configserverdir/data/server_info.0”。

    4. 接口

    4.1. 接口說明

    Result<DataEntry> get(int namespace, Serializable key)
    獲取數據
    參數:
    namespace - 數據所在的namespace
    key - 要獲取的數據的key
    返回:success,數據存儲在dataentry中,或者返回失敗



    Result< List<DataEntry>> mget(int namespace, List<? extends Object> keys)
    批量獲取數據
    參數:
    namespace - 數據所在的namespace
    keys - 要獲取的數據的key列表
    返回:
    如果成功,返回的數據對象為一個Map



    ResultCode put(int namespace, Serializable key, Serializable value)
    設置數據,如果數據已經存

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 久久夜色撩人精品国产小说| 日韩欧美亚洲综合久久| 丁香五月激情综合色婷婷 | 国产一区在线播放av| 无遮挡拍拍拍免费观看| 精品久久久久久无码人妻热| 国产二区三区不卡免费| 六月丁香婷婷色狠狠久久| 福利一区二区视频在线| 欧美中文字幕无线码视频 | 精品人妻无码专区在中文字幕| 亚洲国产精品无码一区二区三区 | 成人亚欧欧美激情在线观看 | 国产老熟女狂叫对白| 国产一区二区波多野结衣| 久久综合九色综合欧洲98| 少妇AV一区二区三区无码| 国产亚洲精品VA片在线播放| 18无码粉嫩小泬无套在线观看| 人妻系列无码专区69影院| 亚洲AV无码成人精品区| 国产永久免费高清在线观看| 国产精品自产拍在线观看中文| 国产福利姬喷水福利在线观看| 丰满人妻一区二区三区视频53| 国产成人久久精品流白浆| 中文无码乱人伦中文视频在线| 人妻人人做人做人人爱| 亚洲成人资源在线观看| 少妇AV一区二区三区无码| 免费国产VA在线观看视频| 天堂中文8资源在线8| 精品午夜福利在线观看| 99在线精品国自产拍中文字幕| 国产欧美一区二区精品久久久| 少妇被粗大的猛进出69影院| 少妇高潮水多太爽了动态图| 无码国产精品一区二区免费I6| 99久久免费只有精品国产| 无码国模国产在线观看免费| 亚洲av永久无码精品水牛影视|