資料庫切分「基本思想」 「常見問題」

2021-09-02 15:37:51 字數 2214 閱讀 3214

優點:

分庫降低了單點機器的負載;

分表提高了資料操作的效率,尤其是write操作的效率

1.垂直切分

適用場景:表多資料多。

特點:規則簡單、業務邏輯清晰、業務耦合度非常低。根據相同業務使用的表放到相同的資料庫。在垂直切分出的表聚集內,找出「根元素」,按「根元素」進行水平切分,也就是從「根元素」開始,把所有和它直接與間接關聯的資料放入乙個shard(碎片)裡,如對於社交**,幾乎所有資料最終都會關聯到某個使用者上,基於使用者進行切分就是最好的選擇。再比如論壇系統,使用者和論壇兩個模組應該在垂直切分時被分在了兩個shard裡,對於論壇模組來說,forum(論壇)顯然是聚合根,因此按forum進行水平切分,把forum裡所有的帖子和回帖都隨forum放在乙個shard裡是很自然的。

2.水平切分

適用場景:表少資料多。

特點:拆分規則複雜、後期維護複雜,針對數量大的表拆分串聯,同乙個表中的不同資料拆分到不同的資料庫中。

切分優點:索引開銷降低,減少單錶寫操作鎖表時間。

如article表中現在有5000w條資料,此時我們需要在這個表中增加(insert)一條新的資料,insert完畢後,其他資料庫 會針對這張表重新建立索引,5000w行資料建立索引的系統開發開銷還是不容忽視的。但是反過來,假如我們將這個表分成100個table呢,從article_001一直到article_100,5000w行資料平均下來,每個子表裡邊就只有50萬行資料,這時候我們向一張只有50w行資料的table中insert資料後建立索引的時間就會呈數量級的下降,極大了提高了db的執行時效率,提高了db的併發量。

切分規則:

a.按號段分

eg:id為區分,1~1000的對應db1,1001~2000的對應db2,2001~2100的對應db3,以此類推

id為區分,1~1000的對應db1,1001~2000的對應db2,以此類推

優點:可部分遷移

缺點:資料分布不均

b.hash取模分

對id進行hash(或者如果id是數值型的話直接使用id的值也可),然後用乙個特定的數字,比如應用開發中需要將乙個其他資料庫 切分成4個其他資料庫 的話,我們就用4這個數字對id的hash值進行取模運算,也就是id%4,這樣的話每次運算就有四種可能:結果為1的時候對應db1;結果為2的時候對應db2;結果為3的時候對應db3;結果為0的時候對應db4,這樣一來就非常均勻的將資料分配到4個db中。

優點:資料分布均勻

缺點:資料遷移的時候麻煩,不能按照機器效能分攤資料

c.在認證庫中儲存其他資料庫配置

就是建立乙個db,這個db單獨儲存user_id到db的對映關係,每次訪問其他資料庫 的時候都要先查詢一次這個其他資料庫 ,以得到具體的db資訊,然後才能進行我們需要的查詢操作。

優點:靈活性強,一對一關係

缺點:每次查詢之前都要多一次查詢,效能大打折扣

通常系統水平切分和垂直切分聯合使用,系統做垂直切分,個別大表水平切分,即先垂直切後水平切。

3.切分的常見問題和應對策略

a.事務問題:

解決事務問題目前有兩種可行的方案:分布式事務和通過應用程式與資料庫共同控制實現事務下面對兩套方案進行乙個簡單的對比。

方案一:使用分布式事務

優點:交由資料庫管理,簡單有效

缺點:效能代價高,特別是shard越來越多時

方案二:由應用程式和資料庫共同控制

原理:將乙個跨多個資料庫的分布式事務分拆成多個僅處

於單個資料庫上面的小事務,並通過應用程式來總控

各個小事務。

優點:效能上有優勢

缺點:需要應用程式在事務控制上做靈活設計。如果使用   

了spring的事務管理,改動起來會面臨一定的困難。

b.跨節點join的問題

只要是時行切分,跨節點join的問明是不可避免的。但是良好的設計和切分卻可以減少此類情況的發生。解決這一問題的普遍做法是分兩次查詢實現。在第一次查詢的結果集中找出關聯資料的id,根據這些id發起第二次請求得到關聯資料。

c.跨節點的count,order by,group by以及聚合函式問題

這些是一類問題,因為它們都需要基於全部資料集合進行計算。多數的**都不會自動處理合併工作。解決方案:與解決跨節點join問題的類似,分別在各個節點上得到結果後在應用程式端進行合併。和join不同的是每個結點的查詢可以並行執行,因此很多時候它的速度要比單一大表快很多。但如果結果集很大,對應用程式記憶體的消耗是乙個問題。

資料庫Sharding的基本思想和切分策略

一 基本思想 sharding的基本思想就要把乙個資料庫切分成多個部分放到不同的資料庫 server 上,從而緩解單一資料庫的效能問題。不太嚴格的講,對於海量資料的資料庫,如果是因為表多而資料多,這時候適合使用垂直切分,即把關係緊密 比如同一模組 的表切分出來放在乙個server上。如果表並不多,但...

資料庫Sharding的基本思想和切分策略

本文著重介紹sharding的基本思想和理論上的切分策略,關於更加細緻的實施策略和參考事例請參考我的另一篇博文 資料庫分庫分表 sharding 系列 一 拆分實施策略和示例演示 一 基本思想 sharding的基本思想就要把乙個資料庫切分成多個部分放到不同的資料庫 server 上,從而緩解單一資...

資料庫Sharding的基本思想和切分策略

本文著重介紹sharding的基本思想和理論上的切分策略,關於更加細緻的實施策略和參考事例請參考我的另一篇博文 資料庫分庫分表 sharding 系列 一 拆分實施策略和示例演示 一 基本思想 sharding的基本思想就要把乙個資料庫切分成多個部分放到不同的資料庫 server 上,從而緩解單一資...