后臺系統可擴展性學習筆記(十)Database Partitioning

為了提升數據庫的處理能力,我們把單庫擴展成多庫,并通過更新同步機制(即Replication)來保證多份數據的一致性。然而,在 各種復制方案下,每個數據庫都持有一份完整數據,基于全量數據提供增刪改查服務,單庫的性能瓶頸仍然存在,并將成為限制系統擴展性的關鍵因素。

單庫性能瓶頸

單機的硬件資源是有限的,因此單庫的處理能力也是有限的:

  • 容量有限:數據量可能大到單庫無法容納
  • 性能有限:單庫的讀寫性能同樣受數據量影響,查詢/更新越來越慢

單靠加機器/加庫顯然無法直接解決單機/單庫的性能問題,除非進一步打破庫的邊界,把單庫拆分成多庫(而不只是復制多份)
理論上,Web 應用層也面臨同樣的問題,卻不曾聽說過一個 Web 服務龐大到單機無法部署,這是因為Web 服務在設計之初就會考慮職責劃分與解耦,以便各部分能夠獨立部署、獨立擴展,從 20 年前的 SOA(即面向服務架構,包括微服務架構(Microservices)等變體)起便是如此。

分區 Partitioning

把邏輯數據庫(或其組成元素,例如數據表)拆分成各個獨立部分,這種做法稱為分區(Partitioning)。
就像微服務架構中把單體應用(Monolithic application)拆分成一組小型服務一樣,我們通過分區把單庫拆分成一組(數據規模)更小的庫,各自處理一部分數據,共同分擔流量,主要優勢體現在:

  • 可擴展性:把單庫數據拆分到多庫后,系統的可擴展性不再受限于單庫性能,數據庫層“無限”擴展成為了可能
  • 性能:單庫數據量減少,數據操作更快,甚至允許多庫并行操作
  • 安全性:可以針對(拆出去的)敏感數據,采取更強的安全控制
  • 靈活性:可以對不同的庫(比如按數據重要性)采用不同的監控、備份策略,以縮減成本,提升管理效率。或者對不同類型的數據選用不同的存儲服務,比如大型二進制內容放到 blob 存儲中,更復雜的數據可以存放在文檔數據庫中
  • 可用性:把數據分散放到多個籃子里,能夠避免單點故障,并且單庫故障僅影響一部分數據

具體的,有 3 種拆分策略:

  • 水平分區(Horizontal partitioning,也叫 Sharding):按行拆分,把不同的行放入不同的表中
  • 垂直分區(Vertical partitioning):按列拆分,把一些列放到其它表中
  • 按功能分區(Functional partitioning,有時也叫 Federation):按業務功能拆分,把業務領域中屬于相同界限上下文(Bounded Context)的數據放在一起

當然,這 3 種策略并不沖突,可以結合使用

水平分區 Horizontal partitioning

在這里插入圖片描述
水平分區,即分片(Sharding)。每片(shard)都是原數據的一個子集,共同構成完整的數據集。
與垂直分區相比,水平分區最大的特點是schema 保持不變:每個分區都是一個單獨的數據存儲,但所有分區都有相同的模式。
就像把一張表橫向切幾刀,分成幾段小表,它們的表結構(字段等)完全一致。
這種橫向切分減少了單庫所需存儲的數據量,以及所需承載的流量/操作,另一方面,還減少了資源爭用(contention),有助于提升性能
它的關鍵在于shard key 的選取:
按哪個字段的什么特征來分片,盡可能保證負載被均勻地分散到每一片上。注意,均勻并不意味著要求每一片的數據量均等,重點是均分流量(有些片可能數據量很大,但訪問量卻很低)。同時還要避免產生“熱點”,比如按姓氏首字母對用戶信息進行分片實際上是不均勻的,因為有些字母更常見,此時按用戶 ID 哈希值來分片可能更均勻些。

垂直分區 Vertical partitioning

在這里插入圖片描述
多用于減少 I/O、降低性能成本,比如,按使用頻率把常用字段和不常用的字段分開
比起水平分區,垂直分區的關鍵優勢在于把信息拆的更細,進而允許一些針對性的優化,比如把不經常變化的數據拆分出來,丟到緩存中,把照片等大型二進制內容拆出去單獨存放,或者對部分敏感數據進行針對性的安全控制,另一方面,細粒度的數據劃分也能夠消除一些并發訪問,降低并發訪問量。

按功能分區

在這里插入圖片描述
把不相干的數據剔除出去(把緊密相關的數據放到一起),有助于加強數據隔離,提升數據訪問性能,比如把客戶信息和商品庫存信息分開。

分區的代價

把單庫拆成多庫,雖然能夠解決數據庫的擴展性難題,但也引發了一些新問題:

  • 連表查詢慢:盡量避免跨分區 join、或者考慮并行查詢
  • 全表查詢慢:對于需要掃描全量數據的查詢操作,即便有并行優化也慢,可以通過垂直分區、按功能分區來定位目標分區,避免全表查詢,至于水平分區,可以在應用層維護一張映射表,加快分區定位
  • 不支持事務操作:將事務操作交由應用層來處理
  • 負載不勻導致分區效果大打折扣:考慮增加監控,并根據分析預測定期調整

參考

http://www.ayqy.net/blog/database-partitioning/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376571.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376571.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376571.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于FPGA的HDTV視頻圖像灰度直方圖統計算法設計

隨著HDTV的普及,以LCD-TV為主的高清數字電視逐漸進入蓬勃發展時期。與傳統CRT電視不同的是,這些高清數字電視需要較復雜的視頻處理電路來驅動,比如:模數轉換(A/D Converter)、去隔行(De-interla…

后臺系統可擴展性學習筆記(十一)Database Denormalization

之前的兩篇筆記中談到了從單庫擴展到多庫以承載更多的請求量以及單庫(表)拆分成多庫(表),打破單庫的性能瓶頸。 這都是為了應對大數據量下的措施。 然而,除卻數據量外,還有一個極其影響單庫性能…

Java Swing 影樓管理系統之登錄功能

開頭打廣告,Java1234.com。 首先,來個效果圖。 關鍵代碼 1,界面層 private void Jb_DengLuActionPerformed(java.awt.event.ActionEvent evt) {// TODO add your handling code here:String UserName this.Jb_UserNameTxt.getText();String …

Bdsyn百度手機助手是何物,它是怎樣神不知鬼不覺地安裝到你的電腦里的?

【電腦軟件管理中Bdsyn手機助手的問題】Bdsyn手機助手 is developed by Baidu, Inc. and is used by 10 users of Software Informer. 并不是本人安裝的(應該是自己自己主動安裝的),卸載以后過幾天又會出如今軟件列表里。百度搜索卻無法搜索出…

后臺系統可擴展性學習筆記(十二)NoSQL

文章目錄NoSQL定義NoSQL種類鍵值存儲文檔存儲寬列存儲圖形數據庫NoSQL 意味著什么ACID vs. BASESQL or NoSQLNoSQL定義 不同于關系型數據庫,NoSQL 數據庫(也叫非 SQL 或非關系型數據庫)提供的數據存儲、檢索機制并不是基于表關系建模的。沒有…

android2.2應用開發之IccCard(sim卡或USIM卡)

tyle"margin:20px 0px 0px; font-size:14px; line-height:26px; font-family:Arial; color:rgb(51,51,51)"> 如果要做android通訊錄的聯系人的機卡混排顯示,由于手機卡類型的不同,導致手機卡存儲容量以及可以存儲信息不同,就要涉…

后臺系統可擴展性學習筆記(十三)緩存

文章目錄在哪兒加緩存緩存什么內容緩存原始查庫結果緩存數據對象怎么查詢緩存結果預留緩存模式直讀模式直寫模式回寫式緩存繞寫式緩存提前刷新模式緩存滿了如何處理參考讀寫分離、分庫分表、反范式化、采用 NoSQL……如果這些擴展手段全都上了,數據響應依舊越來越慢…

[linux]gdb調試

使用gdb可以在命令行方便地調試,并且能以命令程序的方式調試源代碼。 常用命令簡寫print-p,step-s,next-n 進入gdb //方式一 gdb test//test 為可執行文件,使用-g編譯得到 //方式二 gdb -q //不顯示版權信息 file test //file命令打開文件 退出gdb quit …

后臺系統可擴展性學習筆記(十四)異步機制與MQ

對于 Web 服務而言,提升可擴展性的主要途徑是將耗時的同步工作改成異步處理,從而允許將這些工作“外包”給多個 Worker 去做,或者提前完成能夠預知的部分。 異步機制與可擴展性之間的關系需要從(異步)并行處理的優勢說…

RegisterClientScriptBlock與 RegisterStartupScript區別

Page.ClientScript.RegisterClientScriptBlock而用Page.ClientScript.RegisterStartupScript是因為:RegisterStartupScript 把script放置在ASP.NET page的底部,而RegisterClientScriptBlock把script放置在ASP.NET page的頂部,用RegisterClien…

【Web后端筆記】SQL Server與java數據類型對應

編號數據庫類型JDBC類型JDBC索引描述1intjava.lang.Integer4 2varcharjava.lang.String12 3charjava.lang.String1 4ncharjava.lang.String1 5nvarcharjava.lang.String12 6textjava.lang.String-1 7ntextjava.lang.String-1 8tinyintjava.lang.Integer-6 9intjava.lang.Intege…

后臺系統可擴展性學習筆記

整理了一下筆記目錄,將以前學習的一些知識串聯起來了,比如cdn、負載均衡、中間件,以前只是各自了解了一點,現在大概理清了后臺系統設計中他們各自的作用。 后臺系統可擴展性學習筆記(一)概要 后臺系統可擴展…

TFS 強制刪除鎖定文件(數據庫)

TFS:TFS2010 VS:VS2012 OS:Windows2008 DB:Sqlserver2008 R2 我們在團隊開發當中,版本控制是一個不可忽略的工具。我們團隊使用的是TFS2010這個版本控制器。 但在團隊實際協作開發當中,團隊成員難免有電腦損壞或人員離職情況&…

【轉】Java:String、StringBuffer和StringBuilder的區別

1 String String:字符串常量,字符串長度不可變。Java中String是immutable(不可變)的。 String類的包含如下定義: [java]view plaincopy /** The value is used for character storage. */ private final char value[]…

Linux中exit與_exit的區別

在exit,_exit的區別 - exit()與_exit()函數的區別(Linux系統中)2012-03-20 15:19:53 分類: LINUX 注:exit()就是退出,傳入的參數是程序退出時的狀態碼,0表示正常退出,其他表示非正常退出&…

光標閃爍問題的解決辦法

在調用Windows API函數SetCursor設置光標時,可能會碰到閃爍的問題:移動鼠標,光標在Class Cursor(即注冊窗口類時指定的Cursor)與預設Cursor之間閃爍。 在MSDN上有關SetCursor函數的備注中強調,如果Class Cursor非空,那…

視頻編解碼基礎

文章目錄前戲編解碼技術流程主流視頻編碼標準視頻傳輸面臨的問題視頻傳輸差錯控制視頻傳輸Qos質量保證參數人類視覺系統HVS 以及相應編碼措施正餐編碼層次與碼流結構PB幀編碼IBBP序列編碼結構圖像編碼結構條帶編碼結構宏塊編碼結構塊編碼結構預測技術碼率控制實例H264前戲 編解…

XShell 屏幕鎖定的恢復方法(Ctrl+Q)

操作XShell過程中很多時間大家會習慣性的按CtrlS進行保存. CtrlS在XShell的作用是屏幕鎖定,很多朋友會無法操作,會直接把窗口關閉。 解決方法: 快捷鍵 CtrlQ 即能完成解鎖!轉載于:https://www.cnblogs.com/liangle/p/3173475.html

adb端口被占用

程序不能執行,kill掉任務管理器里面adb服務,重新連接設備仍然有錯 查到可能是adb端口被占用 查看adb用的是哪個端口:C:\Users\wanglin>adb nodaemon server 查看誰占用了這個端口:C:\Users\wanglin>netstat -ano | findstr …

實時語音通訊丟包補償技術

文章目錄基于發送端丟包補償技術原理與媒體無關的前向差錯糾正媒體相關前向差錯糾正交織技術基于接受端丟包補償技術基于插入方法基于插值方法基于重構的方法應用建議非交互式交互式拓展閱讀參考丟包補償技術可以分為兩類:基于發送端補償、基于接受端補償 基于發送…