分散式資料庫拆表拆庫的常用策略

来源:https://www.cnblogs.com/wohexiaocai/archive/2018/07/13/9304262.html
-Advertisement-
Play Games

在大容量,高負荷的web系統中,對資料庫進行一系列拆分,可有效提升資料庫容量和性能。在初學程式的早期,程式員通常都喜歡按傳統資料庫設計模式,設計為單庫和單一功能表的結構,這樣的結構在數據量和併發量達到一定程度之後,會出現嚴重性能問題和維護問題。在出現問題的時候才著手進行優化,會非常痛苦,所以應該在系 ...


在大容量,高負荷的web系統中,對資料庫進行一系列拆分,可有效提升資料庫容量和性能。在初學程式的早期,程式員通常都喜歡按傳統資料庫設計模式,設計為單庫和單一功能表的結構,這樣的結構在數據量和併發量達到一定程度之後,會出現嚴重性能問題和維護問題。在出現問題的時候才著手進行優化,會非常痛苦,所以應該在系統架設之初就考慮好之後會出現的問題。

目前有些資料庫策略是採用單庫結構,然後通過同步分發到數台伺服器實現讀寫分離。個人覺得這樣的策略非常笨拙,還是想辦法將其分隔開來好,否則每台機器的記憶體都很容易超支。

一般只對數據量比較大的表進行拆分,這應該沒有什麼異議;還有一種是有可能會進行維護的比較重要的表,比如文章目錄表,如果有從其它系統倒數據進來的可能的話,也要拆掉,不然倒數據時一不小心把目錄表弄壞了,發現忘了備份,那真是欲哭無淚。

下麵來分析一下:

一、時間結構

如果業務系統對時效性較高,比如新聞發佈系統的文章表,可以把資料庫設計成時間結構,按時間分有幾種結構:

1) 平板式

表類似:
article_200901
article_200902
article_200903

用年來分還是用月可自定,但用日期的話表就太多了,也沒這必要。一般建議是按月分就可以。

這種分法,其難處在於,假設我要列20條數據,結果這三張表裡都有2條,那麼業務上很有可能要求讀三次表。如果時間長了,有幾十張表,而每張表是0條,那不就是要讀完整個系統的表才行麽?另外這個結構,要作分頁是比較難實現的。

主鍵:在這個系統中,主鍵是13位帶毫秒的時間戳,不要用自動編號,否則難以通過主鍵定位到表,也可以在查詢時帶上時間,但比較煩瑣。

2) 歸檔式

表類似:
article_old
article_new

為瞭解決平板式的缺點,可以採用時間歸檔式設計,可以看到這個系統只有兩張表。一張是舊文章表,一張是新文章表,新文章表放2個月的信息,每天定期把2個月中的最早一天的文章歸入舊表中。這樣一方面可以解決性能問題,因為一般新聞發佈系統讀取的都是新的內容,舊的內容讀取少;第二可以委婉地解決功能問題,比如平板式所說的問題,在歸檔式中最多也只需要讀2張表就完成了。

歸檔式的缺點在於舊表容量還是相對比較大,如果業務允許,可對舊表中的超舊內容進行再歸檔或直接清理掉。

二、版塊結構

如果按照文章的所屬版塊進行拆表,比如新聞、體育版塊拆表,一方面可以使每個表數據量分離,另一方面是各版塊之間相互影響可降到最低。假如新聞版塊的數據表損壞或需要維護,並不會影響到體育版塊的正常工作,從而降低了風險。版塊結構同時常用於bbs這樣的系統。

板塊結構也有幾種分法:

1) 對應式

對於版塊數量不多,而且較為固定的形式,就直接對應就好。比如新聞版塊,可以分出新聞的目錄表,新聞的文章表等。

news_category
news_article
sports_category
sports_article

可看到每一個版塊都對應著一組相同的表結構,好處就是一目瞭然。在功能上,因為版塊之間還是有一些隔閡,所以需要聯合查詢的需求不多,開發上比時間結構的方式要輕鬆。

主鍵:依舊要考慮的,在這個系統中,主鍵是版塊+時間戳,單純的時間戳或自動編號也能用,查詢時要記得帶上版塊用於定位表。

2) 冷熱式

對應式的缺點是,如果版塊數量很大而且不確定,那要分出的表數量就太多了。舉個例子:百度貼吧,如果按一個詞條一個表設計,那得有多少張表呢?

用這樣的方式吧。

tieba_汽車
tieba_飛機
tieba_火箭
tieba__unite

這個表汽車、火箭表是屬於熱門表,定義為新建的版塊放在unite表裡面,待到其超過一萬張主貼的時候才開對應表結構。因為在貼吧這種系統中,冷門版塊肯定比熱門版塊多得多,這些冷門版塊通常只有幾張帖子,為它們開表也太浪費了;同時熱門版塊數量和訪問量等,又比冷門版塊多得多,非常有特點。

unite表還可以擴展成哈希表,利用詞條的md5編碼,可以分成n張表,我算了一下,md5前一位可分16張表,兩位即是256張表。

tieba_unite_ab
tieba_unite_ac
...

三、哈希結構

哈希結構通常用於博客之類的基於用戶的場合,在博客這樣的系統里有幾個特點,1是用戶數量非常多,2是每個用戶發的文章數量都較少,3是用戶發文章不定期,4是每個用戶發得不多,但總量仍非常之大。基於這些特點,用以上所說的任何一種分表方式都不合適,一沒有固定的時效不宜用時間拆,二用戶很多,而且還偏偏都是冷門,所以也不宜用版塊(用戶)拆。

哈希結構在上面有所提及,既然按每個用戶不好直接拆,那就把一群用戶歸進一個表好了。

blog_aa
blog_ab
blog_ac
...

如上所說,md5取前兩位哈希可以達到1296張表,如果覺得不夠,那就再加一位,總數可達46656張表,還不夠?

表的數量太多,要創建這些表也是挺麻煩的,可以考慮在程式里往資料庫insert之前,多執行一句判斷表存在與否並創建表的語句,很實用,消耗也並不很大。

主鍵:依舊要考慮的,在這個系統中,主鍵是用戶ID+時間戳,單純的時間戳或自動編號也能用,但查詢時要記得帶上用戶名用於定位表。

四、總分結構

以上的這些結構,根據每個業務系統,能想出的估計還有很多。不過現在互聯網業務越來越複雜了,有些時候,單一的拆分法還不能實現需求,需要幾種拆分方案一起實施,多管齊下,這時候其中的邏輯會讓人繞暈。我就開發過一個系統,僅僅是將哈希結構和時間結構混著一用,覺得邏輯就相當複雜。

所以,除了拆表之外,按最原始的單庫單表,再建一個總表,是非常有利的架構。在這個架構中,每次往資料庫會寫入兩倍數據,讀取主要依賴拆表提升性能,總表用於實現拆表後難以實現的功能並且用於每天的定時備份;另外總表和分表還相互是一個完整的備份,任何一個分表損壞或數據不正常,都可以從總表中讀到正確的數據並恢復,反之亦然。

在總分結構中,讓人感到質疑的是總表的性能和可維護性。我的方案是總表可採用相對能保證穩定的一些服務軟體和架構,例如oracle,或 lvs+pgpool+PostgreSQL,重點保證數據穩定;相對的,分表就用輕量級的mysql,重點在於速度。能夠對總分表各採用不同的軟體和方案,也是總分結構的一大特點。



總結:如何通過拆表來優化系統,最基本的是要按業務需求和特點分析。本文僅僅是提供了幾種基本方法,具體工作要先動腦好好想,千萬不可亂套,用錯了工作量要加十倍噢。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 響應式 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 ... ...
  • function Obj(){} Obj.prototype={ scroll:function(){ /* 主要是做相容處理 這裡必須時!=null 因為預設值和每次滾動的時侯 都可以值為0 但是 if(0)為假 所以就只要不為null 就執行 ... ...
  • 仿Jquery查詢 ...
  • 背景 因為歷史原因,之前很多的系統都會是 頂級頁面+Iframe來載入子級頁面的這種模式構件系統,而且系統都只能運行在IE6或者IE 高版本相容模式下(IE 7模式)。 隨著現在的審美原來越高,腳本能里越來越強,無論是用戶和是軟體商都希望能系統升級,那麼在升級的過程中,肯定是要保證原有的系統能正常運 ...
  • 涉及知識點: 1、垂直排列,水平排列 2、居中對齊 示例: 1、預設排版 , 一個父組件裡面兩個子view 顯示效果: 2、先給父view設置一個高度和顏色值,用於看效果 3、實現水平排列和垂直排列的樣式 水平排列: > 垂直排列(不進行設置,預設垂直排列): > 4、實現居中效果 居中效果分為兩種 ...
  • 使用yarn的優點,簡而言之就是:鎖定版本,下載之前檢查完整性。 輸入 yarn --help 可以獲得幫助 ...
  • 喜歡的朋友可以關註下,粉絲也缺。 自從Spring推出Boot,Cloud系列之後,一度成為熱門的框架,現在大部分的招聘要求都要有相關的開發經驗,藉此我在這裡就給大家分享一下如何玩轉SpringBoot跟Mybatis。 這裡我給大家提供我創建的demo下載地址 https://download.c ...
  • 控制反轉是應用於軟體工程領域中的,在運行時被裝配器對象來綁定耦合對象的一種編程技巧,對象之間耦合關係在編譯時通常是未知的。在傳統編程方式中,業務邏輯的流程是應用程式中早已被設定好關聯關係的對象來決定的。在使用控制反轉的情況下,業務邏輯的流程是由對象關係圖來決定的,該對象關係圖有裝配器負責實例化,這種 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...