數據蔣堂 | 時序數據從分表到分庫

2021-02-23 數據派THU

本文共5500字,建議閱讀10+分鐘。
一個物理表的數據量太大時,就會影響查詢和計算的性能。

這裡的時序數據泛指一切隨時間推移而不斷增長的數據,比如通話記錄、銀行交易記錄等。

對於資料庫來講,時序數據並沒有什麼特殊性,可以和普通數據一樣放在數據表中。不過,因為不斷增長,積累時間較長後,這種數據的量常常都會很大。一個物理表的數據量太大時,就會影響查詢和計算的性能。

現代資料庫一般都提供有表分區(PARTITION)的機制,就是把一個大表縱向(按行)分成若干區段,分區規則由資料庫管理員來設置,對應用程式員來講是透明的,可以和不分區的表一樣訪問,資料庫會自動根據查詢條件決定讀取哪些分區的數據,這樣的接口體驗非常好。

不過,在實戰中,分區表的效果在某些場景下並不好,而且使用時也有些約束條件,並不總好用且能用的。結果,在實際業務中,我們常常會看到對於這種大數據採用手工物理分表的方案。

所謂物理分表,就是人為將一個大表分成若干較小的物理數據表。因為時序數據的結構中一定會有一個欄位來表示事件發生的時刻,而事件發生的數量一般來講也會按時間段相對平均分布(大多數情況會緩慢增長,但討論時可以忽略),所以最常用的方案就是按時間段來做分表,比如一個月數據對應一個分表,這種方式在金融、電信行業比較普遍。

物理分表並不是資料庫自動支持的方案,不能對應用程式做到透明,需要應用程式自己處理。在查詢數據時一般都會有時間段參數,應用程式可以根據這個參數計算出該查詢涉及哪些分表,然後將這些分表UNION起來拼到SQL語句的FROM後面。查詢不涉及的時間段對應的分表不會被拼進來,這樣就可以有效減少數據遍歷的範圍,從而提高性能。

這個方案在單個資料庫時沒啥毛病,但是不是能推廣到多個資料庫的情況呢?

數據量再大下去,一個資料庫也無法承受了,而某些場景下又不允許我們上一套分布式資料庫系統,畢竟分布式資料庫是個沉重的工程,不僅造價高,而且維護管理都要複雜不少。這時候,我們可以擺多個資料庫分別存儲數據,類似物理分表的方案,也按時間段把數據分拆到各個資料庫中,比如一年數據放入一個資料庫中(一般來講多個庫會部署到多臺機器上),這樣就能分攤查詢壓力了。

這首先會有一個查詢範圍的問題,如果查詢的時間跨度超過了一個物理分庫時,這時候就不能象分表時那樣用UNION拼起來了,資料庫無法執行跨庫的SQL語句。不過,這個問題還不算嚴重,只是查詢明細數據時,要把各個分庫的返回數據拼接起來,這並不算困難。甚至,要求前端查詢範圍必須落在一個分庫內也不為過(比如必須先選擇查詢年份),因為一個分庫的數據量並不算少,這樣用戶體驗略有損失,但也可以容忍。

這種方案還會有壓力不平衡的問題。

對於時序數據,近期數據的查詢頻繁度遠遠高於遠期數據,大多數查詢都集中在最近一段時間中,存放近期數據的分庫上任務就很重,並發較多時仍然會有性能瓶頸,而存放遠期數據的分庫卻幾乎沒事幹,並不能有效分攤查詢壓力。

還有別的辦法嗎?

可以採用蛇形分布。比如將多年數據分拆到10個分庫中,可以按日期拆分,所有年份中1月1日的數據放到1號分庫中,1月2日的放到2號分庫,…,1月10號的放到10號分庫,1月11號的再從1號分庫輪迴,…;其它情況的具體分法也可以根據時序數據的時刻欄位的分布情況來決定。

這樣分下來,每個分庫存儲的數據量差不多也就是1/n,相對比較平均,還可以規避前面說的數據緩慢增長導致的不平衡;而且,無論近期數據還是遠期數據的查詢都會被分攤到各個分庫中,看起來能夠充分利用硬體資源了。

還有點注意事項!

蛇形分布時,每個分庫中都有所有年份的數據,幾乎每個查詢都會涉及到所有分庫的數據,不能只挑出某些分庫來執行運算,這和前面說的分表方案的優化原理並不一樣了。我們需要在分庫中繼續做分表,查詢確實會涉及所有分庫,但只涉及分庫中的某些分表,這樣仍然可以有效的減少查詢範圍,同時利用分庫並行的優勢。

第二個問題:每個分庫都可能返回數據,應用程式需要把這些數據再做一次匯總,而不能象單庫分表那樣用UNION推給資料庫去完成。對於常見的明細查詢,那只要簡單拼接再排序就可以了,開發起來並不難;但如果涉及到分組匯總就會麻煩很多,應用程式員並不擅長編寫這種運算,這時候最好藉助集算器這類外部計算引擎來協助實現跨庫匯總運算。

當然,成本和條件允許時直接上分布式資料庫就更簡單,分布式資料庫採用HASH方案基本上可以被理解成是蛇形分布的。

潤乾軟體創始人、首席科學家

清華大學計算機碩士,中國大數據產業生態聯盟專家委員,著有《非線性報表模型原理》等,1989年,中國首個國際奧林匹克數學競賽團體冠軍成員,個人金牌;2000年,創立潤乾公司;2004年,首次在潤乾報表中提出非線性報表模型,完美解決了中國式複雜報表制表難題,目前該模型已經成為報表行業的標準;2014年,經過7年開發,潤乾軟體發布不依賴關係代數模型的計算引擎——集算器,有效地提高了複雜結構化大數據計算的開發和運算效率;2015年,潤乾軟體被福布斯中文網站評為「2015福布斯中國非上市潛力企業100強」;2016、2017年,榮獲中國電子信息產業發展研究院評選的「中國軟體和信息服務業十大領軍人物」;2017年度中國數據大工匠、數據領域專業技術講堂《數據蔣堂》創辦者。

《數據蔣堂》的作者蔣步星,從事信息系統建設和數據處理長達20多年的時間。他豐富的工程經驗與深厚的理論功底相互融合、創新思想與傳統觀念的相互碰撞,虛擬與現實的相互交織,產生出了一篇篇的瀝血之作。此連載的內容涉及從數據呈現、採集到加工計算再到存儲以及挖掘等各個方面。大可觀數據世界之遠景、小可看技術疑難之細節。針對數據領域一些技術難點,站在研發人員的角度從淺入深,進行全方位、360度無死角深度剖析;對於一些業內觀點,站在技術人員角度闡述自己的思考和理解。蔣步星還會對大數據的發展,站在業內專家角度給予預測和推斷。靜下心來認真研讀你會發現,《數據蔣堂》的文章,有的會讓用戶避免重複前人走過的彎路,有的會讓攻城獅面對扎心的難題茅塞頓開,有的會為初入行業的讀者提供一把開啟數據世界的鑰匙,有的甚至會讓業內專家大跌眼鏡,產生思想交鋒。

數據蔣堂 | 存儲和計算技術的選擇

數據蔣堂 | 人工智慧中的「人工」

數據蔣堂 | 中國報表漫談

數據蔣堂 | 內存數據集產生的隱性成本

數據蔣堂 | 多維分析預匯總的功能盲區

數據蔣堂 | 多維分析預匯總的存儲容量

數據蔣堂 | 多維分析預匯總的方案探討

數據蔣堂 | 資料庫的封閉性

數據蔣堂 | 內存數據集產生的隱性成本

數據蔣堂 | 前半有序的大數據排序

數據蔣堂 | 「後半」有序的分組

相關焦點

  • 分庫分表?如何做到永不遷移數據和避免熱點?
    當然也可以分庫,再分表;把壓力從資料庫層級分開。二、分庫分表方案分庫分表方案中有常用的方案,hash取模和range範圍方案;分庫分表方案最主要就是路由算法,把路由的key按照指定的算法進行路由存放。下邊來介紹一下兩個方案的特點。
  • 簡單粗暴的分庫分表設計方案
    來源於:https://zhuanlan.zhihu.com/p/374386521.數據散列模式數據散列模式主要是通過hash算法將數據隨機寫入(分庫)分表中,用以提高資料庫的負載能力,這種設計方案下分表欄位通常需要被包含在分表中。優點:可以解決有局部熱點的數據的負載均衡,並整體提高資料庫的負載能力。
  • MySQL:網際網路公司常用分庫分表方案匯總
    1、IO瓶頸第一種:磁碟讀IO瓶頸,熱點數據太多,資料庫緩存放不下,每次查詢時會產生大量的IO,降低查詢速度 -> 分庫和垂直分表。第二種:網絡IO瓶頸,請求的數據太多,網絡帶寬不夠 -> 分庫。
  • 分庫分表常見概念解讀+Sharding-JDBC實戰
    按照一定的規則,將原本數據量大的資料庫拆分成多個單獨的資料庫,將原本數據量大的表拆分成若干個數據表,使得單一的庫、表性能達到最優的效果(響應速度快),以此提升整體資料庫性能。如何分庫分表分庫分表的核心理念就是對數據進行切分(Sharding),以及切分後如何對數據的快速定位與查詢結果整合。
  • 時序資料庫入門系列: 時序數據的查詢
    儘管時序數據的查詢類型或者場景多種多樣,但時序資料庫的查詢類型,整體上來說主要分成原始數據查詢、聚合數據查詢等兩種類型。原始數據查詢,顧名思義,就是查詢原始數據,將寫入的數據原封不動的查詢出來。由於查詢結果粒度太細,當時間範圍較大時,結果集通常較大,業務處理起來比較困難,且較難發現蘊含在結果集中的規律性和趨勢性。
  • 分庫分表:TiDB,求別搶飯碗!
    ,慢慢的就出現了分庫分表的中間件。存儲數據的基本單位是 Region,每個 Region 負責存儲一個 Key Range (從 StartKey 到 EndKey 的左閉右開區間)的數據,每個 TiKV 節點會負責多個 Region 。 TiKV 使用 Raft 協議做複製,保持數據的一致性和容災。
  • 分庫分表的4個面試連環炮問題!不會就慘了
    分庫分庫是啥意思?就是你一個庫一般我們經驗而言,最多支撐到並發 2000,一定要擴容了,而且一個健康的單庫並發值你最好保持在每秒 1000 左右,不要太大。那麼你可以將一個庫的數據拆分到多個庫中,訪問的時候就訪問一個庫好了。這就是所謂的分庫分表,為啥要分庫分表?你明白了吧。
  • 一文快速入門分庫分表中間件 Sharding-JDBC(必修課)
    ,我們在前文中回顧了一下分庫分表的基礎知識,對分庫分表的拆分方式有了一定的了解。2.1 分片一般我們在提到分庫分表的時候,大多是以水平切分模式(水平分庫、分表)為基礎來說的,數據分片將原本一張數據量較大的表 t_order 拆分生成數個表結構完全一致的小數據量表 t_order_0、t_order_1、···、t_order_n,每張表只存儲原大表中的一部分數據,當執行一條SQL時會通過
  • 一個億級分庫分表項目的實戰全過程解析
    分庫分表的文章網上非常多,但是大多內容比較零散,以講解知識點為主,沒有完整地說明一個大表的切分、新架構設計、上線的完整過程。因此,我結合去年做的一個大型分庫分表項目,來復盤一下完整的分庫分表從架構設計到發布上線的實戰總結。為什麼需要做分庫分表?這個相信大家多少都有所了解。
  • Cleanits:製造業時序數據清洗系統
    基於此,結合實際製造業數據質量問題現狀,本文研究並開發了一個製造業時序數據清洗系統:Cleanits. 該系統實現了對三種嚴重的製造業時序數據質量問題的檢測和修復,有效地提高製造業大數據的質量及其可用性。 關鍵詞: 工業大數據;時序建模分析;數據管理;數據挖掘;機器學習.
  • 面試官:說說Mysql資料庫分庫分表,並且會有哪些問題
    也就是一臺伺服器的資源例如CPU、內存、IO、磁碟等是有限的,所以這時候分庫分表就上啦!分庫分庫講白了就是比如現在你有一個資料庫伺服器,資料庫中有兩張表分別是用戶表和訂單表。如果要分庫的話現在你需要買兩臺機子,搞兩個資料庫分別放在兩臺機子上,並且一個資料庫放用戶表,一個資料庫放訂單表這樣存儲壓力就分擔到兩個伺服器上了,但是會帶來新的問題,所以東西變複雜了都會有新的問題產生。
  • 分庫分表【Sharding-JDBC】入門與項目實戰
    邏輯表水平拆分的資料庫(表)的相同邏輯和數據結構表的總稱。例:訂單數據根據主鍵尾數拆分為 10 張表,分別是t_order_0到t_order_9,他們的邏輯表名為t_order。真實表在分片的資料庫中真實存在的物理表。即上個示例中的t_order_0到t_order_9。數據節點數據分片的最小單元。
  • 利用 ShardingSphere-JDBC 實現分庫分表實踐
    利用ShardingSphere-JDBC實現分庫分表1.ShardingSphere概述1.1 概述業務發展到一定程度,分庫分表是一種必然的要求,分庫可以實現資源隔離,分表則可以降低單表數據量,提高訪問效率。
  • 用uid分庫,uname上的查詢怎麼辦?
    最常見的水平切分方式,按照uid取模分庫:通過uid取模,將數據分布到多個資料庫實例上去,提高服務實例個數,降低單庫數據量,以達到擴容的目的。 水平切分之後:uid屬性上的查詢可以直接路由到庫,如上圖,假設訪問uid=124的數據,取模後能夠直接定位db-user1。 對於uname上的查詢,就不能這麼幸運了:
  • 大數據大佬訪談錄
    沈春輝:在網際網路發展之前,資料庫可以說基本就是在關係模型上發展,比如發展了幾十年的 Oracle、DB2,而 NoSQL 的出現打破了這一慣性,KV、寬表、文檔、圖、時序等多種模型都得到了廣泛應用和快速發展,但這個趨勢也會使得應用開發變得越來越複雜,記得在 2012 年的 NoSQL 大會上,有大佬提出了「多模資料庫」的概念,設想一個系統可處理多種類型數據
  • Pandas處理時序數據(初學者必會)!
    每日乾貨 & 每月組隊學習,不錯過作者:耿遠昊,Datawhale成員,華東師範大學時序數據是指時間序列數據時間序列數據是同一統一指標按時間順序記錄的數據列。在同一數據列中的各個數據必須是同口徑的,要求具有可比性。時序數據可以是時期數,也可以時點數。時間序列分析的目的是通過找出樣本內時間序列的統計特性和發展規律性,構建時間序列模型,進行樣本外預測。本文目錄    1. 時序的創建        1.1.
  • 數據量大了一定要分表,分庫分表Sharding-JDBC入門與項目實戰
    最近項目中不少表的數據量越來越大,並且導致了一些資料庫的性能問題。因此想藉助一些分庫分表的中間件,實現自動化分庫分表實現。調研下來,發現Sharding-JDBC目前成熟度最高並且應用最廣的Java分庫分表的客戶端組件。
  • 淺談UART通信協議 UART接收數據時序設計
    您可能已經知道UART時序的控制、波特率的配置等方面的內容,但在實際使用時還是會遇到一些問題,比如如何才能恰當的和其它模塊進行銜接?為什麼時序明明沒問題,卻無法和其它控制單元成功通信?本文致力於全面解析在設計UART通信時的思路方法。 UART通信協議 UART通信的一幀一般由11到12位數據組成。
  • 分庫分表就能無限擴容嗎,解釋得太好了!
    分庫分表如果你的公司產品很受歡迎,業務繼續高速發展,數據越來越多,SQL 操作越來越慢,那麼資料庫就會成為瓶頸,那麼你肯定會想到分庫分表,不論通過 ID hash 或者 range 的方式都可以。如下圖:這下應該沒問題了吧。任憑你用戶再多,並發再高,我只要無限擴容資料庫,無限擴容應用,就可以了。
  • 冗餘數據一致性,到底如何保證?
    水平切分會有一個patition key,通過patition key的查詢能夠直接定位到庫,但是非patition key上的查詢可能就需要掃描多個庫了。此時常見的架構設計方案,是使用數據冗餘這種反範式設計來滿足分庫後不同維度的查詢需求。