資料庫水平切分實現原理(一)

2021-07-03 15:11:34 字數 2252 閱讀 7192

1.引言

隨著網際網路應用的普及,海量資料的儲存和訪問成為了系統設計的瓶頸問題。對於乙個大型的網際網路應用,每天幾十億pv無疑對資料庫造成了相當高的負載。對於系統的穩定性和擴充套件性造成了極大的問題。

(1)水平切分資料庫:可以降低單台機器的負載,同時最大限度的降低了宕機造成的損失;

(2)通過負載均衡策略:有效的降低了單台機器的訪問負載,降低了宕機的可能性;

(3)通過集群方案:解決了資料庫宕機帶來的單點資料庫不能訪問的問題;

(4)通過讀寫分離策略:最大限度提高了應用張讀取資料的速度和併發量

2.基本原理與概念

(1)什麼是資料切分

如果在單一資料庫上處理應用資料捉襟見肘而需要進行分割槽化之類的處理,是如何辦到的呢?答案就是:sharding。

sharding不是某個特定資料庫附屬的功能,而是在具體實現技術的抽象,是水平擴充套件的解決方案,主要目的是為了實現單點伺服器的i/o能力限制,解決資料庫擴充套件性問題。也就是: 通過一系列的切分規則將資料水平分布到不同的db或table中,再通過相應的db路由或者table路由規則找到需要查詢的具體的db或者table,進行query操作。

article_id(int),tile(varchar(128)),contnet(varchar(1024)),user_id(int)
這樣一張表我們怎樣切分呢?怎樣將這樣的資料分不到不同的資料庫中的表中呢?其實分析blog應用,我們可以得出如下結論:可以使用user_id欄位作為我們分庫的規則基礎

將user_id為1-10000的所有文章放入db1的article表中,將user_id為10001-20000的所有文章放入db2的article表中,以此類推,一直到dbn。

這樣一來,文章資料就被分到了各個資料庫中,達到了資料切分的目的。接下來要解決的就是怎麼找到具體的資料庫呢?解決方法也很明顯:既然分庫的時候我們使用了分割槽欄位user_id,那麼資料庫路由的時候當然少不了user_id。我們知道了user_id,利用分庫時的規則,反過來定位具體資料庫,比如user_id=234,利用剛才的規則,就會定位到db1,降入user_id是12343,利用該規則,就會定位到db2.以此類推,利用分庫的規則,反向路由到具體的db,這個過程我們稱為db路由

(2)如何資料切分

1)分庫

也就是物理上的資料切分。將資料通過一系列的切分規則將資料分布到不同的db伺服器上,通過路由規則訪問特定的資料庫。這樣一來,每次訪問的就不是單台伺服器了,而是n臺,這樣就可以降低單台機器的負載壓力。

分庫方式:

1>按號段分

如用user_id來區分,1-1000的對應db1,1001-2000的對應db2,以此類推。

優點:可部分遷移

缺點:資料分布不均

2>hash取模分

對user_id進行hsah(如果user_id是數字的話,直接用user_id也行),然後用乙個特定的數字,比如需要將乙個資料庫切分成4個資料庫的話,我們就用4對user_id進行取模,也就是user_id%4,這樣的話就有4種結果:1的時候對應db1,2的時候對應db2,3的時候對應db3,0的時候對應db4,這樣一來資料就會非常均勻的將資料分配到4個db中。

優點:資料分布均勻

缺點:不能按照近期效能分攤資料

2)分表

也就是資料庫內的資料切分。對資料通過一系列的切分規則,將資料分不到乙個資料庫的不同表中,如將article表分為article_001,article_002等子表,若干個表水平拼接會在邏輯上組成乙個完整的article表。

這麼做作用是十分明顯的。舉個例子:比如article表中有5000w條資料,此時我們在表中insert一條新的資料,insert完成之後,資料庫會針對這張表重新建立索引,而5000w條資料建立索引的系統開銷是不容忽視的。但是如果我們把錶分為100個子表呢?從article_001一直到article_100,5000w資料平均下來,每個子表中就只有50w條資料,這時候我們向一張只有50w條資料的表中insert之後建立索引的時間就會成數量級的下降,極大的提高了db執行時的效率,提高了db的併發量。

綜上:分庫降低了單點機器的負載;分表提高了了資料操作的效率,尤其是寫操作的效率

資料庫水平切分方法 一

在大中型專案中,在資料庫設計的時候,考慮到資料庫最大承受資料量,通常會把資料庫或者資料表水平切分,以降低單個庫,單個表的壓力。我這裡介紹兩個我們專案中常用的資料表切分方法。當然這些方法都是在程式中 使用一定的技巧來路由到具體的表的。首先我們要確認根據什麼來水平切分?在我們的系統 sns 中,使用者的...

資料庫切分之水平切分

資料庫切分之水平切分 水平切分的目的是為了控制單錶記錄數,從而保證同一型別的資料雜湊到不同的表或者不同的庫中。資料庫水平切分就是對某個表按照路由規則儲存在多個表中,如表t會拆分成t1,t2,t3這些表也有可能儲存在不同的庫中,也有可能儲存在同乙個庫中,如t表分別存在server1.t,server2...

資料庫水平切分法

在大中型專案中,在資料庫設計的時候,考慮到資料庫最大承受資料量,通常會把資料庫或者資料表水平切分,以降低單個庫,單個表的壓力。我這裡介紹兩個我們專案中常用的資料表切分方法。當然這些方法都是在程式中 使用一定的技巧來路由到具體的表的。首先我們要確認根據什麼來水平切分?在我們的系統 sns 中,使用者的...