海量结构化数据存储技术揭秘:Tablestore存储和索引引擎详解
前言
表格存儲Tablestore是阿里云自研的面向海量結(jié)構(gòu)化數(shù)據(jù)存儲的Serverless NoSQL多模型數(shù)據(jù)庫。Tablestore在阿里云官網(wǎng)上有各種文檔介紹,也發(fā)布了很多場景案例文章,這些文章收錄在這個合集中
《表格存儲Tablestore權(quán)威指南》。值得一提的是,Tablestore可以支撐海量的數(shù)據(jù)規(guī)模,也提供了多種索引來支持豐富的查詢模式,同時作為一個多模型數(shù)據(jù)庫,提供了多種模型的抽象和特有接口。本文主要對Tablestore的存儲和索引引擎進行介紹和解讀,讓大家對Tablestore引擎層的原理和能力,索引的作用和使用方式等有一個認識。
基本架構(gòu)
Tablestore是一款云上的Serverless的分布式NoSQL多模型數(shù)據(jù)庫,提供了豐富的功能。假設(shè)用戶可以采用各種開源組件搭建一套類似服務(wù),可以說是成本非常高昂,而使用Tablestore僅需在控制臺上創(chuàng)建一個實例即可享受全部功能,而且是完全按量計費,可以說是0門檻。
整體架構(gòu)如下圖所示,本文不展開敘述每個模塊的功能。
在服務(wù)端引擎層中,存在兩個引擎:存儲引擎和索引引擎。這兩個引擎的數(shù)據(jù)結(jié)構(gòu)和原理不同,為了方便讀者理解,本文將這兩個引擎稱為表引擎(Table)和多元索引引擎(Searchindex)。整體來說,引擎層是基于LSM架構(gòu)和共享存儲(盤古),支持自動的Sharding和存儲計算分離。
表引擎
表引擎的整體架構(gòu)類似于Google的BigTable,在開源領(lǐng)域的實現(xiàn)有HBase等。
數(shù)據(jù)模型可以定義為寬行模型,如下圖所示。其中不同的分區(qū)可以加載到不同的機器上,實現(xiàn)水平擴展:
首先說明一下為什么Tablestore的主鍵可以包含多個主鍵列,而像HBase只有一個RowKey。這里有幾點:
這個模型具有這樣的一些優(yōu)勢:
這個模型也有一些劣勢:
數(shù)據(jù)查詢依賴主鍵。可以把這個數(shù)據(jù)模型理解為SortedMap,大家知道,在SortedMap上只能做點查和順/逆序掃描,比如以下查詢方式:
那么在實際業(yè)務(wù)中,主鍵查詢常常不能滿足需求,而使用Filter在數(shù)據(jù)規(guī)模大的情況下效率很低,怎么解決這一問題呢?
上面提到,數(shù)據(jù)查詢的效率與底層掃描的數(shù)據(jù)量正相關(guān),而Filter模式慢在符合條件的數(shù)據(jù)太分散,必須掃描大量的數(shù)據(jù)并從中篩選。那么解決這一問題也就有兩種思路:
全局二級索引
全局二級索引采用的仍然是表引擎,給主表建立了全局二級索引后,相當于多了一張索引表。這張索引表相當于給主表提供了另外一種排序的方式,即針對查詢條件預先設(shè)計了一種數(shù)據(jù)分布,來加快數(shù)據(jù)查詢的效率。索引的使用方式與主表類似,主要的查詢方式仍然是上面講的主鍵點查,主鍵范圍查,主鍵前綴范圍查。常見的關(guān)系型數(shù)據(jù)庫的二級索引也是類似的原理。
列舉一個最簡單的例子,比如我們有一張表存儲文件的MD5和SHA1值,表結(jié)構(gòu)如下:
| oss://abc/files/1.txt | 0cc175b9c0f1b6a831c399e269772661 | 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 |
| oss://abc/files/2.txt | 92eb5ffee6ae2fec3ad71c777531578f | e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98 |
| oss://abc/files/3.txt | 4a8a08f09d37b73795649038408b5f33 | 84a516841ba77a5b4648de2cd0dfcb30ea46dbb4 |
通過這張表,我們可以查詢文件對應(yīng)的MD5和SHA1值,但是通過MD5或SHA1反查文件名卻不容易。我們可以給這張表建立兩張全局二級索引表,表結(jié)構(gòu)分別為:
索引1:
| 0cc175b9c0f1b6a831c399e269772661 | oss://abc/files/1.txt |
| 4a8a08f09d37b73795649038408b5f33 | oss://abc/files/3.txt |
| 92eb5ffee6ae2fec3ad71c777531578f | oss://abc/files/2.txt |
索引2:
| 84a516841ba77a5b4648de2cd0dfcb30ea46dbb4 | oss://abc/files/3.txt |
| 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 | oss://abc/files/1.txt |
| e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98 | oss://abc/files/2.txt |
| ? | ? |
為了確保主鍵的唯一性,全局二級索引中,會將原主鍵的主鍵列也放到主鍵列中,比如上面的FilePath列。有了上面兩張索引表,就可以通過主鍵前綴范圍查的方式里精確定位某個MD5/SHA1對應(yīng)的文件名了。
多元索引引擎
多元索引引擎相比于表引擎,底層增加了倒排索引,多維空間索引等,支持多條件組合查詢、模糊查詢、地理空間查詢,以及全文索引等,還提供一些統(tǒng)計聚合能力(統(tǒng)計聚合功能待發(fā)布)。因為功能較單純的二級索引更加豐富,而且一個索引就可以滿足多種維度的查詢,因此命名為多元索引。
上面在講解決Filter模式查詢慢的問題時,提到倒排索引加快了數(shù)據(jù)篩選的速度,因為記錄了某列的Value到符合條件的行的映射,Value -> List 。實際上,倒排索引這一方式,不僅可以解決單列值的檢索問題,也可以解決多條件組合查詢的問題。
我們舉一個訂單場景的例子,比如下表為一個訂單記錄:
| o0000000000 | c49f5fd5aba33159accae0d3ecd749a7 | c0019 | 消陳九 | s0020 | 售楚十 | p0003004 | vivo x21 | vivo | 手機 | 2018-07-17 21:00:00 | ? | 否 | 2498.99 | 2 | 4997.98 |
上面一共16個字段,我們希望按照任意多個字段組合查詢,比如查詢某一售貨員、某一產(chǎn)品類型、單價在xx元之上的所有記錄。可以想到,這樣的排列組合會有非常多種,因此我們不太可能預先將任何一種查詢條件的數(shù)據(jù)放到一起,來加快查詢的效率,這需要建立很多的全局二級索引。而如果采用Filter模型,又很可能需要掃描全表,效率不高。折中的方式是,可以先對某個字段建立二級索引,縮小數(shù)據(jù)范圍,再對其中數(shù)據(jù)進行Filter。那么有沒有更好的方式呢?
多元索引可以很好的解決這一問題,而且只需要建立一個多元索引,將所有可能查詢的列加入到這個多元索引中即可,加入的順序也沒有要求。多元索引中的每一列默認都會建立倒排,倒排就記錄了Value到List的映射。針對多列的多個條件,在每列的倒排表中找到對應(yīng)的List,這個稱為一個倒排鏈,而篩選符合多個條件的數(shù)據(jù)即為計算多個倒排鏈的交并集,這里底層有著大量的優(yōu)化,可以高效的實現(xiàn)這一操作。因此多元索引在處理多條件組合查詢方面效率很高。
此外,多元索引還支持全文索引、模糊查詢、地理空間查詢等,以地理空間查詢?yōu)槔?#xff0c;多元索引通過底層的BKD-Tree結(jié)構(gòu),支持高效的查詢一個地理多邊形內(nèi)的點,也支持按照地理位置排序、聚合統(tǒng)計等。
索引選擇
不是一定需要索引
全局二級索引還是多元索引
關(guān)于使用多元索引還是全局二級索引,也有另外一篇文章描述:《Tablestore索引功能詳解》。
除了全局二級索引之外,后續(xù)還會推出本地二級索引(LocalIndex),推出后再進行詳細介紹。
常見組合方案
豐富的查詢功能當然是業(yè)務(wù)都希望具備的,但是在數(shù)據(jù)規(guī)模很大的情況下,靈活的查詢意味著成本。比如萬億行數(shù)據(jù)的規(guī)模,對于表引擎來說,因為水平擴展能力很強,成本也很低,問題不大,但是建立多元索引,費用就會非常高昂。全局二級索引成本較低,但是只適合固定維度的查詢。
常見的超大規(guī)模數(shù)據(jù),都帶有一些時間屬性,比如大量設(shè)備產(chǎn)生的數(shù)據(jù)(監(jiān)控數(shù)據(jù)),或者人產(chǎn)生的數(shù)據(jù)(消息、行為數(shù)據(jù)等),這類數(shù)據(jù)非常適合采用Tablestore存儲。對這類數(shù)據(jù)建立索引,會有一些組合方案:
對元數(shù)據(jù)表建立多元索引,全量數(shù)據(jù)表不建立索引或采用全局二級索引。
熱數(shù)據(jù)建立多元索引,老數(shù)據(jù)不建立索引或者采用全局二級索引:
總結(jié)
本文對Tablestore的存儲和索引引擎進行了介紹和解讀,并在如何選擇和應(yīng)用索引方面給了一些參考,目的是加深大家對Tablestore的認識和理解,更好的應(yīng)用Tablestore來解決業(yè)務(wù)需求。如果有疑問或需求,或者希望進一步技術(shù)探討,歡迎大家加入Tablestore官方的釘釘技術(shù)交流群,群號11789671。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的海量结构化数据存储技术揭秘:Tablestore存储和索引引擎详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Aliyun Serverless VS
- 下一篇: 神龙架构没那么难理解—图解世界领先的阿里