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瓶頸,但很多人達不到那一步。
資料容量上的最佳化空間還是極大的。
大表欄位精簡原則:
- 能存ID就別存Name。經常見到使用者、商家、地區等資訊,又存ID又存Name,甚至還存一個Code。此時需要XCode的擴充套件屬性
- 適當冗餘。為了便於查詢,可以適當冗餘一些欄位,但絕不能濫用。比如商家所在地區,如果查詢用不到而只是分析時使用,就不需要儲存商家ID以外還儲存地區
- 只查詢需要的欄位。這一點跟XCode推崇 select * 並不相悖,絕大部分百萬級以內小表可以這麼乾,但是千萬億萬級大表則需按需查詢了。
回到目錄
充分利用快取
少用join關聯,慎用欄位冗餘,即可大量發揮XCode的快取優勢。
10萬乃至100萬維表資料可儘量快取起來,隨時配合億萬級大表進行資料分析。
另一方面就是資料庫快取,需要DBA大力支援!
回到目錄
系列教程
NewLife.XCode教程系列[2019版]
- 增刪改查入門。快速展現用法,程式碼配置連線字串
- 資料模型檔案。建立表格欄位和索引,名字以及資料型別規範,推薦欄位(時間,使用者,IP)
- 物體類詳解。資料類業務類,泛型基類,介面
- 功能設定。連線字串,除錯開關,SQL日誌,慢日誌,引數化,執行超時。程式碼與配置檔案設定,連線字串區域性設定
- 反向工程。自動建立資料庫資料表
- 資料初始化。InitData寫入初始化資料
- 高階增刪改。多載攔截,自增欄位,Valid驗證,物體模型(時間,使用者,IP)
- 臟資料。如何產生,怎麼利用
- 增量累加。高併發統計
- 事務處理。單表和多表,不同連線,多種寫法
- 擴充套件屬性。多表關聯,Map對映
- 高階查詢。複雜條件,分頁,自定義擴充套件FieldItem,查總記錄數,查彙總統計
- 資料層快取。Sql快取,更新機制
- 物體快取。全表整理快取,更新機制
- 物件快取。字典快取,適用使用者等資料較多場景。
- 百億級效能。欄位精煉,索引完備,合理查詢,充分利用快取
- 物體工廠。元資料,通用處理程式
- 角色許可權。Membership
- 匯入匯出。Xml,Json,二進位制,網路或檔案
- 分表分庫。常見拆分邏輯
- 高階統計。聚合統計,分組統計
- 批次寫入。批次插入,批次Upsert,非同步儲存
- 物體佇列。寫入級快取,提升效能。
- 備份同步。備份資料,恢復資料,同步資料
- 資料服務。提供RPC介面服務,遠端執行查詢,例如SQLite網路版
- 大資料分析。ETL抽取,排程計算處理,結果持久化
朋友會在“發現-看一看”看到你“在看”的內容