分庫分表相關知識

2021-08-21 10:41:35 字數 1924 閱讀 7207

背景情況

使用者表達到了 幾千萬級別,在做很多操作都比較吃力,.所以,考慮對其進行分庫分表,或者在進行高併發讀寫的時候採用分庫分表的形式也更能增強讀寫的效能,保證服務的穩定高效

常用的切分方案

資料的切分(sharding)根據其切分規則的型別,可以分為兩種切分模式。一種是按照不同的表(或者schema)來切分到不同的資料庫(主機)之上,這種切可以稱之為資料的垂直(縱向)切分;另外一種則是根據表中的資料的邏輯關係,將同乙個表中的資料按照某種條件拆分到多台資料庫(主機)上面,這種切分稱之為資料的水平(橫向)切分。

垂直切分

即業務切分

下面來分析下垂直切分的優缺點:

優點:1. 拆分後業務清晰,拆分規則明確。

2.系統之間整合或擴充套件容易。

3.資料維護簡單。

缺點:1. 部分業務表無法 join,只能通過介面方式解決,提高了系統複雜度。

2. 受每種業務不同的限制存在單庫效能瓶頸,不易資料擴充套件跟效能提高。

3. 事務處理複雜。

由於垂直切分是按照業務的分類將表分散到不同的庫,所以有些業務表會過於龐大,存在單庫讀寫與儲存瓶

頸,所以就需要水平拆分來做解決。

水平切分

相對於垂直拆分,水平拆分不是將表做分類,而是按照某個欄位的某種規則來分散到多個庫之中,每個表中

包含一部分資料。簡單來說,我們可以將資料的水平切分理解為是按照資料行的切分,就是將表中的某些行切分到乙個資料庫,而另外的某些行又切分到其他的資料庫中

優點:1.拆分規則抽象好,join 操作基本可以資料庫做。

2.不存在單庫大資料,高併發的效能瓶頸。

3.應用端改造較少。

4.提高了系統的穩定性跟負載能力。

缺點:1.拆分規則難以抽象。

2.分片事務一致性難以解決。

3.資料多次擴充套件難度跟維護量極大。

4.跨庫 join 效能較差。

讓我們從普遍的情況來考慮資料的切分:一方面,乙個庫的所有表通常不可能由某一張表全部串聯起來,這句話暗含的意思是,水平切分幾乎都是針對一小搓一小搓(實際上就是垂直切分出來的塊)關係緊密的表進行的,而不可能是針對所有表進行的。另一方面,一些負載非常高的系統,即使僅僅只是單個表都無法通過單台資料庫主機來承擔其負載,這意味著單單是垂直切分也不能完全解決問題。因此多數系統會將垂直切分和水平切分聯合使用,先對系統做垂直切分,再針對每一小搓表的情況選擇性地做水平切分。從而將整個資料庫切分成乙個分布式矩陣。

切分共同的問題

前面講了垂直切分跟水平切分的不同跟優缺點,會發現每種切分方式都有缺點,但共同的特點缺點有:

1.事務問題:

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

方案一:使用分布式事務

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

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

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

原理:將乙個跨多個資料庫的分布式事務分拆成多個僅處於單個資料庫上面的小事務,並通過應用程式來總控各個小事務。

優點:效能上有優勢

缺點:需要應用程式在事務控制上做靈活設計。如果使用了spring的事務管理,改動起來會面臨一定的困難。

2.跨節點join的問題

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

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

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

分庫分表相關

timestamp zookeeper node number sequence local hash goupid shopid 1.timestamp 32位unix時間戳,包含年月資訊,用於分表 2.zookeeper node number 通過zookeeper獲取唯一node numbe...

廣義表相關知識

讀書而不思考,等於吃飯而不消化。波爾克 廣義表 lists,又稱列表 是一種非線性的資料結構,是線性表的一種推廣。即廣義表中放鬆對錶元素的原子限制,容許它們具有其自身結構。它被廣泛的應用於人工智慧等領域的表處理語言lisp語言中。在lisp語言中,廣義表是一種最基本的資料結構,就連lisp 語言的程...

oracle臨時表相關知識

在oracle8i或以上版本中,可以建立以下兩種臨時表 1。會話特有的臨時表 create global temporary on commit preserve rows 2。事務特有的臨時表 create global temporary on commit delete rows create...