溫馨提示×

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

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

MySQL讀寫分離怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2021-12-04 13:36:19 來(lái)源:億速云 閱讀:226 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹“MySQL讀寫分離怎么實(shí)現(xiàn)”,在日常操作中,相信很多人在MySQL讀寫分離怎么實(shí)現(xiàn)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”MySQL讀寫分離怎么實(shí)現(xiàn)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

MySQL讀寫分離怎么實(shí)現(xiàn)

隨著業(yè)務(wù)量的發(fā)展和數(shù)據(jù)量的增長(zhǎng),單機(jī)版本的數(shù)據(jù)庫(kù)很難滿足業(yè)務(wù)需要,而MySQL最常見(jiàn)的性能擴(kuò)展方法是“讀寫分離”,其本質(zhì)是將訪問(wèn)壓力分散到多個(gè)MySQL節(jié)點(diǎn)上,但存儲(chǔ)壓力并沒(méi)有分散,“分庫(kù)分表”可以分散訪問(wèn)和存儲(chǔ)壓力,但是實(shí)現(xiàn)難度維護(hù)成本都會(huì)大幅增加。

MySQL讀寫分離怎么實(shí)現(xiàn)

▲讀寫分離架構(gòu)圖▲

  • 需要主從的集群架構(gòu),一主一從或者一主多從;

  • 主庫(kù)響應(yīng)寫請(qǐng)求,從庫(kù)響應(yīng)讀請(qǐng)求;

  • 主庫(kù)通過(guò)復(fù)制將數(shù)據(jù)同步到從庫(kù),每個(gè)節(jié)點(diǎn)都保存一份業(yè)務(wù)數(shù)據(jù)。

MySQL讀寫分離怎么實(shí)現(xiàn)

業(yè)界實(shí)現(xiàn)MySQL的“讀寫分離”有兩種常見(jiàn)方法,客戶端實(shí)現(xiàn)和代理實(shí)現(xiàn),兩種方法各有利弊,需要結(jié)合各自業(yè)務(wù)特點(diǎn)、系統(tǒng)架構(gòu)、運(yùn)維能力來(lái)選擇實(shí)現(xiàn)。因?yàn)橐氪頃?huì)使系統(tǒng)架構(gòu)更加復(fù)雜,同時(shí)代理自身要考慮性能、高可用、穩(wěn)定性等因素,中小公司一般使用客戶端方法實(shí)現(xiàn)讀寫分離。而大公司有資源去投入數(shù)據(jù)庫(kù)代理的開(kāi)發(fā)和維護(hù),當(dāng)接入的業(yè)務(wù)越多,帶來(lái)的價(jià)值就越明顯。

首先說(shuō)下客戶端實(shí)現(xiàn)方法,例如java語(yǔ)言可以基于MyBatis和Hibernate簡(jiǎn)單封裝后,即可實(shí)現(xiàn)讀寫分離,架構(gòu)圖如下:

MySQL讀寫分離怎么實(shí)現(xiàn)

代理實(shí)現(xiàn)方法,需要引入數(shù)據(jù)庫(kù)代理,實(shí)現(xiàn)讀寫分離和數(shù)據(jù)庫(kù)管理功能,代理兼容SQL協(xié)議,對(duì)于客戶端來(lái)說(shuō)代理就是數(shù)據(jù)庫(kù),架構(gòu)圖如下:

MySQL讀寫分離怎么實(shí)現(xiàn)

對(duì)比兩種架構(gòu)的優(yōu)缺點(diǎn):

MySQL讀寫分離怎么實(shí)現(xiàn)

無(wú)論哪種架構(gòu),實(shí)現(xiàn)邏輯并不復(fù)雜,但是有一個(gè)細(xì)節(jié)需要特別注意:MySQL主從復(fù)制延遲。

MySQL的復(fù)制是異步的,盡管針對(duì)不同延遲的原因有響應(yīng)的優(yōu)化方案,但是延遲是客觀存在的,是不可能百分百避免的。當(dāng)只讀出現(xiàn)較大延遲的時(shí)候,就會(huì)出現(xiàn)數(shù)據(jù)不一致,讀到的數(shù)據(jù)是主庫(kù)提交前的,稱之為“過(guò)期讀”,這時(shí)業(yè)務(wù)上可能就會(huì)出現(xiàn)問(wèn)題。常見(jiàn)的解決方法有:

  • 核心業(yè)務(wù)讀寫都指向主庫(kù),非核心業(yè)務(wù)采用讀寫分離。比如金融類業(yè)務(wù),為了保證數(shù)據(jù)的一致性,犧牲擴(kuò)展性。比如論壇業(yè)務(wù),發(fā)帖后會(huì)晚一些查詢到,它帶來(lái)的影響會(huì)小很多,是可以忍受的;

  • 二次讀取,讀失敗后再查一遍,它和業(yè)務(wù)邏輯無(wú)關(guān),只需要對(duì)數(shù)據(jù)庫(kù)訪問(wèn)層重新封裝即可,實(shí)現(xiàn)代價(jià)小。不過(guò)某些場(chǎng)景下,它擴(kuò)大的讀請(qǐng)求的數(shù)量,增加了數(shù)據(jù)庫(kù)的壓力,比如DDoS攻擊,很容易把數(shù)據(jù)庫(kù)壓垮;

  • 判斷延遲再讀取,讀取從庫(kù)前判斷是否有延遲,沒(méi)有延遲再?gòu)膸?kù)查詢,如果有延遲到主庫(kù)查詢。MySQL自身提供判斷延遲的監(jiān)控方法,如果開(kāi)啟了GTID,直接比較從庫(kù)的Retrieved_Gtid_Set和Executed_Gtid_Set值,它們相同則表示從庫(kù)沒(méi)有延遲;沒(méi)有開(kāi)啟GTID的情況下,需要比較兩組值, Master_Log_File和Relay_Master_Log_File、Read_Master_Log_Pos和Exec_Master_Log_Pos這兩組值完全相同,則表示從庫(kù)沒(méi)有延遲。

MySQL讀寫分離怎么實(shí)現(xiàn)

京東智聯(lián)云RDS-MySQL支持“讀寫分離代理”功能,創(chuàng)建只讀實(shí)例后,開(kāi)啟讀寫分離代理,就可以在程序中配置讀寫代理的地址,由讀寫代理實(shí)現(xiàn)讀請(qǐng)求被自動(dòng)轉(zhuǎn)發(fā)到只讀實(shí)例,寫請(qǐng)求被自動(dòng)轉(zhuǎn)發(fā)到主實(shí)例。目前MySQL5.6-8.0,Percona和Mariadb都支持開(kāi)啟只讀代理。詳細(xì)介紹信息見(jiàn):https://docs.jdcloud.com/cn/rds/create-readwriteproxy

下面從該功能的數(shù)據(jù)面和控制面來(lái)介紹下基本原理和最佳實(shí)踐。

MySQL讀寫分離怎么實(shí)現(xiàn)

用戶在創(chuàng)建讀寫分離代理的時(shí)候會(huì)配置只讀庫(kù)延遲、健康檢查、負(fù)載均衡策略等參數(shù),根據(jù)用戶業(yè)務(wù)特點(diǎn),實(shí)現(xiàn)讀寫分離功能。

京東智聯(lián)云“讀寫分離代理”創(chuàng)建界面如下:

MySQL讀寫分離怎么實(shí)現(xiàn)

  1. 只讀實(shí)例延遲閾值:只讀實(shí)例與主實(shí)例的延遲超過(guò)閾值后,只讀實(shí)例將從讀寫代理后端被移除。

  2. 負(fù)載均衡策略:讀寫代理分發(fā)讀寫請(qǐng)求的負(fù)載均衡策略,支持最少活躍連接數(shù)、最少連接數(shù)、最小同步時(shí)延、平均響應(yīng)時(shí)延。

  3. 連接超時(shí)時(shí)間:只讀實(shí)例健康檢查的方法。超時(shí)后只讀實(shí)例將從讀寫代理后端被移除。

  4. 重復(fù)次數(shù):只讀實(shí)例健康檢查的方法。重試次數(shù)超過(guò)指定次數(shù)后,只讀實(shí)例健康檢查失敗,將從讀寫代理后端被移除。

  5. 檢查時(shí)間間隔:只讀實(shí)例健康檢查的方法,根據(jù)時(shí)間間隔對(duì)讀寫代理后端的只讀實(shí)例進(jìn)行健康檢查。

最佳實(shí)踐:只讀實(shí)例延遲閾值根據(jù)業(yè)務(wù)特點(diǎn)配置,默認(rèn)時(shí)間是100s,強(qiáng)烈建議該值大于檢查時(shí)間間隔時(shí)間。

通過(guò)RDS控制臺(tái),可以管理“讀寫分離代理”的整個(gè)生命周期,包括創(chuàng)建、修改配置、刪除和開(kāi)啟公網(wǎng)訪問(wèn)。除此之外,“讀寫分離代理”還可以感知轉(zhuǎn)發(fā)MySQL實(shí)例的高可用切換、修改配置流程、只讀實(shí)例的創(chuàng)建和刪除。

  1. 高可用切換,當(dāng)轉(zhuǎn)發(fā)的MySQL發(fā)生主從高可用切換的時(shí)候,“讀寫分離代理”會(huì)自動(dòng)調(diào)整寫請(qǐng)求轉(zhuǎn)發(fā)到新的主庫(kù)上;

  2. 修改配置,當(dāng)轉(zhuǎn)發(fā)的MySQL主從實(shí)例或者只讀實(shí)例觸發(fā)擴(kuò)容、縮容的業(yè)務(wù)流程時(shí),“讀寫分離代理”會(huì)自動(dòng)調(diào)整將讀寫請(qǐng)求轉(zhuǎn)發(fā)到新的實(shí)例;

  3. 只讀實(shí)例的創(chuàng)建和刪除,“讀寫分離代理”會(huì)在用戶添加新只讀實(shí)例后,根據(jù)負(fù)載均衡算法,自動(dòng)轉(zhuǎn)發(fā)請(qǐng)求到新只讀實(shí)例;當(dāng)用戶刪除只讀實(shí)例后,“讀寫分離代理”會(huì)自動(dòng)停止轉(zhuǎn)發(fā)請(qǐng)求到已刪除的只讀實(shí)例。

到此,關(guān)于“MySQL讀寫分離怎么實(shí)現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向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