數據庫分庫分表、讀寫分離的原理和實現,以及使用場景

爲何要分庫分表和讀寫分離?mysql

相似淘寶網這樣的網站,海量數據的存儲和訪問成爲了系統設計的瓶頸問題,日益增加的業務數據,無疑對數據庫形成了至關大的負載,同時對於系統的穩定性和擴展性提出很高的要求。隨着時間和業務的發展,數據庫中的表會愈來愈多,表中的數據量也會愈來愈大,相應地,數據操做的開銷也會愈來愈大;另外,不管怎樣升級硬件資源,單臺服務器的資源(CPU、磁盤、內存、網絡IO、事務數、鏈接數)老是有限的,最終數據庫所能承載的數據量、數據處理能力都將遭遇瓶頸。分表、分庫和讀寫分離能夠有效地減少單臺數據庫的壓力。redis

分庫分表的原理和實現算法

1.什麼是分區、分表、分庫sql

分區數據庫

就是把一張表的數據分紅N個區塊,在邏輯上看最終只是一張表,但底層是由N個物理區塊組成的,分區實現比較簡單,數據庫mysql、oracle等很容易就可支持。後端

分表緩存

就是把一張表按必定的規則分解成N個具備獨立存儲空間的實體表。系統讀寫時須要根據定義好的規則獲得對應的字代表,而後操做它。安全

分庫服務器

一旦分表,一個庫中的表會愈來愈多網絡

將整個數據庫比做圖書館,一張表就是一本書。當要在一本書中查找某項內容時,若是不分章節,查找的效率將會降低。而同理,在數據庫中就是分區。

2.何時考慮使用分區?

一張表的查詢速度已經慢到影響使用的時候。

sql通過優化

數據量大

表中的數據是分段的

對數據的操做每每只涉及一部分數據,而不是全部的數據

分區解決的問題

主要能夠提高查詢效率

分區的實現方式(簡單),例如:

mysql5 開始支持分區功能

CREATE TABLE sales ( id INT AUTO_INCREMENT,

amount DOUBLE NOT NULL,

order_day DATETIME NOT NULL,

PRIMARY KEY(id, order_day)

) ENGINE=Innodb

PARTITION BY RANGE(YEAR(order_day)) (

PARTITION p_2010 VALUES LESS THAN (2010),

PARTITION p_2011 VALUES LESS THAN (2011),

PARTITION p_2012 VALUES LESS THAN (2012),

PARTITION p_catchall VALUES LESS THAN MAXVALUE);

3.何時考慮分表?

一張表的查詢速度已經慢到影響使用的時候。

sql通過優化

數據量大

當頻繁插入或者聯合查詢時,速度變慢

4.分表解決的問題

分表後,單表的併發能力提升了,磁盤I/O性能也提升了,寫操做效率提升了

查詢一次的時間短了

數據分佈在不一樣的文件,磁盤I/O性能提升

讀寫鎖影響的數據量變小

插入數據庫須要從新創建索引的數據減小

5.分表的實現方式(複雜)

須要業務系統配合遷移升級,工做量較大。

6.常見分表、分庫經常使用策略:

1.平均進行分配hash(object)%N(適用於簡單架構)。

2.按照權重進行分配且均勻輪詢。

3.按照業務進行分配。

4.按照一致性hash算法進行分配(適用於集羣架構,在集羣中節點的添加和刪除不會形成數據丟失,方便數據遷移)。

7.分庫分表中間件

分表又分爲單庫分表(表名不一樣)和多庫分表(表名相同),無論使用哪一種策略都還須要本身去實現路由,制定路由規則等,能夠考慮使用開源的分庫分表中間件,無侵入應用設計,例如淘寶的tddl等。

讀寫分離的原理和實現

一、什麼是讀寫分離

讀寫分離,基本的原理是讓主數據庫處理事務性增、改、刪操做(INSERT、UPDATE、DELETE),而從數據庫處理SELECT查詢操做。數據庫複製被用來把事務性操做致使的變動同步到集羣中的從數據庫。

二、爲何要讀寫分離呢?

由於數據庫的「寫」(寫10000條數據到oracle可能要3分鐘)操做是比較耗時的。

可是數據庫的「讀」(從oracle讀10000條數據可能只要5秒鐘)。

因此讀寫分離,解決的是,數據庫的寫入,影響了查詢的效率。

三、何時要讀寫分離?

數據庫不必定要讀寫分離,若是程序使用數據庫較多時,而更新少,查詢多的狀況下會考慮使用,利用數據庫 主從同步 。能夠減小數據庫壓力,提升性能。固然,數據庫也有其它優化方案。memcache 或是 表折分,或是搜索引擎。都是解決方法。

4.主從複製、讀寫分離的基本設計

在實際的生產環境中,對數據庫的讀和寫都在同一個數據庫服務器中,是不能知足實際需求的。不管是在安全性、高可用性仍是高併發等各個方面都是徹底不能知足實際需求的。所以,經過主從複製的方式來同步數據,再經過讀寫分離來提高數據庫的併發負載能力。

一臺主、多臺從,主提供寫操做,從提供讀操做。

讀寫分離的實現:

咱們只須要實現讀寫分離,主從複製數據通常由數據庫級來實現同步,固然也能夠本身去實現同步,只是須要考慮的點比較多。

分庫分表、讀寫分離總結

1.分區

對業務透明,分區只不過把存放數據的文件分紅了許多小塊,根據必定的規則把數據文件(MYD)和索引文件(MYI)進行了分割,分區後的表呢,仍是一張表。

2.分表

當數據量大到必定程度的時候,都會致使處理性能的不足,這個時候就沒有辦法了,只能進行分表處理。也就是把數據庫當中數據根據按照分庫原則分到多個數據表當中,這樣,就能夠把大表變成多個小表,不一樣的分表中數據不重複,從而提升處理效率。

3.分庫

分表和分區都是基於同一個數據庫裏的數據分離技巧,對數據庫性能有必定提高,可是隨着業務數據量的增長,原來全部的數據都是在一個數據庫上的,網絡IO及文件IO都集中在一個數據庫上的,所以CPU、內存、文件IO、網絡IO均可能會成爲系統瓶頸。

當業務系統的數據容量接近或超過單臺服務器的容量、QPS/TPS接近或超過單個數據庫實例的處理極限等此時,每每是採用垂直和水平結合的數據拆分方法,把數據服務和數據存儲分佈到多臺數據庫服務器上。

4.讀寫分離方案

當數據庫讀遠大於寫,查詢多的狀況,就能夠考慮主數據負責寫操做,從數據庫負責讀操做,一主多重,從而把數據讀寫分離,最後還能夠結合redis等緩存來配合分擔數據的讀操做,大大的下降後端數據庫的壓力。

相關文章
相關標籤/搜索