所謂武功再高也怕菜刀-分割槽、分庫、分表和分散式的優劣
我相信做過資料庫對以上的都不陌生。基本上主流資料庫都支援分割槽。分割槽是一種對應用透明的管理表方式。儘管可以在網上找不到不少黑MySQL分割槽的,但是時至今日我用MySQL分割槽沒發現一點問題,當然PostgreSQL和Oracle的我也沒發現問題。我猜測那些問題應該來自於使用上的不規範。我以前做公安系統由於單表幾十億上百億,還採用過二級分割槽,效果非常好。
分割槽一般使用都是按照時間,基本是按照月。比如我一個月一個分割槽,我有5年資料,那麼就是60個分割槽。這個時候如果想把最早的一個月資料歸檔。我們可以採用互動分割槽等技術,秒匯出。然後把這些資料遷移或者壓縮,達到歸檔和給線上資料庫瘦身的效果。如果沒有分割槽會怎麼樣?苦啊,那隻能按照條件邏輯匯出了,這個效率低下。匯出以後delete這些匯出的資料,但是delete不釋放空間呀,又要做碎片整理。好在部分資料庫做起來也不影響業務。我有個資料以前有一個庫Oracle。20多T,碎片有880G。RAID10的陣列,磁碟是15k轉速的。直接線上做碎片整理,不影響業務的條件下做了55個小時。另外一個同事的陣列較差,他悲劇的做了550個小時(快一個月了)。可見分割槽是多麼重要。而很多表設計的時候,由於缺乏設計和規劃,沒有建立成分割槽。那麼就要將非分割槽的錶轉換成分割槽表。怎麼轉換我在之前的公眾號寫過了,感興趣的可以往前翻幾天。但是如果時間不是日期型,這就沒辦法了。可見設計是多麼重要,設計糟糕的前提一下,一切最佳化都無能為力。
分割槽不好的地方,比如分割槽到了最後一個月,忘記加新的分割槽就報錯了。這點上Oracle做到了自動分割槽,永遠不會出問題。這個特性的確避免了很多故障。不過drop分割槽的時候要帶上update global index,不帶也會出故障。哎,我一直想給官方提,我們們不能drop的時候隱性的帶上嗎?這樣真的能避免故障。
分割槽另外一個不好的地方就是,我分了60個月的區,結果你查詢的時候不按照時間查,比如前後%,或者不帶條件。那麼等於還是查了60個月。假設這個表不分割槽是600G,分割槽以後總量還是600G。那麼一個SQL查600G,該慢還是慢。分割槽的快是這的是在一個分割槽內查詢會好一點點(不過我實測基本感知不到),也就是說你帶上時間限定在一個分割槽中檢索,不要跨分割槽。其實這個和不分割槽時候帶上一個月的時間差不多的。所以分割槽最大的貢獻我覺得還是生命週期管理。
分庫一般伴隨著微服務和中臺,原來單體執行挺好的。現在就開始拆,我在老白的一篇微服務資料庫選型中看到,開發一時爽,運維兩行淚。我真實感覺是,開發兩行淚,運維兩行淚。一旦分庫資料互動要麼靠介面要麼靠同步。介面嘛,我接觸的效率都不高,一定比不分庫低。同步嘛,任何CDC使用成本都不低,一點沒問題的沒見過。只能說有的工具做的好,問題少。問題其實大多數也是使用不當造成的。按照一個維度分庫以後,那麼按照其他維度就無法查詢了。和分割槽一樣的道理。如果查所有等於跨所有節點。也和分割槽一樣,該全部還是全部,加上網路更慢了。雖然MySQL和PG以及Oracle這三大主流資料庫在門派上有紛爭,但是對於分庫是一致的看法就是不要分。
分表必然涉及分庫,分庫不一定涉及分表。就是一個表分成N份,分散在N個節點上。每個節點上儲存N分之一的資料。千萬別相信水平擴充套件,至少我不信。1000萬資料存100個節點。現在資料到2000萬了,要增加100個節點怎麼辦?那是要200個節點資料重新打散。如果做過redis的cluster的就知道,reblance時候是卡主的。所以分表的再平衡要停機的。然後如果也來一個前後%,效果一樣,分開全表掃。(當然這個並行掃能快N倍)
分散式,我認為MySQL的MGR是分散式,Oracle的RAC也是。TiDB Oceanbase polardb TDSQL這些帶上paxos和raft的都是。當超過單機能力時候,考慮分散式。那麼如果在分散式上是不是可以胡來?比如前後%,答案是否定的。一樣會把分散式搞死。
總結:分割槽、分庫、分表、分散式都怕不按照規範開發,比如全表。所謂武功再高也怕菜刀。分割槽和分散式可取。但凡做分散式的都是單機玩的好的,比如阿里、騰訊等。單機玩不好的,我絕對不相信能用好分散式。比如單刀都能劃到自己的,雙刀說不定是還沒砍到人,自己已經血流了一地了。分庫 分表,不可取,同樣遇到前後%,就是雪上加霜。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15810651/viewspace-2919517/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySql分表、分庫、分片和分割槽MySql
- mysql的分割槽和分表MySql
- mysql表水平拆分和分割槽分表MySql
- mysql 分表 分割槽MySql
- mysql的分割槽與分表MySql
- hive 分割槽表和分桶表區別Hive
- mysql —— 分表分割槽(1)MySql
- 你應該瞭解的一些資料庫概念!RDBMS vs NoSQL,分散式 vs 叢集 ,分割槽 分表 分片 分庫資料庫SQL分散式
- Oracle分割槽表基礎運維-01分割槽表分類Oracle運維
- MySQL分割槽表的分割槽原理和優缺點MySql
- 分開分表 分散式事物分散式
- 線上進行分庫分表中介軟體的平滑升級,正所謂藝高人膽大
- Hash分割槽表分割槽數與資料分佈的測試
- oracle分割槽表的分類及測試Oracle
- 吐槽各大題庫的優劣
- Hash分割槽表及資料分佈
- 分散式資料庫中介軟體 MyCat | 分庫分表實踐分散式資料庫
- Apache Spark:分割槽和分桶 - NiveditaApacheSpark
- MySQL分表後原分割槽表處理方案MySql
- oracle分割槽表和分割槽表exchangeOracle
- 強!分庫分表與分散式資料庫技術選項分析分散式資料庫
- hive分割槽和分桶你熟悉嗎?Hive
- oracle分割槽表和非分割槽表exchangeOracle
- 分割槽表入無分割槽的資料庫資料庫
- 分散式資料庫中介軟體的實現原理介紹一:分庫分表分散式資料庫
- 分庫分表的 9種分散式主鍵ID 生成方案,挺全乎的分散式
- 分庫分表系列:分庫分表的前世今生
- ORACLE分割槽表梳理系列(一)- 分割槽表概述、分類、使用方法及注意事項Oracle
- oracle 分割槽表move和包含分割槽表的lob moveOracle
- 【學習筆記】分割槽表和分割槽索引——分割槽表的其他管理(三)筆記索引
- 範圍分割槽表和INTERVAL分割槽表對於SPLIT分割槽的區別
- OGG Oracle 分割槽壓縮表 到 MySQL分表的實現OracleMySql
- 學習筆記】分割槽表和分割槽索引——新增表分割槽(二)筆記索引
- 11g分佈表新特性——Interval分割槽(上)
- 11g分佈表新特性——Interval分割槽(下)
- 分庫分表如何進行極致的優化優化
- Java 8 Streams API:對Stream分組和分割槽JavaAPI
- 全面學習分割槽表及分割槽索引(8)--增加和收縮表分割槽索引