溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

高性能數(shù)據(jù)庫(kù)中的讀寫(xiě)分離原理是什么

發(fā)布時(shí)間:2021-12-02 10:37:33 來(lái)源:億速云 閱讀:110 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)高性能數(shù)據(jù)庫(kù)中的讀寫(xiě)分離是怎樣的,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著小編一起來(lái)看看吧。

高性能數(shù)據(jù)庫(kù)中的讀寫(xiě)分離原理是什么

雖然近十年來(lái)各種存儲(chǔ)技術(shù)飛速發(fā)展,但關(guān)系數(shù)據(jù)庫(kù)由于其 ACID 的特性和功能強(qiáng)大的 SQL 查詢(xún),目前還是各種業(yè)務(wù)系統(tǒng)中關(guān)鍵和核心的存儲(chǔ)系統(tǒng),很多場(chǎng)景下高性能的設(shè)計(jì)最核心的部分就是關(guān)系數(shù)據(jù)庫(kù)的設(shè)計(jì)。

不管是為了滿(mǎn)足業(yè)務(wù)發(fā)展的需要,還是為了提升自己的競(jìng)爭(zhēng)力,關(guān)系數(shù)據(jù)庫(kù)廠商(Oracle、DB2、MySQL 等)在優(yōu)化和提升單個(gè)數(shù)據(jù)庫(kù)服務(wù)器的性能方面也做了非常多的技術(shù)優(yōu)化和改進(jìn)。但業(yè)務(wù)發(fā)展速度和數(shù)據(jù)增長(zhǎng)速度,遠(yuǎn)遠(yuǎn)超出數(shù)據(jù)庫(kù)廠商的優(yōu)化速度,尤其是互聯(lián)網(wǎng)業(yè)務(wù)興起之后,海量用戶(hù)加上海量數(shù)據(jù)的特點(diǎn),單個(gè)數(shù)據(jù)庫(kù)服務(wù)器已經(jīng)難以滿(mǎn)足業(yè)務(wù)需要,必須考慮數(shù)據(jù)庫(kù)集群的方式來(lái)提升性能。

高性能數(shù)據(jù)庫(kù)集群的第一種方式是“讀寫(xiě)分離”,其本質(zhì)是將訪(fǎng)問(wèn)壓力分散到集群中的多個(gè)節(jié)點(diǎn),但是沒(méi)有分散存儲(chǔ)壓力;第二種方式是“分庫(kù)分表”,既可以分散訪(fǎng)問(wèn)壓力,又可以分散存儲(chǔ)壓力。先來(lái)看看“讀寫(xiě)分離”。

讀寫(xiě)分離原理

讀寫(xiě)分離的基本原理是將數(shù)據(jù)庫(kù)讀寫(xiě)操作分散到不同的節(jié)點(diǎn)上,下面是其基本架構(gòu)圖。

高性能數(shù)據(jù)庫(kù)中的讀寫(xiě)分離原理是什么

讀寫(xiě)分離的基本實(shí)現(xiàn)是:

  • 數(shù)據(jù)庫(kù)服務(wù)器搭建主從集群,一主一從、一主多從都可以。

  • 數(shù)據(jù)庫(kù)主機(jī)負(fù)責(zé)讀寫(xiě)操作,從機(jī)只負(fù)責(zé)讀操作。

  • 數(shù)據(jù)庫(kù)主機(jī)通過(guò)復(fù)制將數(shù)據(jù)同步到從機(jī),每臺(tái)數(shù)據(jù)庫(kù)服務(wù)器都存儲(chǔ)了所有的業(yè)務(wù)數(shù)據(jù)。

  • 業(yè)務(wù)服務(wù)器將寫(xiě)操作發(fā)給數(shù)據(jù)庫(kù)主機(jī),將讀操作發(fā)給數(shù)據(jù)庫(kù)從機(jī)。

需要注意的是,這里用的是“主從集群”,而不是“主備集群”?!皬臋C(jī)”的“從”可以理解為“仆從”,仆從是要幫主人干活的,“從機(jī)”是需要提供讀數(shù)據(jù)的功能的;而“備機(jī)”一般被認(rèn)為僅僅提供備份功能,不提供訪(fǎng)問(wèn)功能。所以使用“主從”還是“主備”,是要看場(chǎng)景的,這兩個(gè)詞并不是完全等同的。

讀寫(xiě)分離的實(shí)現(xiàn)邏輯并不復(fù)雜,但有兩個(gè)細(xì)節(jié)點(diǎn)將引入設(shè)計(jì)復(fù)雜度:主從復(fù)制延遲分配機(jī)制。

復(fù)制延遲

以 MySQL 為例,主從復(fù)制延遲可能達(dá)到 1 秒,如果有大量數(shù)據(jù)同步,延遲 1 分鐘也是有可能的。主從復(fù)制延遲會(huì)帶來(lái)一個(gè)問(wèn)題:如果業(yè)務(wù)服務(wù)器將數(shù)據(jù)寫(xiě)入到數(shù)據(jù)庫(kù)主服務(wù)器后立刻(1 秒內(nèi))進(jìn)行讀取,此時(shí)讀操作訪(fǎng)問(wèn)的是從機(jī),主機(jī)還沒(méi)有將數(shù)據(jù)復(fù)制過(guò)來(lái),到從機(jī)讀取數(shù)據(jù)是讀不到最新數(shù)據(jù)的,業(yè)務(wù)上就可能出現(xiàn)問(wèn)題。例如,用戶(hù)剛注冊(cè)完后立刻登錄,業(yè)務(wù)服務(wù)器會(huì)提示他“你還沒(méi)有注冊(cè)”,而用戶(hù)明明剛才已經(jīng)注冊(cè)成功了。

解決主從復(fù)制延遲有幾種常見(jiàn)的方法:

1. 寫(xiě)操作后的讀操作指定發(fā)給數(shù)據(jù)庫(kù)主服務(wù)器

例如,注冊(cè)賬號(hào)完成后,登錄時(shí)讀取賬號(hào)的讀操作也發(fā)給數(shù)據(jù)庫(kù)主服務(wù)器。這種方式和業(yè)務(wù)強(qiáng)綁定,對(duì)業(yè)務(wù)的侵入和影響較大,如果哪個(gè)新來(lái)的程序員不知道這樣寫(xiě)代碼,就會(huì)導(dǎo)致一個(gè) bug。

2. 讀從機(jī)失敗后再讀一次主機(jī)

這就是通常所說(shuō)的“二次讀取”,二次讀取和業(yè)務(wù)無(wú)綁定,只需要對(duì)底層數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的 API 進(jìn)行封裝即可,實(shí)現(xiàn)代價(jià)較小,不足之處在于如果有很多二次讀取,將大大增加主機(jī)的讀操作壓力。例如,黑客暴力破解賬號(hào),會(huì)導(dǎo)致大量的二次讀取操作,主機(jī)可能頂不住讀操作的壓力從而崩潰。

3. 關(guān)鍵業(yè)務(wù)讀寫(xiě)操作全部指向主機(jī),非關(guān)鍵業(yè)務(wù)采用讀寫(xiě)分離

例如,對(duì)于一個(gè)用戶(hù)管理系統(tǒng)來(lái)說(shuō),注冊(cè) + 登錄的業(yè)務(wù)讀寫(xiě)操作全部訪(fǎng)問(wèn)主機(jī),用戶(hù)的介紹、愛(ài)好、等級(jí)等業(yè)務(wù),可以采用讀寫(xiě)分離,因?yàn)榧词褂脩?hù)改了自己的自我介紹,在查詢(xún)時(shí)卻看到了自我介紹還是舊的,業(yè)務(wù)影響與不能登錄相比就小很多,還可以忍受。

分配機(jī)制

將讀寫(xiě)操作區(qū)分開(kāi)來(lái),然后訪(fǎng)問(wèn)不同的數(shù)據(jù)庫(kù)服務(wù)器,一般有兩種方式:程序代碼封裝中間件封裝。

1. 程序代碼封裝

程序代碼封裝指在代碼中抽象一個(gè)數(shù)據(jù)訪(fǎng)問(wèn)層(所以有的文章也稱(chēng)這種方式為“中間層封裝”),實(shí)現(xiàn)讀寫(xiě)操作分離和數(shù)據(jù)庫(kù)服務(wù)器連接的管理。例如,基于 Hibernate 進(jìn)行簡(jiǎn)單封裝,就可以實(shí)現(xiàn)讀寫(xiě)分離,基本架構(gòu)是:

高性能數(shù)據(jù)庫(kù)中的讀寫(xiě)分離原理是什么

程序代碼封裝的方式具備幾個(gè)特點(diǎn):

  • 實(shí)現(xiàn)簡(jiǎn)單,而且可以根據(jù)業(yè)務(wù)做較多定制化的功能。

  • 每個(gè)編程語(yǔ)言都需要自己實(shí)現(xiàn)一次,無(wú)法通用,如果一個(gè)業(yè)務(wù)包含多個(gè)編程語(yǔ)言寫(xiě)的多個(gè)子系統(tǒng),則重復(fù)開(kāi)發(fā)的工作量比較大。

  • 故障情況下,如果主從發(fā)生切換,則可能需要所有系統(tǒng)都修改配置并重啟。

目前開(kāi)源的實(shí)現(xiàn)方案中,淘寶的 TDDL(Taobao Distributed Data Layer,外號(hào): 頭都大了)是比較有名的。它是一個(gè)通用數(shù)據(jù)訪(fǎng)問(wèn)層,所有功能封裝在 jar 包中提供給業(yè)務(wù)代碼調(diào)用。其基本原理是一個(gè)基于集中式配置的 jdbc datasource 實(shí)現(xiàn),具有主備、讀寫(xiě)分離、動(dòng)態(tài)數(shù)據(jù)庫(kù)配置等功能,基本架構(gòu)是:

高性能數(shù)據(jù)庫(kù)中的讀寫(xiě)分離原理是什么

(http://1.im.guokr.com/0Y5YjfjQ8eGOzeskpen2mlNIYA_b7DBLbGT0YHyUiLFZAgAAgwEAAFBO.png)

2. 中間件封裝

中間件封裝指的是獨(dú)立一套系統(tǒng)出來(lái),實(shí)現(xiàn)讀寫(xiě)操作分離和數(shù)據(jù)庫(kù)服務(wù)器連接的管理。中間件對(duì)業(yè)務(wù)服務(wù)器提供 SQL 兼容的協(xié)議,業(yè)務(wù)服務(wù)器無(wú)須自己進(jìn)行讀寫(xiě)分離。對(duì)于業(yè)務(wù)服務(wù)器來(lái)說(shuō),訪(fǎng)問(wèn)中間件和訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)沒(méi)有區(qū)別,事實(shí)上在業(yè)務(wù)服務(wù)器看來(lái),中間件就是一個(gè)數(shù)據(jù)庫(kù)服務(wù)器。其基本架構(gòu)是:

高性能數(shù)據(jù)庫(kù)中的讀寫(xiě)分離原理是什么

數(shù)據(jù)庫(kù)中間件的方式具備的特點(diǎn)是:

  • 能夠支持多種編程語(yǔ)言,因?yàn)閿?shù)據(jù)庫(kù)中間件對(duì)業(yè)務(wù)服務(wù)器提供的是標(biāo)準(zhǔn) SQL 接口。

  • 數(shù)據(jù)庫(kù)中間件要支持完整的 SQL 語(yǔ)法和數(shù)據(jù)庫(kù)服務(wù)器的協(xié)議(例如,MySQL 客戶(hù)端和服務(wù)器的連接協(xié)議),實(shí)現(xiàn)比較復(fù)雜,細(xì)節(jié)特別多,很容易出現(xiàn) bug,需要較長(zhǎng)的時(shí)間才能穩(wěn)定。

  • 數(shù)據(jù)庫(kù)中間件自己不執(zhí)行真正的讀寫(xiě)操作,但所有的數(shù)據(jù)庫(kù)操作請(qǐng)求都要經(jīng)過(guò)中間件,中間件的性能要求也很高。

  • 數(shù)據(jù)庫(kù)主從切換對(duì)業(yè)務(wù)服務(wù)器無(wú)感知,數(shù)據(jù)庫(kù)中間件可以探測(cè)數(shù)據(jù)庫(kù)服務(wù)器的主從狀態(tài)。例如,向某個(gè)測(cè)試表寫(xiě)入一條數(shù)據(jù),成功的就是主機(jī),失敗的就是從機(jī)。

由于數(shù)據(jù)庫(kù)中間件的復(fù)雜度要比程序代碼封裝高出一個(gè)數(shù)量級(jí),一般情況下建議采用程序語(yǔ)言封裝的方式,或者使用成熟的開(kāi)源數(shù)據(jù)庫(kù)中間件。如果是大公司,可以投入人力去實(shí)現(xiàn)數(shù)據(jù)庫(kù)中間件,因?yàn)檫@個(gè)系統(tǒng)一旦做好,接入的業(yè)務(wù)系統(tǒng)越多,節(jié)省的程序開(kāi)發(fā)投入就越多,價(jià)值也越大。

目前的開(kāi)源數(shù)據(jù)庫(kù)中間件方案中,MySQL 官方先是提供了 MySQL Proxy,但 MySQL Proxy 一直沒(méi)有正式 GA,現(xiàn)在 MySQL 官方推薦 MySQL Router。MySQL Router 的主要功能有讀寫(xiě)分離、故障自動(dòng)切換、負(fù)載均衡、連接池等,其基本架構(gòu)如下:

高性能數(shù)據(jù)庫(kù)中的讀寫(xiě)分離原理是什么

(https://dev.mysql.com/doc/mysql-router/2.1/en/images/mysql-router-positioning.png)

奇虎 360 公司也開(kāi)源了自己的數(shù)據(jù)庫(kù)中間件 Atlas,Atlas 是基于 MySQL Proxy 實(shí)現(xiàn)的,基本架構(gòu)如下:

高性能數(shù)據(jù)庫(kù)中的讀寫(xiě)分離原理是什么

以下是官方介紹,更多內(nèi)容你可以參考這里。

Atlas 是一個(gè)位于應(yīng)用程序與 MySQL 之間中間件。在后端 DB 看來(lái),Atlas 相當(dāng)于連接它的客戶(hù)端,在前端應(yīng)用看來(lái),Atlas 相當(dāng)于一個(gè) DB。Atlas 作為服務(wù)端與應(yīng)用程序通信,它實(shí)現(xiàn)了 MySQL 的客戶(hù)端和服務(wù)端協(xié)議,同時(shí)作為客戶(hù)端與 MySQL 通信。它對(duì)應(yīng)用程序屏蔽了 DB 的細(xì)節(jié),同時(shí)為了降低 MySQL 負(fù)擔(dān),它還維護(hù)了連接池。

以上就是高性能數(shù)據(jù)庫(kù)中的讀寫(xiě)分離是怎樣的,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI