天天看點

雲原生 Serverless Database 使用體驗

下文以訂單場景為例子,在一億訂單資料量級和平均 2000TPS 的讀寫量下,采用表格存儲 Tablestore 僅需不到 400元/月 的使用成本。與此同時,Tablestore 具備極緻的彈性服務能力和完全零運維的特性,能夠給使用者帶來更絲滑的使用體驗。

作者:李欣

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

關系型資料庫 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 的整體架構如下圖所示:

雲原生 Serverless Database 使用體驗
雲原生 Serverless Database 使用體驗

Tablestore 架構圖

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

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

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

Tablestore 體驗

準備工作

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

(1)建立一個阿裡雲賬号,并擷取到阿裡雲賬号的 AK。(雲賬号 AK 是通路所有雲服務包括 Tablestore 的密鑰,後續需要通過 AK 來通路 Tablestore 服務)。

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

首先通過 config 指令配置連接配接密鑰并通過 enable_service 指令開通 Tablestore 服務:

config --id accessKeyID --key accessKeySecret
enable_service
           

(3)通過 create_instance 指令建立一個執行個體:

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

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

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

建立表

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

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

雲原生 Serverless Database 使用體驗

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

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

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

随着訂單資料量的增加或通路量的增加,寬表模型會根據第一主鍵的分布範圍(上述資料模型中即是訂單 ID)分裂擴充成多個資料分區平均分布到多台實體機上以支援更大的資料規模(TB 甚至 PB)和讀寫吞吐(十萬 TPS 以上),整個擴充過程完全由服務端自動完成,無需人工幹預。

資料導入

模拟生成了 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.
           

訂單查詢

使用 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    |
+----------------------------------+-------+--------+---------+-------------+---------------+--------+--------+----------+--------+---------+-------+-------+--------+------------+
           

訂單檢索與統計

訂單場景中經常會出現依賴多條件組合篩選,這種情況下需要依賴 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”,群内提供免費的線上專家服務,歡迎加入。

​​點選此處​​,即可檢視表格存儲詳情!