背景
自從五十年前關系型資料模型被發明出來後,憑借優秀的表達能力和清晰易懂的特性讓其很快在資料庫市場中嶄露頭角,迅速占領市場,成為各行各業的主流資料存儲系統。在這五十年内,資料庫架構、表達方式、存儲結構、優化器等方面都有了長足的發展,但是索引結構的發展相對緩慢了一些,更多的發展是基于現有的索引基礎去優化查詢優化器。
發展了三十年後進入網際網路和移動網際網路時代,資料規模呈爆發式增長,随即産生了非關系型資料庫(NoSQL),NoSQL 的出現補充了原有資料庫在規模上的不足,但是這些 NoSQL 的索引結構原理仍然同傳統關系資料庫類似,都是基于原有表結構建構二級索引。
無論是關系型資料庫的二級索引還是 NoSQL 資料庫的二級索引基本都是基于原有表結構的主鍵列重排,這樣都會在索引能力上存在短闆:一是最左比對原則的限制了索引功能,二是需要提前确定好查詢列,并且将要查詢列組合後建構多個二級索引,如果在查詢時出現了無法比對索引的情況則性能會大幅下降,于是就出現了深惡痛絕的慢查詢,慢查詢會嚴重影響使用者體驗和資料庫本身的穩定性。
為了解決上述問題,有一種架構是引入搜尋引擎,比如 Elasticsearch 、Solr(衰退期) 或其他雲搜尋系統等,使用搜尋引擎的反向索引來支援讀時索引:任意列的自由組合查詢,還能支援地理位置查詢、全文檢索。由于搜尋引擎是專門為查詢優化的系統,查詢性能會更加穩定一些。但是這種做法也存在一些問題,甚至有些問題很多人都沒有意識到:
- 資料的可靠性:對于資料庫而言,保證資料不丢是最核心的要求,但是對于搜尋引擎則不是,大部分搜尋引擎都存在丢資料的問題。
- 查詢結果的完整度:搜尋引擎的核心目标是查詢性能,是以會優先保證查詢性能,而非資料完整度,是以部分搜尋引擎存在為了保證延時而提前中止查詢請求的情況。
- 功能的穩定性隐患:大部分開源産品或者商業産品,為了吸引客戶是以最熱衷的是不停出新功能,部分功能在小資料量級上沒問題,但是資料量增多後,可能會有很嚴重的穩定性隐患,比如打爆記憶體,打爆CPU或者讓整個叢集卡死等等問題,最關鍵的是如果不是非常專業的專家,很難提前預估到這些隐患,最終都是在一次次的故障中慢慢摸索了解,更棘手的是永遠都不知道還有多少坑未踩過。
- 運維的複雜度:搜尋領域是一個專業性很強的領域,雖然部分産品的易用性很好,但是對于運維人員的專業性要求很高,很多人摸索了幾年還僅僅是入門,當遇到問題時仍然無法快速定位并且解決,甚至都不知道哪個環節出了問題(根本看不到更細粒度的監控名額也就無法知道到底哪個環節出了問題),而且也很難在業務上線前提前發現風險,最終的結果可能是兩敗俱傷:運維人員很累,業務的問題仍然很多。
- 架構的複雜度:為了讓資料從資料庫同步到搜尋引擎,需要引入一個同步系統,這樣至少需要管理三個系統,而且需要管理同步的狀态和時效性,這個複雜度和費用都會增加不少。另一種方案是雙寫資料庫和搜尋引擎,但是這個裡面要處理比較複雜的一緻性問題。同時,研發需要讀寫兩個不同的系統。
上面這種架構已經意識到了傳統資料庫的不足,并且找到了一種解決辦法,隻是解決辦法仍然有很大不足。
這裡為什麼不更進一步,将搜尋引擎的能力引入資料庫系統中?如果這個可以,那麼上述的問題就會迎刃而解,煙消雲散。
基于上述的思路,阿裡雲曆經十年自研的非關系型(NoSQL)結構化資料表存儲服務 Tablestore 在三年前成功引入了搜尋引擎的核心能力:反向索引、BKD 索引 等,将搜尋引擎的能力完全植入了 NoSQL 資料庫中。
這個能力在表格存儲(Tablestore)中稱為:多元索引(SearchIndex)。
至此,表格存儲具備了兩大能力:寬表和多元索引,其中寬表引擎類似于 Bigtable,主要面向的是資料的高可靠存儲,解決的是資料規模和擴充問題,而多元索引解決的是資料的查詢檢索的效率和靈活問題。
目前表格存儲的完整架構和能力大圖如下:

價值
Tablestore 的多元索引相對于傳統方案,除了彌補了上述說的資料庫加搜尋引擎方案中的所有缺點外,還在其他一些方面存在巨大的優勢:
- 一個系統,多種能力支援:既能提供資料庫級别的資料可靠性,又能提供搜尋引擎具備的豐富查詢能力。
- 應用層架構更簡單:資料存儲和查詢隻需要一個系統即可,運維、研發甚至是财務的工作都會更加簡單。
- 查詢能力豐富:支援非常豐富的查詢功能、排序和統計聚合等。可以滿足絕大部分的線上查詢和輕量級分析場景的需求。
- 性能更好:不管是存儲還是查詢性能,都要比業界開源産品更優,比如 Count 性能比業界最好的 Elasticsearch 還要快 10 倍以上。
- 和 DLA 結合提供複雜分析能力:阿裡雲資料湖分析産品 DLA 目前可以将大部分 SQL 的算子下推到多元索引中,可以大幅提升 DLA 中分析 SQL 的性能,目前 Tablestore 是 DLA 唯一可以下推 limit、agg、sort 等算子的資料系統,結合 DLA 就可以提供更加複雜的分析能力。
- ALL IN ONE 的價值:一份資料同時支援了線上寫入查詢、離線導入導出、輕量級分析和基于 DLA 的完整 SQL 分析能力。這些能力在 Tablestore 中會做多重相應隔離,避免互相影響。由于是一個系統,客戶研發、運維和财務管理上都會更加簡單。
- 研發效率提升:除了上面這些比較明顯的優勢外,還有一個很大的優勢是可以大幅提高研發效率:不再需要額外部署系統,不再需要學習多種不同系統的接口和行為,不在需要關注同步鍊路的延遲,不在需要考慮運維等等。從客戶的回報來看,使用多元索引後,一個基礎功能的研發周期可以從一個月減少到一周時間,大幅提高産品上線的速度。
功能和能力
表格存儲是阿裡雲重金打造的分布式 NoSQL 産品,核心目标是打造一款海量資料平台,可以支援線上、離線和輕量級分析。希望能基于 ALL IN ONE 的設計理念實作客戶在大規模結構化資料存儲和查詢方面的一站式需求。
多元索引在表格存儲産品中的核心定位是資料價值發現,提供了查詢和分析的能力:
查詢能力
目前多元索引在查詢方面的能力比較豐富,沒有傳統資料庫和各種其他 NoSQL 的最左比對原則限制,隻要建了索引的列就能任意列組合查詢,使用體驗上大幅提升。
同時也支援了數組類型(Array)和類似 Json 的嵌套類型,可以更容易适配各種應用層的模型,研發效率會更高一些。
除此之外,還有一個傳統資料庫不具備的能力,那就是豐富的分詞能力和全文檢索功能,全文檢索功能支援按照相關性分數排序,或者按照任意列排序結果,其中相關性算法使用了 BM25 算法。
在目前移動網際網路、物聯網和車聯網快速發展的時期,不少應用或者業務中都需要地理位置查詢,比如查詢周圍的人或者電子圍欄的需求,這個時候就需要使用地理位置查詢的功能,這個功能在多元索引中也有提供,在寫入時指定列為 GeoPoint類型,然後查詢的時候就可以使用豐富的地理位置查詢,而且地理位置查詢可以和其他索引列一起查詢或過濾,比如和時間結合。
多元索引的查詢能力基本具備了目前現存的最完整的查詢功能,由于是自研系統,如果有新的業務場景或者新的查詢需求,我們的快速研發能力也可以盡快讓新功能推出。
實時分析能力
多元索引也為線上場景提供了輕量級的實時分析的能力,主要适用在查詢延遲要求毫秒到秒級别的場景中。
- 支援基礎統計聚合:Min、Max、Sum、Avg、Count、DistinctCount、GroupBy 等。
- 支援進階統計聚合:直方圖統計、百分位統計等。
我們的部分輕量級分析功能性能相對于開源系統有 10 倍以上的性能提升。
更重要的是這些輕量級分析相關的請求在内部執行的時候會和其他線上請求隔離開,不會影響線上請求的可用性。
如果某些場景需要查詢總數或者分組等等,則可以直接使用多元索引,不用再引入其他系統。
SQL 分析能力
有些場景中需要 SQL 分析能力,但是不太在意時間,分鐘級别傳回也可以接受,這個時候可以使用多元索引 + 阿裡雲資料湖分析 DLA 實作完整分析能力。DLA 是一個 Severless 的分析系統,支援标準的 SQL 能力,可以将算子下推到底層的存儲系統或者資料庫的。目前表格存儲的多元索引實作了 DLA SQL 中大部分算子,也是 Limit 、Sort、Min、Max、Sum、Avg、Count、DistinctCount、GroupBy 等算子唯一可以下推到存儲層的資料存儲系統。
多元索引和 DLA 結合的分析功能适用于秒級到分組級延遲的複雜分析請求。而多元索引自身的輕量級分析能力适用于毫秒到秒級延遲的簡答分析場景。
更詳細的 DLA 和多元索引的使用可以參考這篇文章《
Tablestore計算下推》。
高并發導出能力
在一些場景中,客戶需要将滿足條件的資料快速的導出到外部系統,做一些其他操作,比如裝置資料導出後可能需要為這些裝置發送通知,待分析資料導出到外部的計算系統後做更負責的分析處理和報表生成等。如果在導出前,在存儲系統中就能過濾掉無用資料,快速篩選出最終的資料集合,那麼性能和成本都會更加有優勢。
為了滿足這類場景的需求,我們研發了并發導出功能:ParallelScan。該接口具備下列三個基礎能力:
- 支援完整的查詢功能:包括 Search 接口支援的所有 Query 功能。可以将無用的資料提前在存儲層過濾掉,減少要傳輸的資料量和成本,提供性能。
- 高吞吐:線上最高可以支援 1000萬行/秒的篩選導出。
- 斷點續傳:如果在讀取過程中出現錯誤,此時可以支援從出錯的位置重新讀取,具備斷點續傳能力。
上述特征也讓 ParallelScan 在下列場景中可以發揮出最大的優勢:
- 裝置中心: 有時候應用需要挑選出滿足某些條件的裝置或者App,為他們推送一些通知或者更新資訊,這個時候系統需要支援任意條件的自由組合,也要支援快速的從資料庫中拉取出大量裝置。
- 計算系統:比如 Spark、Presto、DLA 等計算系統如果出現複雜的 SQL 查詢,可以使用 ParallelScan 下推部分算子,将算子過濾後的剩餘結果快速的拉取到計算系統記憶體中做二次計算,大幅降低成本和提升性能。
動态修改 Schema 和 A/B Test
除了功能外,我們在易用性方面也在不斷投入,希望可以大幅簡化客戶的使用體驗和提升研發、運維效率等。客戶使用了多元索引後,由于多元索引是強 Schema 的産品,如果後續業務需要變更字段,比如新增、删除、修改類型、修改列名等場景時,需要先建立一個索引,等索引資料都追上後,驗證沒問題,然後再線上做變更,将線上使用的索引換到新索引上,這個過程雖然可以解決問題,但是存在兩個緻命的問題:
- 容易引發故障:可能切換的時候切換錯了索引,也有可能新索引有問題,這些都可以導緻線上服務出現問題,引發故障,産生損失。
- 效率極低:這個過程全部要靠人力去做,持續時間長,而且因為是線上變更,每一步都要認認真真,稍一不注意可能會搞錯,需要重來。
基本上每一個強 Schema 的系統都會面臨這樣的問題,這個問題雖然看起來是一個小問題,但是對于使用者而言則是一個很痛很痛的點,每個使用者每個月痛一次,如果有幾千個客戶,那麼每個月花費在這件事情上的時間和精力就會非常恐怖。為了真正的讓客戶用起來舒服,簡化使用,解客戶之痛,提升使用者的幸福度,我們推出了動态修改 Schema功能。
目前我們的動态修改 Schema 功能具備下列三大功能:
- 支援新增列、删除列、修改列類型、修改類名字、修改路由鍵等功能。
- 支援新舊索引的 A/B Test。可以将原索引的流量切部分到新索引上,用于驗證新索引的可用性和延遲情況。
- 新索引切換時智能提醒能力,避免客戶提前切換導緻的資料回退問題。
上述功能目前已經上線,開始邀測中,短短一個月時間内,已經有幾十個客戶在使用,大幅簡化了客戶的使用和降低了風險,好評不斷。預計六月份會完全對外開放。接下來我們會有一篇專門文章介紹動态修改 schema 的能力和使用。
場景
增加了多元索引後,表格存儲在一些場景中的适配度變得非常高。
訂單
對于小資料量的訂單,比如小于 2000 萬行的可以直接用 MySQL,如果更大量的資料量,甚至幾十億、幾百億行的訂單資料使用表格存儲的多元索引會更好。
某網際網路公司目前擁有上百億條曆史訂單資料,未來随着業務增長訂單量預計每年會翻倍,目前架構是基于 MySQL 的分庫分表來實作的,但是存在一些痛點:1)分庫分表越來越複雜,帶來的運維壓力也越來越大;2)慢請求越來越多,使用者的投訴不間斷。3)大客戶的查詢經常逾時。為了解決這些痛點,客戶将最新一天的訂單存儲在 MySQL,将全量訂單資料通過 DTS 實時同步到表格存儲,查詢使用多元索引功能,帶來了超出預期的好處:一是不再需要考慮未來的擴容問題;二是不再需要運維,主需要關注業務研發即可,效率大幅提升;三是查詢性能最大提升了55倍;四是徹底消除了慢請求,使用者的投訴也不再有了;五是可以直接結合 DLA 或者 MaxCompute 做更複雜的分析。
更詳細的訂單場景介紹:《
大規模訂單系統解讀-架構篇裝置中繼資料
表格存儲的多元索引在去年新推出了并發導出功能,結合之前的特性,使表格存儲在裝置中繼資料管理方面具備了很大的競争力。
某公司擁有幾百億裝置 APP 資訊,這些裝置資訊會實時更新,每秒更新最大會達到 50萬行/s,當有活動或者突發事件時,需要快速圈選出目标APP進行消息推送,圈選的時候需要 具備 1 分鐘内從幾百億裝置中圈選出 2 億台裝置的能力。目前架構中多套系統組合使用,存在一些痛點:1)系統衆多,包括了多套存儲和查詢系統、大資料計算系統等,管理複雜,成本高昂。2)時效性查,大規模圈選都是小時級别,滿足不了日益增長的營運需求。3)随着業務增長更新量越來越大,原有系統瓶頸越來越大。客戶經過半年調研後,将整個系統搬遷到了表格存儲,利用多元索引的查詢和導出能力做實時查詢和線上圈選,帶來了超出預期的效果:1)系統數量減少到一個系統,研發和運維複雜度大幅降低,穩定性更高;2)圈選時效性從小時級别降低到分鐘級别。3)更新速率可以線性擴充,不在成為瓶頸。
消息
消息類型存儲(IM、Feed流、通知等)是表格存儲上客戶量最多的的場景之一,表格存儲的高可靠存儲、實時擴充能力、自增列功能可以大幅簡化存儲庫、同步庫架構以及多元索引提供全方位查詢能力讓消息資料可以一站式解決存儲、同步和搜尋的所有需求。
基于上述優勢,阿裡巴巴集團内部的大部分 IM 系統的存儲、同步和搜尋系統都基于表格存儲,比如内部的釘釘,外部的衆多網際網路和物聯網客戶等。
下圖是一個經典的消息架構圖:
最後
多元索引目前支援阿裡雲官網控制台或者SDK建立,如果是首次使用,可以參考多元索引快手入門文章,即将釋出。
我們有一個釘釘公開交流群,大家可以加入保持一個更好的溝通交流,釘釘群号:23307953。
對于重要客戶我們會免費提供專家服務群,在群裡面會有表格存儲各個子產品的核心研發專家,會第一時間解決技術或者穩定性上的問題,為客戶提供一個絕佳的使用體驗。