云原生 Serverless Database 使用体验
作者:李欣
近十年來互聯網技術得到了飛速的發展,越來越多的行業加入到了互聯網的矩陣,由此帶來了更為豐富且復雜的業務場景需求,這對于數據應用系統的性能無疑是巨大的挑戰。
關系型數據庫 MySQL 是應用系統中最廣泛使用的數據庫產品,擁有強大的數據查詢和強事務處理能力。在如今的云時代,應用系統逐漸演進到基于云原生 Serverless 架構去進行搭建,因為它具有低成本、高彈性的優勢。但基于 MySQL 的數據存儲在 Serverless 架構體系下仍存在一些明顯的不足:
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?體驗
準備工作
在體驗 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 的表結構如下圖表格所示:
創建一張寬表模型的訂單表,屬性列信息無需定義,只需定義訂單表主鍵 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` wheresName = "售周五" andpBrand = "小米" andpName 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 Database 使用体验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022 年第一场云原生技术实践营开启报
- 下一篇: OpenKruise v1.0:云原生应