雲原生 Serverless Database 使用體驗

阿里巴巴雲原生發表於2021-12-29


作者 | 李欣

近十年來網際網路技術得到了飛速的發展,越來越多的行業加入到了網際網路的矩陣,由此帶來了更為豐富且複雜的業務場景需求,這對於資料應用系統的效能無疑是巨大的挑戰。​

關係型資料庫 MySQL 是應用系統中最廣泛使用的資料庫產品,擁有強大的資料查詢和強事務處理能力。在如今的雲時代,應用系統逐漸演進到基於雲原生 Serverless 架構去進行搭建,因為它具有低成本、高彈性的優勢。但基於 MySQL 的資料儲存在 Serverless 架構體系下仍存在一些明顯的不足:

  1. 彈性擴充套件能力差。Serverless 場景中一個重要特點是應用負載具有顯著的波峰波谷。當面臨流量洪峰時,DBA 又需要手動對叢集進行擴容以避免叢集被打爆;而適逢流量低谷時,則需要對叢集進行縮容以節省成本。
  2. 運維複雜度高。MySQL 搭建需要進行購置叢集、安裝服務、管理連線。業務上線後還要關注資料安全、服務可用性、響應時間等等,用於叢集運維的時間佔比會變高,無法把更多的精力專注於業務研發上。
  3. 成本高。通常 DBA 需要預估業務規模來事先設定資料庫初始容量,當業務請求量未達到預估值時,叢集中的資源會一直處於閒置狀態,造成資源浪費。​

    Serverless DataBase

MySQL 支援的關係模型和其強事務的特性,使其在應用系統中有非常重要的位置,是目前不可完全替代的儲存元件之一。但若一味地依賴 MySQL 又會使得應用系統無法完全 Serverless 化,不能享受 Serverless 帶來的極致彈性。

在阿里內部我們有一些新的架構實踐,那些需要強事務處理的資料仍舊使用關係表儲存,而對於非強事務表資料儲存,我們則設計出了一款擁有極致彈性的 Serverless 表儲存。

關於 Serverless 資料庫產品,我們的設計要求是必須具備以下幾個特徵:

  • 完全彈性。可根據應用負載自動彈性擴縮容,這一特性可為使用者帶來更經濟的計費模式和更絲滑的體驗。
  • 按量計費。Serverless 資料庫的使用成本主要來自於計算成本和儲存成本。使用者只需為業務實際產生的儲存單元和響應單元付費,節省成本。
  • 零運維。即開即用,無需管理容量、水位、軟體升級、核心優化等運維事項,真正讓研發專注於業務開發。

Serverless 架構在諸多業務場景中都有廣泛的應用實踐。例如世紀聯華集團在其核心的電商業務中,針對自建 IDC 機房遇到的資源難以預算、系統部署困難等痛點問題,將業務實現全面上雲並逐步改造為全 Serverless 架構的中臺模式。

世紀聯華集團採用了函式計算+ API 閘道器+ Tablestore 方案,輕鬆支撐起了 6.18、雙 11 等大促活動。其中,表格儲存 Tablestore 作為世紀聯華電商系統的雲上 Serverlesss 架構中的核心儲存,具備極致彈性、免運維、成本低等優勢。

表格儲存 Tablestore 簡介

表格儲存 Tablestore 於 2009 年阿里雲成立之初便立項研發,基於底層飛天平臺從零開始構建,是一款多模型、多引擎的 Serverless 表儲存。在公共雲上輸出了國內外 30 多個區域,擁有 1.5 萬伺服器規模和 200PB 儲存規模,是阿里雲眾多商業化產品的底層核心儲存。

同時線上下已輸出到金融、能源、電力、物流、醫療、政企等行業,服務於公共雲 1000+ 企業客戶和 500+ 線下專案。

表格儲存 Tablestore 具備 HBase 和 ElasticSearch 的融合功能,擁有極致彈性體驗、免運維、即開即用的特性,支援 GB 到 PB 的彈性儲存和 十萬級 TPS 服務能力的無感知擴充套件。支撐海量的表資料的同時,提供豐富的資料檢索與分析能力,是集儲存、搜尋和分析多功能一體的一站式結構化資料儲存平臺。

表格儲存 Tablestore 的整體架構如下圖所示:


Tablestore 架構圖

表格儲存提供了多種資料模型,主要包括寬表模型(Widecolumn)、訊息模型(Timeline)和時序模型(Timeseries)。

  • 寬表模型主要承載表結構資料儲存,例如電商訂單資料。
  • 訊息模型主要承載訊息資料儲存,例如 IM/Feeds 訊息。
  • 時序模型主要承載時序資料儲存,例如物聯網裝置時序資料。

下面我們將以電商訂單場景為例子,帶大家體驗基於 Tablestore 的寬表模型構建一個 Serverless 的訂單儲存系統。​

Tablestore 體驗

1、準備工作

在體驗 Tablestore 帶來的極致彈性之前,需要準備如下幾個步驟:

(1)建立一個阿里雲賬號,並獲取到阿里雲賬號的 AK。_(雲賬號 AK 是訪問所有云服務包括 Tablestore 的金鑰,後續需要通過 AK 來訪問 Tablestore 服務)。_

(2)下載並啟動 Tablestore 提供的命令列工具 Tablestore CLI,命令列工具提供一些簡單的指令來管理表格儲存服務。

首先通過 config 命令配置連線金鑰並通過 enable_service 命令開通 Tablestore 服務:

config --id accessKeyID --key accessKeySecretenable_service

(3)通過 create_instance 命令建立一個例項:

create_instance -d "order storage" -n serverless-db -r cn-hangzhou

例項相當於 MySQL 資料庫的概念,例項建立後無需思慮例項所在物理機叢集的水位,只需專注開發業務邏輯即可。同時例項上的讀寫和儲存均為按量計費,若無讀寫無儲存,實際則不會產生任何費用。

至此,一個能夠支援 GB 到 PB 儲存的、無併發限制、零運維、完全彈性的 Serverless DataBase 就建立完成了。

2、建立表

寬表模型是(Widecolumn) 是 Schema-free 的一種資料表,與關係型資料庫 MySQL 不同的是,建立一張表 Widecolumn 模型的資料表僅需要定義主鍵結構,並不需要定義屬性列結構。

例如一張訂單表 order 的表結構如下圖表格所示:

|

id(PrimaryKey)cNamepTypesIdtotal_Price......
資料型別STRINGSTRINGSTRINGSTRINGDOUBLE......
業務含義訂單ID消費者姓名訂單商品型別售貨員ID訂單總金額......

建立一張寬表模型的訂單表,屬性列資訊無需定義,只需定義訂單表主鍵 id ,命令如下:

create_instance -d "order storage" -n serverless-db -r cn-hangzhou

執行 create 命令後成功建立一張訂單寬表,剛建立的訂單寬表會被初始化 1 個資料分割槽。

隨著訂單資料量的增加或訪問量的增加,寬表模型會根據第一主鍵的分佈範圍_(上述資料模型中即是訂單ID)_分裂擴充套件成多個資料分割槽平均分佈到多臺物理機上以支援更大的資料規模_(TB 甚至 PB)_和讀寫吞吐_(十萬 TPS 以上)_,整個擴充套件過程完全由服務端自動完成,無需人工干預。

3、資料匯入

模擬生成了 100 萬條樣例訂單資料,並通過 import 命令批量匯入到 order 表中。單資料分割槽的寫入速度可以達到幾萬行/s,隨著分割槽擴充套件,寫入吞吐還可以進一步提高。

import -i orderDataFile -l 1000000
Current speed is: 10000 rows/s. Total succeed count 10000, failed count 0.Current speed is: 12600 rows/s. Total succeed count 22600, failed count 0.......Current speed is: 9200 rows/s. Total succeed count 1000000, failed count 0.Import finished, total count is 1000000, failed 0 rows.

4、訂單查詢

使用 get 命令按照訂單號(id)單行查詢寬表模型,得到一條訂單資料。get 命令只能夠基於 rowKey 來進行單行查詢。

查詢一條訂單示例:
id = "0000005be2b43dd134eae18ebe079774"

get --pk '["0000005be2b43dd134eae18ebe079774"]'
+----------------------------------+-------+--------+---------+-------------+---------------+--------+--------+----------+--------+---------+-------+-------+--------+------------+| order_id | cId | cName | hasPaid | oId | orderTime | pBrand | pCount | pId | pName | pPrice | pType | sId | sName | totalPrice |+----------------------------------+-------+--------+---------+-------------+---------------+--------+--------+----------+--------+---------+-------+-------+--------+------------+| 0000005be2b43dd134eae18ebe079774 | c0015 | 消週五 | false | o0035062633 | 1507519847532 | 小米 | 3 | p0005003 | 小米 6 | 2299.21 | 手機 | s0017 | 售鄭七 | 6897.63 |+----------------------------------+-------+--------+---------+-------------+---------------+--------+--------+----------+--------+---------+-------+-------+--------+------------+

5、訂單檢索與統計

訂單場景中經常會出現依賴多條件組合篩選,這種情況下需要依賴 Tablestore 的多元索引特性。多元索引是 Tablestore 提供的類似 Elasticsearch 的表資料索引,支援豐富的查詢方式和資料聚合能力,可在多個列上分別建立索引。和 MySQL 中的聯合索引不同的是,多元索引可根據任意欄位組合查詢,不會按照多列的最左字首來匹配。

例如我們在 id、pName、totalPrice 等欄位上分別建立索引,採用倒排索引、分詞、BKDTree 等資料結構,提供了精確查詢、全文檢索、範圍查詢等查詢能力。另外,多元索引也支援按欄位分組、多欄位排序以及統計聚合能力。

使用 create_search_index 命令在寬表上建立多元索引,起到查詢加速的作用。

create_search_index -t order -n order_index{ "IndexSetting": null, "FieldSchemas": [{ "FieldName": "id", "FieldType": "KEYWORD", "Index": true, "EnableSortAndAgg": true, "Store": true },{ "FieldName": "pName", "FieldType": "TEXT", "Index": true, "EnableSortAndAgg": false, "Store": true },{ "FieldName": "totalPrice", "FieldType": "DOUBLE", "Index": true, "EnableSortAndAgg": true, "Store": true } ..._//其他欄位_ ] }​

Tablestore 支援 SQL 查詢能力,相容了 MySQL 的查詢語法,並且儘量保留了關係型資料庫的使用習慣。SQL 能夠自動選擇索引並進行查詢加速,通過多元索引的查詢加速,在百億資料規模下也具備了毫秒級延遲查詢的能力。

根據 sName、pBrand、pName 三個欄位條件進行訂單檢索:

select * from order where sName = "售週五" and pBrand = "小米" and pName like "紅米%"limit 3;
+----------------------------------+-------+--------+---------+-------------+---------------+--------+--------+----------+---------+--------+-------+---------------+-------+--------+------------+| id | cId | cName | hasPaid | oId | orderTime | pBrand | pCount | pId | pName | pPrice | pType | payTime | sId | sName | totalPrice |+----------------------------------+-------+--------+---------+-------------+---------------+--------+--------+----------+---------+--------+-------+---------------+-------+--------+------------+| 00001c760c04126da067e90409467c4e | c0022 | 消趙一 | true | o0009999792 | 1494976931954 | 小米 | 3 | p0005004 | 紅米 5s | 499.01 | 手機 | 1494977189780 | s0005 | 售週五 | 1497.03 |+----------------------------------+-------+--------+---------+-------------+---------------+--------+--------+----------+---------+--------+-------+---------------+-------+--------+------------+| 0000d89f46952ac03da71a33c8e83eef | c0012 | 消錢二 | false | o0024862442 | 1502415559707 | 小米 | 2 | p0005004 | 紅米 5s | 499.01 | 手機 | null | s0015 | 售週五 | 998.02 |+----------------------------------+-------+--------+---------+-------------+---------------+--------+--------+----------+---------+--------+-------+---------------+-------+--------+------------+| 0000f560b62779285e86947f8e8d0e4c | c0008 | 消馮八 | false | o0000826505 | 1490386088808 | 小米 | 1 | p0005004 | 紅米 5s | 499.01 | 手機 | null | s0015 | 售週五 | 499.01 |+----------------------------------+-------+--------+---------+-------------+---------------+--------+--------+----------+---------+--------+-------+---------------+-------+--------+------------+

統計所有訂單中每個商品品牌的訂單數:

select pBrand,count(*) from order group bypBrand;
+--------+----------+| pBrand | count(*) |+--------+----------+| vivo | 162539 |+--------+----------+| 聯想 | 304252 |+--------+----------+| oppo | 242513 |+--------+----------+| 蘋果 | 96153 |+--------+----------+| 小米 | 194543 |+--------+----------+

總結

表格儲存 Tablestore 作為一款廣泛應用 Serverless DataBase,提供了經濟的計費模式,能大幅縮減業務成本。以上文訂單場景為例子,在一億訂單資料量級和平均 2000TPS 的讀寫量下,採用表格儲存 Tablestore 僅需不到 400元/月 的使用成本。與此同時,Tablestore 具備極致的彈性服務能力和完全零運維的特性,能夠給使用者帶來更絲滑的使用體驗。

如對本文中所述有疑問或者希望進一步瞭解表格儲存,可以釘釘搜尋群號:“23307953”,群內提供免費的線上專家服務,歡迎加入。

更多內容關注 Serverless 微信公眾號(ID:serverlessdevs),彙集 Serverless 技術最全內容,定期舉辦 Serverless 活動、直播,使用者最佳實踐。

相關文章