當企業數據達到一個規模后,不得不面臨數據拆分的問題。使用分布式數據庫是一個相對“簡單”的選擇。通過分布式架構可以支撐海量規模,也避免的拆分所帶來的各種“麻煩”。當然,分布式數據庫也不是“銀彈”,會有其適用的場景。如在分布式數據庫下無法解決的話,仍然是需要面臨拆分問題。但如何拆分數據是一個令人頭疼的問題,除了要結合業務拆分外,具體拆分的粒度也是需要關注的。可以在實例級、庫級別、表級別、分區級進行拆分,不同層次的拆分各有其利弊。下文針對不同的拆分方式,進行簡單的對比分析。
1、拆分層次:實例級
在實例級拆分,即通過將原有數據拆分到多個數據庫實例來承載更大規模。
架構
從架構角度來看,在實例級拆分無疑是比較徹底的,通過增加更多地實例,可以有效增加計算、存儲資源。很多分布式數據庫的架構,也是采用上層分布式計算層與下層單機存儲引擎相結合,原理上就是在架構層拆分更多實例來支撐。每個實例都承載了一部分數據,這種情況會在一定程度上增加數據耦合,需要全部實例可用,才能提供完整的數據服務。
研發
從研發角度來看,實例級拆分無疑是很大的變化,從單一數據源變為多個數據源。針對業務開發來說,不得不去解決多數據源管理及少量跨實例的問題。一般可通過自研或引入三方的數據庫訪問層來解決問題,減少對開發的影響。針對數據分析類需求,更加建議將數據匯聚到AP層進行處理。無論是哪方面的調整,工作量及工作難度都較之前架構增大及復雜很多。
運維
從運維角度來看,實例級拆分意味著很多運維工作的變化。從資源管理、實例管理、備份恢復、系統優化等,都要從單實例變更為多實例。其劃分為多個實例后,還需解決部分數據耦合關系所帶來的問題。例如,如何實現跨實例的一致性備份、如何解決監控指標的全局匯總等。針對數據對象本身的管理,則更為復雜。前者多通過運維平臺來解決多實例管理帶來的工作量增多等問題;后者則通過數據庫中間層可有效解決,針對多實例從邏輯上視同單一實例。
安全
從安全角度來看,實例級拆分無疑是不利的。需要解決多實例下或者說分散條件下的安全統一管理、訪問能力。通過統一的安全平臺或安全框架是可以在一定程度上解決的。
2、拆分層次:庫級
在庫級拆分,即通過將原有數據拆分到多個數據庫中。不同數據庫叫法不太統一,以MySQL為例就是"show databases"看到的結果。通常也被稱為不同的Schema。
架構
從架構角度來看,這種拆分方式只是在邏輯層面的一種拆分,并沒有真實增加物理資源,因而對計算、存儲的擴展上,達不到什么效果。從數據耦合上,還有所增加。這種拆分方式雖然沒有增加資源,但是可為未來的擴展打下一定基礎。例如,后續拆分給到不同實例,可以簡單將某個Schema拆分出去即可,相對簡化了很多。
研發
從研發角度來看,較實例級拆分要輕些,需要增加對多Schema的支持。必要的多數據源管理或部分跨Schema的問題時需要解決的。分析類的需求,可通過跨Schema的關聯完成。在工作量上有一定增加,但難度相對不大。通過也可以自研或引入三方的數據庫訪問層來解決。
運維
從運維角度來看,應為沒有引入其他實例,從日常運維、備份恢復等沒什么變化。對于對象管理,是需要考慮多Schema的支持,至于性能上通過拆分Schema是否有提升不確定。使用更小的訪問規模,也許性能有提升;但由于此而引入更多的關聯查詢,可能造成性能下降。
安全
從安全角度來看,這種方式還是會造成一定管理的復雜度。管理成本的提高跟前面實例相差不大。
3、拆分層次:表級
表級拆分,是指將原來的單個表,拆成多個分表(表名都發生變化)。物理上從單個對象拆分為多個對象,邏輯上有時可通過諸如視圖等重新裝飾出一個對象。
架構
從架構角度來看,這種拆分方式是一種邏輯上的拆分,沒有引入更多資源。從數據耦合度看,反而變差了。
研發
從研發角度來看,與前面庫級拆分類似,都還存在一定的工作量,但相對難度不大。也多可以通過自研或引入三方數據庫訪問層來解決。
運維
從運維角度來看,與前面庫級拆分也類似,差別不大。
安全
從安全角度來看,與前面庫級拆分也類似,差別不大。
4、拆分層次:分區級
分區是數據庫層面支持的一種技術,通過將數據劃分在表中的多個分區,達到數據大而化小的效果。這是一種數據庫原生內置的優化能力,較之前的實例級、庫級、對象級,更為輕量,且無更多感知。
架構
從架構角度來看,這種方式沒有擴展現有資源,與拆分前的架構幾乎沒有區別。
研發
從研發角度來看,幾乎沒有變化。將數據存在分區中,從業務層可做到無感。原有的開發邏輯,一般都可以正常使用,只是在個別地方可能需要有所調整。
運維
從運維角度來看,資源、實例層面管理沒有變化。差別較大的就是對象管理,分區級拆分提供更為靈活的管理方式,支持如分區合并、分裂、交換、清理等能力,可方便對象管理動作。從性能上看,使用分區后,數據庫優化器將針對分區做更多優化動作,相對會有不錯的性能提升。當然,這里需要注意下,不同數據庫在分區上面的能力差異較大,有些數據庫是做的相對不完善,分區可能存在較多限制。
安全
從安全角度來看,分區級拆分與拆分前沒有太大變化。
作者介紹
韓鋒,51CTO社區編輯,CCIA(中國計算機協會)常務理事,前Oracle ACE,騰訊TVP,阿里云MVP,dbaplus等多家社群創始人或專家團成員。有著豐富的一線數據庫架構、軟件研發、產品設計、團隊管理經驗。曾擔任多家公司首席DBA、數據庫架構師等職。在云、電商、金融、互聯網等行業均有涉獵,精通多種關系型數據庫,對NoSQL及大數據相關技術也有涉足,實踐經驗豐富。曾著有數據庫相關著作《SQL優化最佳實踐》、《數據庫高效優化》。