歡迎光臨
每天分享高質量文章

[NewLife.XCode]百億級性能

NewLife.XCode是一個有10多年曆史的開源資料中間件,支持nfx/netcore,由新生命團隊(2002~2019)開發完成並維護至今,以下簡稱XCode。

整個系列教程會大量結合示例代碼和運行日誌來進行深入分析,蘊含多年開發經驗於其中,代表作有百億級大資料實時計算專案。

開源地址:https://github.com/NewLifeX/X (求star, 795+)

回到目錄

大資料投名狀

先來看看“大資料演示平臺”:http://bigdata.newlifex.com

SQLite單表4億行訂單資料,檔案大小26.5G,阿裡雲1C1G的ECS服務器,由 NewLife.XCode + NewLife.Cube 驅動

如上,在4億行中查詢第1000頁,耗時16毫秒。

對於高手來說,這個算不得什麼,只要註意好索引就行。

這個“演示平臺”建立於兩年前,給兩家領先物流企業遞交了簡歷,其中一家因SQLite拒絕了,另一家給了資料架構師!

現在,每天1億個快遞包裹在路上,產生大量掃描資料。單表數十億資料很常見(Oracle按月分割槽),一款資料產品幾億明細資料比比皆是(MySql分表)。

回到目錄

代碼之巔、天外飛仙

再來看一下各種資料庫的極致性能,飛仙平臺 http://feixian.newlifex.com

SQLite插入第一名 56萬tps;

MySql插入第一名 60萬tps;

SQLite查詢(帶快取)1126萬qps;

這是上百人用了各種機器(筆記本、台式機、服務器)調整引數進行大量測試後得到的性能排行榜!

所有測試,由 NewLife.XCode 支持!

實際應用中,即使能達到上述性能十分之一,亦能立於不敗之地。有時候甚至還達不到百分之一。

儘管如此,極致性能的研究也給我們的應用方式以及資料庫引數設置指明瞭方向!

回到目錄

索引完備

使用關係型資料庫來做大資料,第一步必然是索引

單表超過1000萬資料,任何查詢都必須走索引!否則資料庫一定跟你說ByeBye!

前面SQLite單表4億資料,共有兩個索引,自增ID作為主鍵,另外有訂單號索引。

大表索引不宜過多,務必以資料的主要使用方式來建立一兩個即可,儘量不要超過三個,經索引過濾後的資料儘量控制住1萬行以內。

常見大型表索取用法:

1,日誌型

訂單操作表、快遞掃描表、傳感資料表等超大日誌型資料表,每日數千萬到數億行,只插入不修改,最重要的欄位就是時間戳CreateTime,建立索引,同時可以按時間分割槽分表。

這種大表最常見用法就是根據時間戳去抽取來做業務處理,那就是鼎鼎大名的ETL。處理性能1000~10000tps

更高大上一點,就是抽取資料寫入Kafka/RocketMQ,名正言順進行大資料分析!處理性能10萬tps

因工作需要,我們依據時間戳抽取了30天共100億資料寫入Redis,供100+應用進行實時資料分析。處理性能100萬tps

抽取資料時以每批次抽取5000~20000行為宜,依次調整查詢時間段,重量級螞蟻調度系統(https://github.com/NewLifeX/AntJob)具備動態步進抽取能力,可自動調節最優抽取間隔。

總結起來一句話:按時間戳輪資料!

2,狀態表

訂單運單都是有狀態資料,在整個生命周期中,狀態會多次改變。許多業務往往要求兩個或多個狀態相匹配,那就要求有一張龐大的狀態表。

狀態表最合適的主鍵就是訂單號,並且一般分表分庫儲存,常見分表公式 Crc16(code)%1024,分表數以單表不超過1000萬為宜。

使用1024狀態表的資料庫一般是分佈式玩法,比較合適分8庫,每個庫128表,很多應用服務器各司其職,大家共同操作一張表的幾率大減。

3,統計分析表

統計表主鍵一般由統計日期和分類構成,為了方便可建立字串ID主鍵,由 {date}_{cid} 組成,也可以對 date + cid 兩個欄位建立唯一聯合索引。

之所以建立 {date}_{cid} 的ID主鍵,主要是為了方便寫明細資料,無需等待統計表插入後(假如使用自增)才得到統計ID。

明細表一定必鬚根據統計ID來查,由統計ID跟其它主要業務欄位構成主索引。

回到目錄

合理查詢

既然有了索引,那麼大表的任意查詢都必須命中索引(或者部分使用索引) 。

為了索引,為了降低資料庫負擔,有時候寧可多查一點,先把資料查出來,再在記憶體裡面做二次處理!

大資料的瓶頸一定是資料庫,應用服務器往往性能過剩!

因此,完全可以把一部分“計算”由資料庫轉移到應用服務器之中來進行處理。

大表少用join關聯,寧可多次查詢;

回到目錄

欄位精煉

常聽到許多人說每天處理資料多少多少TB/PB,聽起來資料分析還可以論斤稱?挺尷尬的!

雖然資料庫很容易遇到IO瓶頸,但很多人達不到那一步。

資料容量上的優化空間還是極大的。

大表欄位精簡原則:

  1.  能存ID就別存Name。經常見到用戶、商家、地區等信息,又存ID又存Name,甚至還存一個Code。此時需要XCode的擴展屬性
  2. 適當冗餘。為了便於查詢,可以適當冗餘一些欄位,但絕不能濫用。比如商家所在地區,如果查詢用不到而只是分析時使用,就不需要儲存商家ID以外還儲存地區
  3. 只查詢需要的欄位。這一點跟XCode推崇 select * 並不相悖,絕大部分百萬級以內小表可以這麼乾,但是千萬億萬級大表則需按需查詢了。

回到目錄

充分利用快取

 少用join關聯,慎用欄位冗餘,即可大量發揮XCode的快取優勢。

10萬乃至100萬維表資料可儘量快取起來,隨時配合億萬級大表進行資料分析。

另一方面就是資料庫快取,需要DBA大力支持!

回到目錄

系列教程

NewLife.XCode教程系列[2019版]

  1. 增刪改查入門。快速展現用法,代碼配置連接字串
  2. 資料模型檔案。建立表格欄位和索引,名字以及資料型別規範,推薦欄位(時間,用戶,IP)
  3. 物體類詳解。資料類業務類,泛型基類,接口
  4. 功能設置。連接字串,除錯開關,SQL日誌,慢日誌,引數化,執行超時。代碼與配置檔案設置,連接字串區域性設置
  5. 反向工程。自動建立資料庫資料表
  6. 資料初始化。InitData寫入初始化資料
  7. 高級增刪改。多載攔截,自增欄位,Valid驗證,物體模型(時間,用戶,IP)
  8. 臟資料。如何產生,怎麼利用
  9. 增量累加。高併發統計
  10. 事務處理。單表和多表,不同連接,多種寫法
  11. 擴展屬性。多表關聯,Map映射
  12. 高級查詢。複雜條件,分頁,自定義擴展FieldItem,查總記錄數,查彙總統計
  13. 資料層快取。Sql快取,更新機制
  14. 物體快取。全表整理快取,更新機制
  15. 物件快取。字典快取,適用用戶等資料較多場景。
  16. 百億級性能。欄位精煉,索引完備,合理查詢,充分利用快取
  17. 物體工廠。元資料,通用處理程式
  18. 角色權限。Membership
  19. 匯入匯出。Xml,Json,二進制,網絡或檔案
  20. 分表分庫。常見拆分邏輯
  21. 高級統計。聚合統計,分組統計
  22. 批量寫入。批量插入,批量Upsert,異步儲存
  23. 物體佇列。寫入級快取,提升性能。
  24. 備份同步。備份資料,恢復資料,同步資料
  25. 資料服務。提供RPC接口服務,遠程執行查詢,例如SQLite網絡版
  26. 大資料分析。ETL抽取,調度計算處理,結果持久化

已同步到看一看
赞(0)

分享創造快樂