Tair總結(jié)整理

【轉(zhuǎn)自】http://alinuxer.sinaapp.com/?p=400

LDB

首先,我們先總結(jié)下google的LevelDB相關(guān)內(nèi)容:

影響磁盤性能的因素:

主要受限于磁盤的尋道時(shí)間唇牧,優(yōu)化磁盤數(shù)據(jù)訪問(wèn)的方法是盡量減少磁盤的IO次數(shù)罕扎。磁盤數(shù)據(jù)訪問(wèn)效率取決于磁盤IO次數(shù),而磁盤IO次數(shù)又取決于數(shù)據(jù)在磁盤上的組織方式丐重。磁盤數(shù)據(jù)存儲(chǔ)大多采用B+樹類型數(shù)據(jù)結(jié)構(gòu)腔召,這種數(shù)據(jù)結(jié)構(gòu)針對(duì)磁盤數(shù)據(jù)的存儲(chǔ)和訪問(wèn)進(jìn)行了優(yōu)化,減少訪問(wèn)數(shù)據(jù)時(shí)磁盤IO次數(shù)扮惦。

常用的數(shù)據(jù)結(jié)構(gòu)

B+樹是一種專門針對(duì)磁盤存儲(chǔ)而優(yōu)化的N叉排序樹臀蛛,以樹節(jié)點(diǎn)為單位存儲(chǔ)在磁盤中,從根開始查找所需數(shù)據(jù)所在的節(jié)點(diǎn)編號(hào)和磁盤位置崖蜜,將其加載到內(nèi)存中然后繼續(xù)查找浊仆,直到找到所需的數(shù)據(jù)。

目前數(shù)據(jù)庫(kù)多采用兩級(jí)索引的B+樹豫领,樹的層次最多三層抡柿。因此可能需要5次磁盤訪問(wèn)才能更新一條記錄(三次磁盤訪問(wèn)獲得數(shù)據(jù)索引及行ID,然后再進(jìn)行一次數(shù)據(jù)文件讀操作及一次數(shù)據(jù)文件寫操作)等恐。

但是由于每次磁盤訪問(wèn)都是隨機(jī)的洲劣,而傳統(tǒng)機(jī)械硬盤在數(shù)據(jù)隨機(jī)訪問(wèn)時(shí)性能較差,每次數(shù)據(jù)訪問(wèn)都需要多次訪問(wèn)磁盤影響數(shù)據(jù)訪問(wèn)性能鼠锈。

LSM樹可以看作是一個(gè)N階合并樹闪檬。LSM樹本質(zhì)上就是在讀寫之間取得平衡,和B+樹相比购笆,它犧牲了部分讀性能粗悯,用來(lái)大幅提高寫性能。它的原理是把一顆大樹拆分成N棵小樹同欠, 它首先寫入到內(nèi)存中(內(nèi)存沒有尋道速度的問(wèn)題样傍,隨機(jī)寫的性能得到大幅提升),在內(nèi)存中構(gòu)建一顆有序小樹铺遂,隨著小樹越來(lái)越大衫哥,內(nèi)存的小樹會(huì)flush到磁盤上。當(dāng)讀時(shí)襟锐,由于不知道數(shù)據(jù)在哪棵小樹上撤逢,因此必須遍歷所有的小樹,但在每顆小樹內(nèi)部數(shù)據(jù)是有序的。數(shù)據(jù)寫操作(包括插入蚊荣、修改初狰、刪除)都在內(nèi)存中進(jìn)行,并且都會(huì)創(chuàng)建一個(gè)新記錄(修改會(huì)記錄新的數(shù)據(jù)值互例,而刪除會(huì)記錄一個(gè)刪除標(biāo)志)奢入,這些數(shù)據(jù)在內(nèi)存中仍然還是一棵排序樹,當(dāng)數(shù)據(jù)量超過(guò)設(shè)定的內(nèi)存閾值后媳叨,會(huì)將這棵排序樹和磁盤上最新的排序樹合并腥光。當(dāng)這棵排序樹的數(shù)據(jù)量也超過(guò)設(shè)定閾值后,和磁盤上下一級(jí)的排序樹合并糊秆。合并過(guò)程中武福,會(huì)用最新更新的數(shù)據(jù)覆蓋舊的數(shù)據(jù)(或者記錄為不同版本)。在需要進(jìn)行讀操作時(shí)扩然,總是從內(nèi)存中的排序樹開始搜索艘儒,如果沒有找到聋伦,就從磁盤上的排序樹順序查找夫偶。在LSM樹上進(jìn)行一次數(shù)據(jù)更新不需要磁盤訪問(wèn),在內(nèi)存即可完成觉增,速度遠(yuǎn)快于B+樹兵拢。當(dāng)數(shù)據(jù)訪問(wèn)以寫操作為主,而讀操作則集中在最近寫入的數(shù)據(jù)上時(shí)逾礁,使用LSM樹可以極大程度地減少磁盤的訪問(wèn)次數(shù)说铃,加快訪問(wèn)速度。

Leveldb是Google開源的一個(gè)快速嘹履,輕量級(jí)的key-value存儲(chǔ)引擎腻扇,以庫(kù)的形式提供,沒有提供上層c/s架構(gòu)和網(wǎng)絡(luò)通信的功能砾嫉。Leveldb存儲(chǔ)引擎的功能如下:

  • 提供key-value存儲(chǔ)幼苛,key和value是任意的二進(jìn)制數(shù)據(jù)。數(shù)據(jù)是按照key有序存儲(chǔ)的焕刮,可以修改排序規(guī)則舶沿。
  • 只提供了Put/Get/Delete等基本操作接口,支持批量原子操作配并。
  • 支持快照功能括荡。
  • 支持?jǐn)?shù)據(jù)的正向和反向遍歷訪問(wèn)。
  • 支持?jǐn)?shù)據(jù)壓縮功能(Snappy壓縮)溉旋。
  • 支持多線程同步畸冲,但不支持多進(jìn)程同時(shí)訪問(wèn)。

LevelDB的組成:

構(gòu)成LevelDb靜態(tài)結(jié)構(gòu)的包括六個(gè)主要部分:內(nèi)存中的MemTable和Immutable MemTable以及磁盤上的幾種主要文件:Current文件,Manifest文件邑闲,log文件以及SSTable文件岩喷。如下圖所示

1

寫操作:

我們通過(guò)寫操作來(lái)綜合了解下這幾個(gè)文件:

當(dāng)應(yīng)用寫入一條Key:Value記錄的時(shí)候,LevelDb會(huì)先往log文件里追加寫入监憎,成功后將記錄插進(jìn)Memtable中纱意,這樣基本就算完成了寫入操作,因?yàn)橐淮螌懭氩僮髦簧婕耙淮未疟P順序?qū)懞鸵淮蝺?nèi)存寫入鲸阔,這是LevelDb寫入速度極快的主要原因偷霉。Log文件在系統(tǒng)中的作用主要是用于系統(tǒng)崩潰恢復(fù)而不丟失數(shù)據(jù),假如沒有Log文件褐筛,因?yàn)閷懭氲挠涗泟傞_始是保存在內(nèi)存中的类少,此時(shí)如果系統(tǒng)崩潰,內(nèi)存中的數(shù)據(jù)還沒有來(lái)得及Dump到磁盤渔扎,所以會(huì)丟失數(shù)據(jù)硫狞。為了避免這種情況,LevelDb在寫入內(nèi)存前先將操作記錄到Log文件中晃痴,然后再記入內(nèi)存中残吩,這樣即使系統(tǒng)崩潰,也可以從Log文件中恢復(fù)內(nèi)存中的Memtable倘核,不會(huì)造成數(shù)據(jù)的丟失泣侮。

當(dāng)Memtable插入的數(shù)據(jù)占用內(nèi)存到了一個(gè)界限后,需要將內(nèi)存的記錄導(dǎo)出到外存文件中紧唱,LevleDb會(huì)生成新的Log文件和Memtable活尊,原先的Memtable就成為Immutable Memtable,顧名思義漏益,就是說(shuō)這個(gè)文件的內(nèi)容是不可更改的蛹锰。新到來(lái)的數(shù)據(jù)被記入新的Log文件和Memtable,LevelDb后臺(tái)調(diào)度會(huì)將Immutable Memtable的數(shù)據(jù)導(dǎo)出到磁盤绰疤,形成一個(gè)新的SSTable文件铜犬。SSTable就是由內(nèi)存中的數(shù)據(jù)不斷導(dǎo)出并進(jìn)行Compaction操作后形成的,而且SSTable的所有文件是一種層級(jí)結(jié)構(gòu)峦睡,第一層為L(zhǎng)evel 0翎苫,第二層為L(zhǎng)evel 1,依次類推榨了,層級(jí)逐漸增高煎谍,這也是為何稱為L(zhǎng)evelDb的原因。

SSTable中的文件是Key有序的龙屉,各個(gè)Level的SSTable都是如此呐粘,但是需要注意的是:Level 0的SSTable文件(后綴為.sst)和其它Level的文件相比有特殊性:這個(gè)層級(jí)內(nèi)的.sst文件满俗,兩個(gè)文件可能存在key重疊,比如有兩個(gè)level 0的sst文件作岖,文件A和文件B唆垃,文件A的key范圍是:{bar, car},文件B的Key范圍是{blue,samecity}痘儡,那么很可能兩個(gè)文件都存在key=”blood”的記錄辕万。對(duì)于其它Level的SSTable文件來(lái)說(shuō),則不會(huì)出現(xiàn)同一層級(jí)內(nèi).sst文件的key重疊現(xiàn)象沉删,就是說(shuō)Level L中任意兩個(gè).sst文件渐尿,那么可以保證它們的key值是不會(huì)重疊的。這點(diǎn)需要特別注意矾瑰。

SSTable中的某個(gè)文件屬于特定層級(jí)砖茸,而且其存儲(chǔ)的記錄是key有序的,那么必然有文件中的最小key和最大key殴穴,這是非常重要的信息凉夯。Manifest就是記載SSTable各個(gè)文件的管理信息,比如屬于哪個(gè)Level采幌,文件名稱叫什么劲够,最小key和最大key各自是多少。

Current文件是記載當(dāng)前的manifest文件名植榕。因?yàn)樵贚evleDb的運(yùn)行過(guò)程中再沧,隨著Compaction的進(jìn)行,SSTable文件會(huì)發(fā)生變化尊残,會(huì)有新的文件產(chǎn)生,老的文件被廢棄淤堵,Manifest也會(huì)跟著反映這種變化寝衫,此時(shí)往往會(huì)新生成Manifest文件來(lái)記載這種變化,而Current則用來(lái)指出哪個(gè)Manifest文件才是我們關(guān)心的那個(gè)Manifest文件拐邪。

當(dāng)某個(gè)level下的SSTable文件數(shù)目超過(guò)一定設(shè)置值后慰毅,levelDb會(huì)從這個(gè)level的SSTable中選擇n個(gè)文件(level>0時(shí),n=1;level=0時(shí)因key有重疊扎阶,n>=1)汹胃,將其和高一層級(jí)的level+1的SSTable文件合并,這就是major compaction东臀。 對(duì)于 compaction着饥,下文具體分析。

另外惰赋,LevelDB的寫操作是線程安全的:LevelDB Write 的線程安全是通過(guò)將所有的寫入插入到一個(gè)隊(duì)列中, 然后有且僅有一個(gè)線程去消費(fèi)這個(gè)隊(duì)列來(lái)做到的. 消費(fèi)這個(gè)隊(duì)列的線程會(huì)把隊(duì)列頭部的幾個(gè)Batch合并成一個(gè)大的Batch 一起消費(fèi)掉, 也是為了提高效率.

log文件內(nèi)是key無(wú)序的宰掉,而Memtable中是key有序的呵哨,如何實(shí)現(xiàn)LevelDB的刪除操作?對(duì)于levelDb來(lái)說(shuō)轨奄,并不存在立即刪除的操作孟害,而是與插入操作相同的,區(qū)別是挪拟,插入操作插入的是Key:Value 值挨务,而刪除操作插入的是“Key:刪除標(biāo)記”,并不真正去刪除記錄玉组,而是后臺(tái)Compaction的時(shí)候才去做真正的刪除操作耘子。

讀取記錄

2

LevelDB首先會(huì)去查看內(nèi)存中的Memtable,如果Memtable中包含key及其對(duì)應(yīng)的value球切,則返回value值即可谷誓;如果在Memtable沒有讀到key,則接下來(lái)到同樣處于內(nèi)存中的Immutable Memtable中去讀取吨凑,類似地捍歪,如果讀到就返回,若是沒有讀到,那么只能萬(wàn)般無(wú)奈下從磁盤中的大量SSTable文件中查找鸵钝。因?yàn)镾STable數(shù)量較多糙臼,而且分成多個(gè)Level,首先從屬于level 0的文件中查找恩商,如果找到則返回對(duì)應(yīng)的value值变逃,如果沒有找到那么到level 1中的文件中去找,如此循環(huán)往復(fù)怠堪,直到在某層SSTable文件中找到這個(gè)key對(duì)應(yīng)的value為止(或者查到最高level揽乱,查找失敗,說(shuō)明整個(gè)系統(tǒng)中不存在這個(gè)Key)粟矿。

為何選擇是從低level到高level的查詢路徑

從信息的更新時(shí)間來(lái)說(shuō)凰棉,很明顯Memtable存儲(chǔ)的是最新鮮的KV對(duì);Immutable Memtable中存儲(chǔ)的KV數(shù)據(jù)對(duì)的新鮮程度次之陌粹;而所有SSTable文件中的KV數(shù)據(jù)新鮮程度一定不如內(nèi)存中的Memtable和Immutable Memtable的撒犀。對(duì)于SSTable文件來(lái)說(shuō),如果同時(shí)在level L和Level L+1找到同一個(gè)key掏秩,level L的信息一定比level L+1的要新或舞。也就是說(shuō),上面列出的查找路徑就是按照數(shù)據(jù)新鮮程度排列出來(lái)的蒙幻,越新鮮的越先查找映凳。同樣的key,不同的value;邏輯上理解好像levelDb中只有一個(gè)存儲(chǔ)記錄杆煞,即最新的記錄魏宽,但是在levelDb中很可能存在兩條記錄腐泻,比如記錄分別存在Level L和Level L+1中。如果同時(shí)在level L和Level L+1找到同一個(gè)key队询,level L的信息一定比level L+1的要新派桩。從道理上講呢,Level L+1的數(shù)據(jù)是從Level L 經(jīng)過(guò)Compaction后得到的蚌斩,Level L比Level L+1的數(shù)據(jù)要新鮮铆惑。

SSTable文件很多,如何快速地找到key對(duì)應(yīng)的value值

在LevelDb中送膳,在level 0和其它level中查找某個(gè)key的過(guò)程是不一樣的员魏。因?yàn)閘evel 0下的不同文件可能key的范圍有重疊,某個(gè)要查詢的key有可能多個(gè)文件都包含叠聋,這樣的話LevelDb的策略是先找出level 0中哪些文件包含這個(gè)key(manifest文件中記載了level和對(duì)應(yīng)的文件及文件里key的范圍信息撕阎,LevelDb在內(nèi)存中保留這種映射表), 之后按照文件的新鮮程度排序碌补,新的文件排在前面虏束,之后依次查找,讀出key對(duì)應(yīng)的value厦章。而如果是非level 0的話镇匀,因?yàn)檫@個(gè)level的文件之間key是不重疊的,所以只從一個(gè)文件就可以找到key對(duì)應(yīng)的value袜啃。

如果給定一個(gè)要查詢的key和某個(gè)key range包含這個(gè)key的SSTable文件汗侵,那么levelDb一般會(huì)先在內(nèi)存中的Cache中查找是否包含這個(gè)文件的緩存記錄,如果包含群发,則從緩存中讀任稀;如果不包含也物,則打開SSTable文件宫屠,同時(shí)將這個(gè)文件的索引部分加載到內(nèi)存中并放入Cache中。 這樣Cache里面就有了這個(gè)SSTable的緩存項(xiàng)滑蚯,但是只有索引部分在內(nèi)存中,之后levelDb根據(jù)索引可以定位到哪個(gè)內(nèi)容Block會(huì)包含這條key抵栈,從文件中讀出這個(gè)Block的內(nèi)容告材,在根據(jù)記錄一一比較,如果找到則返回結(jié)果古劲,如果沒有找到斥赋,那么說(shuō)明這個(gè)level的SSTable文件并不包含這個(gè)key,所以到下一級(jí)別的SSTable中去查找产艾。

Compaction操作

LevelDB的compaction操作包含minor compaction和major compaction兩種

Minor compaction 的目的是當(dāng)內(nèi)存中的memtable大小到了一定值時(shí)疤剑,將內(nèi)容保存到磁盤文件中滑绒,如下圖所示

3

從上圖可以看出,當(dāng)memtable數(shù)量到了一定程度會(huì)轉(zhuǎn)換為immutable memtable隘膘,此時(shí)不能往其中寫入記錄疑故,只能從中讀取KV內(nèi)容。immutable memtable其實(shí)是一個(gè)多層級(jí)隊(duì)列SkipList弯菊,其中的記錄是根據(jù)key有序排列的纵势。按照immutable memtable中記錄由小到大遍歷,并依次寫入一個(gè)level 0 的新建SSTable文件中管钳,寫完后建立文件的index 數(shù)據(jù)钦铁,這樣就完成了一次minor compaction。從圖中也可以看出才漆,對(duì)于被刪除的記錄牛曹,在minor compaction過(guò)程中并不真正刪除這個(gè)記錄,原因也很簡(jiǎn)單醇滥,這里只知道要?jiǎng)h掉key記錄黎比,但是這個(gè)KV數(shù)據(jù)在哪里?那需要復(fù)雜的查找,所以在minor compaction的時(shí)候并不做刪除腺办,只是將這個(gè)key作為一個(gè)記錄寫入文件中焰手,至于真正的刪除操作,在以后更高層級(jí)的compaction中會(huì)去做怀喉。

當(dāng)某個(gè)level下的SSTable文件數(shù)目超過(guò)一定設(shè)置值后书妻,levelDb會(huì)從這個(gè)level的SSTable中選擇一個(gè)文件(level>0),將其和高一層級(jí)的level+1的SSTable文件合并躬拢,這就是major compaction躲履。

在大于0的層級(jí)中,每個(gè)SSTable文件內(nèi)的Key都是由小到大有序存儲(chǔ)的聊闯,而且不同文件之間的key范圍(文件內(nèi)最小key和最大key之間)不會(huì)有任何重疊工猜。但是因?yàn)閘evel 0的文件是通過(guò)minor compaction直接生成的,所以任意兩個(gè)level 0下的兩個(gè)sstable文件可能再key范圍上有重疊菱蔬。所以在做major compaction的時(shí)候篷帅,對(duì)于大于level 0的層級(jí),選擇其中一個(gè)文件就行拴泌,但是對(duì)于level 0來(lái)說(shuō)魏身,指定某個(gè)文件后,本level中很可能有其他SSTable文件的key范圍和這個(gè)文件有重疊蚪腐,這種情況下箭昵,要找出所有有重疊的文件和level 1的文件進(jìn)行合并,即level 0在進(jìn)行文件選擇的時(shí)候回季,可能會(huì)有多個(gè)文件參與major compaction家制。

levelDb在選定某個(gè)level進(jìn)行compaction后正林,還要選擇是具體哪個(gè)文件要進(jìn)行compaction,levelDb采用輪流的方式颤殴,比如這次是文件A進(jìn)行compaction觅廓,那么下次就是在key range上緊挨著文件A的文件B進(jìn)行compaction,這樣每個(gè)文件都會(huì)有機(jī)會(huì)輪流和高層的level 文件進(jìn)行合并诅病。

接著levelDb選擇L+1層中和文件A在key range上有重疊的所有文件來(lái)和文件A進(jìn)行合并哪亿。也就是說(shuō),選定了level L的文件A,之后在level L+1中找到了所有需要合并的文件B,C,D等贤笆。合并的過(guò)程如下:

4

Major compaction的過(guò)程如下:對(duì)多個(gè)文件采用多路歸并排序的方式蝇棉,依次找出其中最小的Key記錄,也就是對(duì)多個(gè)文件中的所有記錄重新進(jìn)行排序芥永。之后采取一定的標(biāo)準(zhǔn)判斷這個(gè)Key是否還需要保存篡殷,如果判斷沒有保存價(jià)值,那么直接拋掉埋涧,如果覺得還需要繼續(xù)保存板辽,那么就將其寫入level L+1層中新生成的一個(gè)SSTable文件中。就這樣對(duì)KV數(shù)據(jù)一一處理棘催,形成了一系列新的L+1層數(shù)據(jù)文件劲弦,之前的L層文件和L+1層參與compaction 的文件數(shù)據(jù)此時(shí)已經(jīng)沒有意義了,所以全部刪除醇坝。這樣就完成了L層和L+1層文件記錄的合并過(guò)程邑跪。在major compaction過(guò)程中,判斷一個(gè)KV記錄是否拋棄的其中一個(gè)標(biāo)準(zhǔn)是:對(duì)于某個(gè)key來(lái)說(shuō)呼猪,如果在小于L層中存在這個(gè)Key画畅,那么這個(gè)KV在major compaction過(guò)程中可以拋掉。因?yàn)閷?duì)于層級(jí)低于L的文件中如果存在同一Key的記錄宋距,那么說(shuō)明對(duì)于Key來(lái)說(shuō)轴踱,有更新鮮的Value存在,那么過(guò)去的Value就等于沒有意義了谚赎,所以可以刪除淫僻。

大體了解了Level DB后稚照,讓我們來(lái)學(xué)習(xí)下Tair中的LDB昌渤。

ldb是基于leveldb開發(fā)的一款持久化產(chǎn)品桥状,作為Tair的持久化存儲(chǔ)引擎热康,適用于確實(shí)有持久化需求,richldb引擎內(nèi)嵌Mdb作為內(nèi)存KV級(jí)別cache掀泳,讀寫qps較高(萬(wàn)級(jí)別)的應(yīng)用場(chǎng)景。ldb目前線上使用的ssd機(jī)型(SSD單機(jī)讀10w qps 寫2W tps (700B測(cè)試)),因此在成本上要比緩存型產(chǎn)品高出幾倍蕾殴。在支持的數(shù)據(jù)結(jié)構(gòu)上和mdb相同笑撞,功能上ldb還支持范圍查找,但基于性能考慮钓觉,需特別謹(jǐn)慎使用茴肥。

讀流程

首先在MemTable文件中尋找,查看它的開始和結(jié)束是哪一部分荡灾,找到負(fù)責(zé)這個(gè)key的文件瓤狐,從里面把這個(gè)數(shù)字給拿出來(lái)。對(duì)每一個(gè)LO都會(huì)去找批幌,當(dāng)然如果有一步能夠找到就會(huì)提前返回础锐。對(duì)于LeveIDB,會(huì)做一些聚合荧缘,盡量讀一次盤能讀少一些皆警。

寫流程

找到數(shù)據(jù)分區(qū),存入操作指引截粗,同時(shí)把結(jié)果插入到Mdb cache里信姓。這樣的話,持久化存儲(chǔ)引擎的效率跟緩存性效率是一樣的绸罗,如果數(shù)據(jù)有訪問(wèn)熱點(diǎn)的話意推,訪問(wèn)的IP可以得到很好的保證。當(dāng)memtable寫滿后dump成Level 0上的sstable珊蟀,無(wú)數(shù)據(jù)合并菊值。Level 會(huì)循環(huán)compact range。

Ldb的新功能

加入過(guò)期時(shí)間系洛,嵌入一個(gè)datafilter邏輯俊性,得到這個(gè)數(shù)據(jù)的時(shí)候會(huì)先過(guò)濾一下,比如設(shè)置一些過(guò)期數(shù)據(jù)描扯,這個(gè)數(shù)據(jù)如果已經(jīng)過(guò)期定页,它就會(huì)跳過(guò)去,就認(rèn)為是不存在的绽诚。雖然持久化典徊,但是就想把之前數(shù)據(jù)全部清掉,然后再寫入新的恩够,這樣是有異步清理卒落。它本身的compact是自己做的,有它內(nèi)部自己的過(guò)程在level-n上做蜂桶,這個(gè)過(guò)程當(dāng)中現(xiàn)在主要做的工作就是把一些垃圾數(shù)據(jù)給清理了儡毕,在做機(jī)群變動(dòng)的時(shí)候,因?yàn)門air宕掉一臺(tái)機(jī)器會(huì)做數(shù)據(jù)的重分布,導(dǎo)致數(shù)據(jù)備份的完整性和前端服務(wù)的可用性問(wèn)題腰湾,這個(gè)過(guò)程可以把垃圾數(shù)據(jù)可以清理掉雷恃。如果按照自己的過(guò)程它不是很敏感,我們就要做高Levelcompact费坊,我們會(huì)主動(dòng)出發(fā)倒槐,加速一些range合并。使用binlog做異步跨集群數(shù)據(jù)同步附井。(這里還不是很清楚)

典型應(yīng)用場(chǎng)景

1.存儲(chǔ)黑白單數(shù)據(jù)讨越,讀qps很高,db無(wú)法承載永毅。

2.計(jì)數(shù)器功能把跨,更新非常頻繁,且數(shù)據(jù)不可丟失卷雕。

RDB

名詞解釋:

Restful協(xié)議:(Representational State Transfer节猿,資源是由URI來(lái)指定。對(duì)資源的操作包括獲取漫雕、創(chuàng)建滨嘱、修改和刪除資源,這些操作正好對(duì)應(yīng)HTTP協(xié)議提供的GET浸间、POST太雨、PUT和DELETE方法。通過(guò)操作資源的表現(xiàn)形式來(lái)操作資源魁蒜。資源的表現(xiàn)形式則是XML或者HTML囊扳,取決于讀者是機(jī)器還是人,是消費(fèi)web服務(wù)的客戶軟件還是web瀏覽器兜看。當(dāng)然也可以是任何其他的格式锥咸。)

rdb是基于redis開發(fā)另一款內(nèi)存型產(chǎn)品,tair抽取了redis內(nèi)部存儲(chǔ)引擎部分细移,支持redis所有數(shù)據(jù)結(jié)構(gòu)搏予,故rdb不僅支持key對(duì)應(yīng)一個(gè)value的結(jié)構(gòu),同時(shí)也支持key對(duì)應(yīng)多個(gè)value的結(jié)構(gòu)弧轧,結(jié)構(gòu)可以是list/map/set/zset雪侥。(注:很多同學(xué)會(huì)把value是一個(gè)map/list之類的對(duì)象和rdb支持的list/hash結(jié)構(gòu)混為一談。這里再?gòu)?qiáng)調(diào)一下精绎,tair的key和value均為可序列化對(duì)象速缨,因此如果value是map或者list之類的序列化之后的對(duì)象,這個(gè)還是屬于key-value結(jié)構(gòu)代乃,而rdb支持的list/hash/set/zset旬牲,是指一個(gè)key對(duì)應(yīng)多個(gè)value。比如:list就是key-{value1, value2, value3}。)設(shè)置限制內(nèi)存quota引谜,去除aof/vm牍陌,增加logiclock的概念,lazy清理db數(shù)據(jù)(比如想把a(bǔ)rea數(shù)據(jù)都清理掉员咽,可能對(duì)當(dāng)時(shí)運(yùn)行會(huì)有影響,當(dāng)后臺(tái)再做的時(shí)候贮预,可以根據(jù)前面訪問(wèn)的時(shí)候來(lái)比較一下logiclock贝室,來(lái)確定這個(gè)數(shù)據(jù)是不是在它的生存周期里面,如果不在生存周期里面可以做清理仿吞,就是因?yàn)檫@個(gè)數(shù)據(jù)是不存在的滑频。),特別適用容量谢礁浴(一般在M級(jí)別峡迷,50G之內(nèi)),讀寫qps高(萬(wàn)級(jí)別)的應(yīng)用場(chǎng)景你虹。由于是內(nèi)存型產(chǎn)品绘搞,因此無(wú)法保證數(shù)據(jù)的安全性,對(duì)數(shù)據(jù)安全有要求的應(yīng)用建議在后端加持久化數(shù)據(jù)源或使用ldb作為rdb的持久化傅物。實(shí)現(xiàn)了Restful協(xié)議夯辖。

1
2

典型應(yīng)用場(chǎng)景:

1.用list結(jié)構(gòu)來(lái)顯示最新的項(xiàng)目列表;

2.用sortedset來(lái)做排行榜董饰,取Top N蒿褂;

3.用set來(lái)做uniq操作,如頁(yè)面訪問(wèn)者排重卒暂;

4.使用hset來(lái)做單key下多屬性的項(xiàng)目啄栓,例如商品的基本信息,庫(kù)存也祠,價(jià)格等設(shè)置成多屬性昙楚。

典型用法

  1. rdb集群應(yīng)用,有復(fù)雜數(shù)據(jù)結(jié)構(gòu)的需求齿坷。rdb不僅支持key對(duì)應(yīng)一個(gè)value的結(jié)構(gòu)桂肌,同時(shí)也支持key對(duì)應(yīng)多個(gè)value的結(jié)構(gòu),結(jié)構(gòu)可以是list/map/set/zset永淌。

MDB

mdb是Tair最早的一款內(nèi)存型產(chǎn)品崎场,也是在公司內(nèi)部應(yīng)用最廣泛的集中式緩存。特別適用容量兴熘(一般在M級(jí)別谭跨,50G之內(nèi)),讀寫QPS高(萬(wàn)級(jí)別)的應(yīng)用場(chǎng)景。由于是內(nèi)存型產(chǎn)品螃宙,因此無(wú)法保證數(shù)據(jù)的安全性蛮瞄,對(duì)數(shù)據(jù)安全有要求的應(yīng)用建議在后端加持久化數(shù)據(jù)源(例如MySQL)

典型應(yīng)用場(chǎng)景:

  1. 用于緩存,降低對(duì)后端數(shù)據(jù)庫(kù)的訪問(wèn)壓力谆扎。
  2. 臨時(shí)數(shù)據(jù)存儲(chǔ)挂捅,分鐘級(jí)別后失效,偶爾部分?jǐn)?shù)據(jù)丟失不會(huì)對(duì)業(yè)務(wù)產(chǎn)生較大影響堂湖。
  3. 讀多寫少闲先,讀qps達(dá)到萬(wàn)級(jí)別以上。

mdb是memche系統(tǒng)无蜂,在內(nèi)存里面伺糠,真正內(nèi)存管理使用page和slab。抽樣出一個(gè)area的概念斥季,有很多應(yīng)用會(huì)共用训桶,一個(gè)應(yīng)用給第一個(gè)area,做一個(gè)邏輯分區(qū)酣倾,可以針對(duì)area獲得配額舵揭,進(jìn)行數(shù)據(jù)清除,不會(huì)影響其他的應(yīng)用灶挟,做到邏輯分區(qū)琉朽。有些應(yīng)用有些情況下,一些數(shù)據(jù)這段時(shí)間不想用稚铣,可以直接清掉箱叁,是可以支持的。

支持?jǐn)?shù)據(jù)過(guò)期的應(yīng)用惕医,會(huì)有后臺(tái)的一些邏輯來(lái)把它清理掉耕漱。它的內(nèi)存使用率會(huì)是一個(gè)問(wèn)題,所以會(huì)在一定時(shí)間去均衡slab抬伺,達(dá)到內(nèi)存使用率優(yōu)化螟够。還對(duì)它各種操作、統(tǒng)計(jì)都做了很詳細(xì)的監(jiān)控峡钓,可以實(shí)時(shí)監(jiān)控到這個(gè)集群的情況妓笙。

還有后臺(tái)進(jìn)程,后臺(tái)進(jìn)程能做兩個(gè)事情能岩,會(huì)定期對(duì)數(shù)據(jù)進(jìn)行清理寞宫。另外一個(gè)為了內(nèi)存利用率,會(huì)做一些均衡slab的管理拉鹃,達(dá)到內(nèi)存使用率的均衡辈赋。

典型用法

  1. session場(chǎng)景鲫忍。這種場(chǎng)景一般訪問(wèn)量非常高,且對(duì)響應(yīng)時(shí)間有很高的要求钥屈,對(duì)數(shù)據(jù)有一定的一致性要求悟民。后端無(wú)數(shù)據(jù)源,數(shù)據(jù)丟失對(duì)應(yīng)用影響不大篷就。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末射亏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腻脏,更是在濱河造成了極大的恐慌鸦泳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件永品,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡击纬,警方通過(guò)查閱死者的電腦和手機(jī)鼎姐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)更振,“玉大人炕桨,你說(shuō)我怎么就攤上這事】贤螅” “怎么了献宫?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)实撒。 經(jīng)常有香客問(wèn)我姊途,道長(zhǎng),這世上最難降的妖魔是什么知态? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任捷兰,我火速辦了婚禮,結(jié)果婚禮上负敏,老公的妹妹穿的比我還像新娘贡茅。我一直安慰自己,他們只是感情好其做,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布顶考。 她就那樣靜靜地躺著,像睡著了一般妖泄。 火紅的嫁衣襯著肌膚如雪驹沿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天浮庐,我揣著相機(jī)與錄音甚负,去河邊找鬼柬焕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梭域,可吹牛的內(nèi)容都是我干的斑举。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼病涨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼富玷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起既穆,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赎懦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后幻工,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體励两,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年囊颅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了当悔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踢代,死狀恐怖盲憎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胳挎,我是刑警寧澤饼疙,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站慕爬,受9級(jí)特大地震影響窑眯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澡罚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一伸但、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧留搔,春花似錦更胖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至括眠,卻和暖如春彪标,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掷豺。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工捞烟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留薄声,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓题画,卻偏偏與公主長(zhǎng)得像默辨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苍息,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • LevelDB是Google傳奇工程師Jeff Dean和Sanjay Ghemawat開源的KV存儲(chǔ)引擎缩幸,無(wú)論從...
    CatKang閱讀 4,838評(píng)論 5 25
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,168評(píng)論 2 33
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法竞思,內(nèi)部類的語(yǔ)法表谊,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法盖喷,線程的語(yǔ)...
    子非魚_t_閱讀 31,639評(píng)論 18 399
  • 江南微雨閱讀 215評(píng)論 0 0
  • 不知道大家是不是把“旅途中”當(dāng)做一個(gè)特殊的狀態(tài)爆办,意即需要做出一定的妥協(xié)和犧牲一些生活的舒適度? 反正我小時(shí)候跟爸媽...
    雯文ZOE閱讀 640評(píng)論 4 4