數(shù)據(jù)庫分庫分表、讀寫分離的原理實(shí)現(xiàn),使用場景

為什么要分庫分表和讀寫分離?

類似淘寶網(wǎng)這樣的網(wǎng)站,海量數(shù)據(jù)的存儲和訪問成為了系統(tǒng)設(shè)計(jì)的瓶頸問題,日益增長的業(yè)務(wù)數(shù)據(jù),無疑對數(shù)據(jù)庫造成了相當(dāng)大的負(fù)載,同時(shí)對于系統(tǒng)的穩(wěn)定性和擴(kuò)展性提出很高的要求。隨著時(shí)間和業(yè)務(wù)的發(fā)展,數(shù)據(jù)庫中的表會越來越多,表中的數(shù)據(jù)量也會越來越大,相應(yīng)地,數(shù)據(jù)操作的開銷也會越來越大;另外,無論怎樣升級硬件資源,單臺服務(wù)器的資源(CPU、磁盤、內(nèi)存、網(wǎng)絡(luò)IO、事務(wù)數(shù)、連接數(shù))總是有限的,最終數(shù)據(jù)庫所能承載的數(shù)據(jù)量、數(shù)據(jù)處理能力都將遭遇瓶頸。分表、分庫和讀寫分離可以有效地減小單臺數(shù)據(jù)庫的壓力。

分庫分表的原理和實(shí)現(xiàn)

1.什么是分區(qū)、分表、分庫

分區(qū)

就是把一張表的數(shù)據(jù)分成N個(gè)區(qū)塊,在邏輯上看最終只是一張表,但底層是由N個(gè)物理區(qū)塊組成的,分區(qū)實(shí)現(xiàn)比較簡單,數(shù)據(jù)庫mysql、oracle等很容易就可支持。

分表

就是把一張表按一定的規(guī)則分解成N個(gè)具有獨(dú)立存儲空間的實(shí)體表。系統(tǒng)讀寫時(shí)需要根據(jù)定義好的規(guī)則得到對應(yīng)的字表明,然后操作它。

分庫

一旦分表,一個(gè)庫中的表會越來越多

將整個(gè)數(shù)據(jù)庫比作圖書館,一張表就是一本書。當(dāng)要在一本書中查找某項(xiàng)內(nèi)容時(shí),如果不分章節(jié),查找的效率將會下降。而同理,在數(shù)據(jù)庫中就是分區(qū)

2.什么時(shí)候考慮使用分區(qū)?

一張表的查詢速度已經(jīng)慢到影響使用的時(shí)候。

sql經(jīng)過優(yōu)化

數(shù)據(jù)量大

表中的數(shù)據(jù)是分段的

對數(shù)據(jù)的操作往往只涉及一部分?jǐn)?shù)據(jù),而不是所有的數(shù)據(jù)

分區(qū)解決的問題

主要可以提升查詢效率

分區(qū)的實(shí)現(xiàn)方式(簡單),例如:

mysql5 開始支持分區(qū)功能

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.什么時(shí)候考慮分表?

一張表的查詢速度已經(jīng)慢到影響使用的時(shí)候。

sql經(jīng)過優(yōu)化

數(shù)據(jù)量大

當(dāng)頻繁插入或者聯(lián)合查詢時(shí),速度變慢

4.分表解決的問題

分表后,單表的并發(fā)能力提高了,磁盤I/O性能也提高了,寫操作效率提高了

查詢一次的時(shí)間短了

數(shù)據(jù)分布在不同的文件,磁盤I/O性能提高

讀寫鎖影響的數(shù)據(jù)量變小

插入數(shù)據(jù)庫需要重新建立索引的數(shù)據(jù)減少

5.分表的實(shí)現(xiàn)方式(復(fù)雜)

需要業(yè)務(wù)系統(tǒng)配合遷移升級,工作量較大。

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

1.平均進(jìn)行分配hash(object)%N(適用于簡單架構(gòu))。

2.按照權(quán)重進(jìn)行分配且均勻輪詢。

3.按照業(yè)務(wù)進(jìn)行分配。

4.按照一致性hash算法進(jìn)行分配(適用于集群架構(gòu),在集群中節(jié)點(diǎn)的添加和刪除不會造成數(shù)據(jù)丟失,方便數(shù)據(jù)遷移)。

7.分庫分表中間件

分表又分為單庫分表(表名不同)和多庫分表(表名相同),不管使用哪種策略都還需要自己去實(shí)現(xiàn)路由,制定路由規(guī)則等可以考慮使用開源的分庫分表中間件,無侵入應(yīng)用設(shè)計(jì),例如淘寶的tddl等。

讀寫分離的原理和實(shí)現(xiàn)

1、什么是讀寫分離

讀寫分離,基本的原理是讓主數(shù)據(jù)庫處理事務(wù)性增、改、刪操作(INSERT、UPDATE、DELETE),而從數(shù)據(jù)庫處理SELECT查詢操作。數(shù)據(jù)庫復(fù)制被用來把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫。

2、為什么要讀寫分離呢?

因?yàn)閿?shù)據(jù)庫的“寫”(寫10000條數(shù)據(jù)到oracle可能要3分鐘)操作是比較耗時(shí)的。

但是數(shù)據(jù)庫的“讀”(從oracle讀10000條數(shù)據(jù)可能只要5秒鐘)。

所以讀寫分離,解決的是,數(shù)據(jù)庫的寫入,影響了查詢的效率。

3、什么時(shí)候要讀寫分離?

數(shù)據(jù)庫不一定要讀寫分離,如果程序使用數(shù)據(jù)庫較多時(shí),而更新少,查詢多的情況下會考慮使用,利用數(shù)據(jù)庫 主從同步 。可以減少數(shù)據(jù)庫壓力,提高性能。當(dāng)然,數(shù)據(jù)庫也有其它優(yōu)化方案。memcache 或是 表折分,或是搜索引擎。都是解決方法。

4.主從復(fù)制、讀寫分離的基本設(shè)計(jì)

在實(shí)際的生產(chǎn)環(huán)境中,對數(shù)據(jù)庫的讀和寫都在同一個(gè)數(shù)據(jù)庫服務(wù)器中,是不能滿足實(shí)際需求的。無論是在安全性、高可用性還是高并發(fā)等各個(gè)方面都是完全不能滿足實(shí)際需求的。因此,通過主從復(fù)制的方式來同步數(shù)據(jù),再通過讀寫分離來提升數(shù)據(jù)庫的并發(fā)負(fù)載能力。

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

讀寫分離的實(shí)現(xiàn):

我們只需要實(shí)現(xiàn)讀寫分離,主從復(fù)制數(shù)據(jù)一般由數(shù)據(jù)庫級來實(shí)現(xiàn)同步,當(dāng)然也可以自己去實(shí)現(xiàn)同步,只是需要考慮的點(diǎn)比較多。

分庫分表、讀寫分離總結(jié):

1.分區(qū)

對業(yè)務(wù)透明,分區(qū)只不過把存放數(shù)據(jù)的文件分成了許多小塊,根據(jù)一定的規(guī)則把數(shù)據(jù)文件(MYD)和索引文件(MYI)進(jìn)行了分割,分區(qū)后的表呢,還是一張表。

2.分表

當(dāng)數(shù)據(jù)量大到一定程度的時(shí)候,都會導(dǎo)致處理性能的不足,這個(gè)時(shí)候就沒有辦法了,只能進(jìn)行分表處理。也就是把數(shù)據(jù)庫當(dāng)中數(shù)據(jù)根據(jù)按照分庫原則分到多個(gè)數(shù)據(jù)表當(dāng)中,這樣,就可以把大表變成多個(gè)小表,不同的分表中數(shù)據(jù)不重復(fù),從而提高處理效率。

3.分庫

分表和分區(qū)都是基于同一個(gè)數(shù)據(jù)庫里的數(shù)據(jù)分離技巧,對數(shù)據(jù)庫性能有一定提升,但是隨著業(yè)務(wù)數(shù)據(jù)量的增加,原來所有的數(shù)據(jù)都是在一個(gè)數(shù)據(jù)庫上的,網(wǎng)絡(luò)IO及文件IO都集中在一個(gè)數(shù)據(jù)庫上的,因此CPU、內(nèi)存、文件IO、網(wǎng)絡(luò)IO都可能會成為系統(tǒng)瓶頸。

當(dāng)業(yè)務(wù)系統(tǒng)的數(shù)據(jù)容量接近或超過單臺服務(wù)器的容量、QPS/TPS接近或超過單個(gè)數(shù)據(jù)庫實(shí)例的處理極限等此時(shí),往往是采用垂直和水平結(jié)合的數(shù)據(jù)拆分方法,把數(shù)據(jù)服務(wù)和數(shù)據(jù)存儲分布到多臺數(shù)據(jù)庫服務(wù)器上。

4.讀寫分離方案

當(dāng)數(shù)據(jù)庫讀遠(yuǎn)大于寫,查詢多的情況,就可以考慮主數(shù)據(jù)負(fù)責(zé)寫操作,從數(shù)據(jù)庫負(fù)責(zé)讀操作,一主多重,從而把數(shù)據(jù)讀寫分離,最后還可以結(jié)合redis等緩存來配合分擔(dān)數(shù)據(jù)的讀操作,大大的降低后端數(shù)據(jù)庫的壓力。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容