當(dāng)前位置:首頁(yè) > IT技術(shù) > 數(shù)據(jù)庫(kù) > 正文

淺析什么是數(shù)據(jù)庫(kù)主從復(fù)制、主從復(fù)制作用及其實(shí)現(xiàn)原理;什么是數(shù)據(jù)庫(kù)讀寫(xiě)分離架構(gòu)、讀寫(xiě)分離帶來(lái)的好處及缺點(diǎn)、為什么使用緩存代替讀寫(xiě)分離;什么是數(shù)據(jù)庫(kù)水平切分架構(gòu)及其解決的問(wèn)題
2021-09-10 19:16:31

一、什么是主從復(fù)制

  主從復(fù)制,是用來(lái)建立一個(gè)和主數(shù)據(jù)庫(kù)完全一樣的數(shù)據(jù)庫(kù)環(huán)境,稱為從數(shù)據(jù)庫(kù),主數(shù)據(jù)庫(kù)一般是準(zhǔn)實(shí)時(shí)的業(yè)務(wù)數(shù)據(jù)庫(kù)。

  像在mysql數(shù)據(jù)庫(kù)中,支持單項(xiàng)、異步賦值。在賦值過(guò)程中,一個(gè)服務(wù)器充當(dāng)主服務(wù)器,而另外一臺(tái)服務(wù)器充當(dāng)從服務(wù)器。此時(shí)主服務(wù)器會(huì)將更新信息寫(xiě)入到一個(gè)特定的二進(jìn)制文件中。并會(huì)維護(hù)文件的一個(gè)索引用來(lái)跟蹤日志循環(huán)。這個(gè)日志可以記錄并發(fā)送到從服務(wù)器的更新中去。

  當(dāng)一臺(tái)從服務(wù)器連接到主服務(wù)器時(shí),從服務(wù)器會(huì)通知主服務(wù)器從服務(wù)器的日志文件中讀取最后一次成功更新的位置。然后從服務(wù)器會(huì)接收從哪個(gè)時(shí)刻起發(fā)生的任何更新,然后鎖住并等到主服務(wù)器通知新的更新。

二、主從復(fù)制的作用(好處,或者說(shuō)為什么要做主從)—— 重點(diǎn)

1、做數(shù)據(jù)的熱備,作為后備數(shù)據(jù)庫(kù),主數(shù)據(jù)庫(kù)服務(wù)器故障后,可切換到從數(shù)據(jù)庫(kù)繼續(xù)工作,避免數(shù)據(jù)丟失。

2、架構(gòu)的擴(kuò)展。業(yè)務(wù)量越來(lái)越大,I/O訪問(wèn)頻率過(guò)高,單機(jī)無(wú)法滿足,此時(shí)做多庫(kù)的存儲(chǔ),降低磁盤(pán)I/O訪問(wèn)的評(píng)率,提高單個(gè)機(jī)器的I/O性能。

3、讀寫(xiě)分離,使數(shù)據(jù)庫(kù)能支持更大的并發(fā)。在報(bào)表中尤其重要,由于部分報(bào)表sql語(yǔ)句非常的慢,導(dǎo)致鎖表,影響前臺(tái)服務(wù)。如果前臺(tái)使用master,報(bào)表使用slave,那么報(bào)表sql將不會(huì)造成前臺(tái)鎖,保證了前臺(tái)速度。

(1)在從服務(wù)器可以執(zhí)行查詢工作(即我們常說(shuō)的讀功能),降低主服務(wù)器壓力;(主庫(kù)寫(xiě),從庫(kù)讀,降壓)

(2)在從主服務(wù)器進(jìn)行備份,避免備份期間影響主服務(wù)器服務(wù);(確保數(shù)據(jù)安全)

(3)當(dāng)主服務(wù)器出現(xiàn)問(wèn)題時(shí),可以切換到從服務(wù)器。(提升性能)

三、主從復(fù)制的原理

1、數(shù)據(jù)庫(kù)有個(gè) bin-log 二進(jìn)制文件,記錄了所有sql語(yǔ)句。

2、我們的目標(biāo)就是把主數(shù)據(jù)庫(kù)的bin-log文件的sql語(yǔ)句復(fù)制過(guò)來(lái)。

3、讓其在從數(shù)據(jù)的relay-log重做日志文件中再執(zhí)行一次這些sql語(yǔ)句即可。

4、下面的主從配置就是圍繞這個(gè)原理配置

5、具體需要三個(gè)線程來(lái)操作:

(1)binlog輸出線程:每當(dāng)有從庫(kù)連接到主庫(kù)的時(shí)候,主庫(kù)都會(huì)創(chuàng)建一個(gè)線程,然后發(fā)送binlog內(nèi)容到從庫(kù)。在從庫(kù)里,當(dāng)復(fù)制開(kāi)始的時(shí)候,從庫(kù)就會(huì)創(chuàng)建兩個(gè)線程進(jìn)行處理。

(2)從庫(kù)I/O線程:當(dāng)START SLAVE語(yǔ)句在從庫(kù)開(kāi)始執(zhí)行之后,從庫(kù)創(chuàng)建一個(gè)I/O線程,該線程連接到主庫(kù)并請(qǐng)求主庫(kù)發(fā)送binlog里面的更新記錄到從庫(kù)上。從庫(kù)I/O線程讀取主庫(kù)的binlog輸出線程發(fā)送的更新并拷貝這些更新到本地文件,其中包括relay log文件。

(3)從庫(kù)的SQL線程:從庫(kù)創(chuàng)建一個(gè)SQL線程,這個(gè)線程讀取從庫(kù)I/O線程寫(xiě)到relay log的更新事件并執(zhí)行。

  可以知道,對(duì)于每一個(gè)主從復(fù)制的連接,都有三個(gè)線程。擁有多個(gè)從庫(kù)的主庫(kù)為每一個(gè)連接到主庫(kù)的從庫(kù)創(chuàng)建一個(gè)binlog輸出線程,每一個(gè)從庫(kù)都有它自己的I/O線程和SQL線程。主從復(fù)制如圖? 幫助理解:

四、數(shù)據(jù)庫(kù)讀寫(xiě)分離

  RD:數(shù)據(jù)量太大,數(shù)據(jù)庫(kù)扛不住了,幫忙申請(qǐng)一個(gè)從庫(kù),讀寫(xiě)分離。DBA:數(shù)據(jù)量多少?RD:5000w左右。DBA:讀寫(xiě)吞吐量呢?RD:讀QPS約200,寫(xiě)QPS約30左右。額,數(shù)據(jù)庫(kù)讀寫(xiě)分離雖然不難,但并不是所有的“數(shù)據(jù)庫(kù)扛不住”的場(chǎng)景,都應(yīng)該用讀寫(xiě)分離。

1、什么是數(shù)據(jù)庫(kù)讀寫(xiě)分離?

  一主多從,讀寫(xiě)分離,主動(dòng)同步,是一種常見(jiàn)的數(shù)據(jù)庫(kù)架構(gòu),一般來(lái)說(shuō):

  • 主庫(kù),提供數(shù)據(jù)庫(kù)寫(xiě)服務(wù)

  • 從庫(kù),提供數(shù)據(jù)庫(kù)讀服務(wù)

  • 主從之間,通過(guò)某種機(jī)制同步數(shù)據(jù),例如mysql的binlog

  一個(gè)組從同步集群通常稱為一個(gè)“分組”。

2、分組架構(gòu)究竟解決什么問(wèn)題?

  大部分互聯(lián)網(wǎng)業(yè)務(wù)讀多寫(xiě)少,數(shù)據(jù)庫(kù)的讀往往最先成為性能瓶頸,如果希望:

(1)線性提升數(shù)據(jù)庫(kù)讀性能

(2)通過(guò)消除讀寫(xiě)鎖沖突提升數(shù)據(jù)庫(kù)寫(xiě)性能

  此時(shí)可以使用分組架構(gòu)。一句話,分組架構(gòu)主要解決“數(shù)據(jù)庫(kù)讀性能瓶頸”問(wèn)題,在數(shù)據(jù)庫(kù)扛不住讀的時(shí)候,通常讀寫(xiě)分離,通過(guò)增加從庫(kù)線性提升系統(tǒng)讀性能。

3、為什么不喜歡用 讀寫(xiě)分離 架構(gòu)?

  首先需要明確的是:不是任何讀性能瓶頸都需要使用讀寫(xiě)分離,我們還可以有其他解決方案。在互聯(lián)網(wǎng)的應(yīng)用場(chǎng)景中,常常數(shù)據(jù)量大、并發(fā)量高、高可用要求高、一致性要求高,如果使用“讀寫(xiě)分離”,就需要注意這些問(wèn)題:

(1)數(shù)據(jù)庫(kù)連接池要進(jìn)行區(qū)分,哪些是讀連接池,哪個(gè)是寫(xiě)連接池,研發(fā)的難度會(huì)增加;

(2)為了保證高可用,讀連接池要能夠?qū)崿F(xiàn)故障自動(dòng)轉(zhuǎn)移;

(3)主從的一致性問(wèn)題需要考慮。

  在這么多的問(wèn)題需要考慮的情況下,如果我們僅僅是為了解決“數(shù)據(jù)庫(kù)讀的瓶頸問(wèn)題”,為什么不選擇使用緩存呢?

4、為什么用緩存?

  緩存,也是互聯(lián)網(wǎng)中常常使用到的一種架構(gòu)方式,同“讀寫(xiě)分離”不同,讀寫(xiě)分離是通過(guò)多個(gè)讀庫(kù),分?jǐn)偭藬?shù)據(jù)庫(kù)讀的壓力,而存儲(chǔ)則是通過(guò)緩存的使用,減少了數(shù)據(jù)庫(kù)讀的壓力。他們沒(méi)有誰(shuí)替代誰(shuí)的說(shuō)法,但是,如果在緩存的讀寫(xiě)分離進(jìn)行二選一時(shí),還是應(yīng)該首先考慮緩存。

  為什么呢?緩存的使用成本要比從庫(kù)少非常多;緩存的開(kāi)發(fā)比較容易,大部分的讀操作都可以先去緩存,找不到的再滲透到數(shù)據(jù)庫(kù)。

  當(dāng)然,如果我們已經(jīng)運(yùn)用了緩存,但是讀依舊還是瓶頸時(shí),就可以選擇“讀寫(xiě)分離”架構(gòu)了。簡(jiǎn)單來(lái)說(shuō),我們可以將讀寫(xiě)分離看做是緩存都解決不了時(shí)的一種解決方案。當(dāng)然,緩存也不是沒(méi)有缺點(diǎn)的:對(duì)于緩存,我們必須要考慮的就是高可用,不然,如果緩存一旦掛了,所有的流量都同時(shí)聚集到了數(shù)據(jù)庫(kù)上,那么數(shù)據(jù)庫(kù)是肯定會(huì)掛掉的。

五、數(shù)據(jù)庫(kù)水平切分架構(gòu)

1、什么是數(shù)據(jù)庫(kù)水平切分

  對(duì)于常見(jiàn)的數(shù)據(jù)庫(kù)瓶頸是什么呢?

  其實(shí)是數(shù)據(jù)容量的瓶頸。例如訂單表,數(shù)據(jù)量只增不減,歷史數(shù)據(jù)又必須要留存,非常容易成為性能的瓶頸,而要解決這樣的數(shù)據(jù)庫(kù)瓶頸問(wèn)題,“讀寫(xiě)分離”和緩存往往都不合適,最適合的是什么呢?——? 數(shù)據(jù)庫(kù)水平切分。

  水平切分,也是一種常見(jiàn)的數(shù)據(jù)庫(kù)架構(gòu),一般來(lái)說(shuō):

  • 每個(gè)數(shù)據(jù)庫(kù)之間沒(méi)有數(shù)據(jù)重合,沒(méi)有類(lèi)似binlog同步的關(guān)聯(lián)

  • 所有數(shù)據(jù)并集,組成全部數(shù)據(jù)

  • 會(huì)用算法,來(lái)完成數(shù)據(jù)分割,例如“取?!?/span>

  一個(gè)水平切分集群中的每一個(gè)數(shù)據(jù)庫(kù),通常稱為一個(gè)“分片”

2、水平切分架構(gòu)究竟解決什么問(wèn)題?

  大部分互聯(lián)網(wǎng)業(yè)務(wù)數(shù)據(jù)量很大,單庫(kù)容量容易成為瓶頸,如果希望:

(1)線性降低單庫(kù)數(shù)據(jù)容量

(2)線性提升數(shù)據(jù)庫(kù)寫(xiě)性能

  此時(shí)可以使用水平切分架構(gòu)。一句話總結(jié),水平切分主要解決“數(shù)據(jù)庫(kù)數(shù)據(jù)量大”問(wèn)題,在數(shù)據(jù)庫(kù)容量扛不住的時(shí)候,通常水平切分。

3、總結(jié)

(1)讀寫(xiě)分離,解決“數(shù)據(jù)庫(kù)讀性能瓶頸”問(wèn)題

(2)水平切分,解決“數(shù)據(jù)庫(kù)數(shù)據(jù)量大”問(wèn)題

(3)對(duì)于互聯(lián)網(wǎng)大數(shù)據(jù)量,高并發(fā)量,高可用要求高,一致性要求高,前端面向用戶的業(yè)務(wù)場(chǎng)景,微服務(wù)緩存架構(gòu),可能比數(shù)據(jù)庫(kù)讀寫(xiě)分離架構(gòu)更合適。

本文摘自 :https://www.cnblogs.com/

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >