溫馨提示×

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

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

高性能MySQL復(fù)制與緩存的用法

發(fā)布時(shí)間:2021-07-24 10:15:24 來(lái)源:億速云 閱讀:127 作者:chen 欄目:大數(shù)據(jù)

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

  1. 復(fù)制解決的基本問題

    讓一臺(tái)服務(wù)器的數(shù)據(jù)讓其他服務(wù)器保持同步,一臺(tái)主庫(kù)的數(shù)據(jù)可以同步到多臺(tái)備庫(kù)上,悲苦本身也可以被配置成另外一臺(tái)服務(wù)器的主庫(kù)。

    MySQL支持兩種復(fù)制方式:基于行的復(fù)制和基于語(yǔ)句的復(fù)制(邏輯復(fù)制)。這兩種都是在主庫(kù)上記錄二進(jìn)制日志,在備庫(kù)重放日志的方式來(lái)實(shí)現(xiàn)異步的數(shù)據(jù)復(fù)制, 這說(shuō)明同一時(shí)間主備庫(kù)存在不一致,并且無(wú)法保證主備之間的延遲。

  2. 常見的復(fù)制用途

    數(shù)據(jù)分布:MySQL通常復(fù)制不會(huì)造成很大的貸款壓力,但基于行的復(fù)制會(huì)比基于語(yǔ)句的復(fù)制帶寬壓力大, 可以隨意停止或開始復(fù)制,并在不同的地理位置來(lái)分布數(shù)據(jù)備份,例如不同的數(shù)據(jù)中心, 即使在不穩(wěn)定的網(wǎng)絡(luò)環(huán)境下,遠(yuǎn)程復(fù)制也可以工作,單位了低復(fù)制延遲,最好有一個(gè)穩(wěn)定的低延遲連接。

    負(fù)載均衡:將讀操作分布到多個(gè)服務(wù)器上,實(shí)現(xiàn)對(duì)讀密集型應(yīng)用的優(yōu)化

    備份:對(duì)備份來(lái)說(shuō),復(fù)制是一項(xiàng)很有意義的技術(shù)補(bǔ)充,但復(fù)制既不是備份也不能取代備份。

    高可用性和故障切換:幫助應(yīng)用程序避免MySQL單點(diǎn)失敗,一個(gè)包含復(fù)制的設(shè)計(jì)良好的故障切換系統(tǒng)能夠顯著地縮短宕機(jī)時(shí)間

    MySQL升級(jí)測(cè)試:使用一個(gè)更高版本的MySQL作為備庫(kù),保證在升級(jí)全部實(shí)例之前。查詢能夠在備庫(kù)按照預(yù)期執(zhí)行。

  3. 復(fù)制步驟

    主庫(kù)把數(shù)據(jù)更改記錄到二進(jìn)制日志中

    在提交失誤完成數(shù)據(jù)更新前,主庫(kù)將數(shù)據(jù)更新的時(shí)間記錄到二進(jìn)制日志中,按照事務(wù)提交的順序 而非每條語(yǔ)句的執(zhí)行順序來(lái)記錄二進(jìn)制日志,在記錄之后,主庫(kù)會(huì)告訴存儲(chǔ)引擎可以提交事物了。

    備庫(kù)將主庫(kù)上的日志復(fù)制到自己的中繼日志中

    備庫(kù)讀取中繼日志中的時(shí)間,將其重放到備庫(kù)數(shù)據(jù)之上

  4. 基于語(yǔ)句的復(fù)制

    主庫(kù)會(huì)記錄那些造成數(shù)據(jù)更改的查詢,當(dāng)悲苦讀取并重放這些事件時(shí),實(shí)際上這只是把主庫(kù)上執(zhí)行過(guò)的SQL在執(zhí)行一遍

    優(yōu)勢(shì):實(shí)現(xiàn)簡(jiǎn)單,二進(jìn)制日志里面的時(shí)間更加緊湊,不會(huì)使用太多帶寬

    劣勢(shì):更新必須串行,需要更多的鎖,不是所有的引擎都支持這種復(fù)制模式,存在一些無(wú)法被正確復(fù)制的SQL, 存儲(chǔ)過(guò)程和觸發(fā)器在使用基于語(yǔ)句的復(fù)制模式時(shí)也可能存在問題

    基于行的復(fù)制

    將實(shí)際數(shù)據(jù)記錄在二進(jìn)制日志中,可以正確復(fù)制每一行,一些語(yǔ)句可以被更有效的復(fù)制

  5. 一主多備結(jié)構(gòu)

    為不同的角色使用不同的備庫(kù)比如 添加不同的所以或使用不同的存儲(chǔ)引擎

    把一臺(tái)備庫(kù)當(dāng)做代用的主庫(kù),除了復(fù)制沒有其他數(shù)據(jù)傳輸

    將一臺(tái)備庫(kù)放到遠(yuǎn)程數(shù)據(jù)中心,用作災(zāi)難恢復(fù)

    延遲一個(gè)或多個(gè)備庫(kù),以備災(zāi)難恢復(fù)

    使用一個(gè)備庫(kù)作為備份、培訓(xùn)、開發(fā)、或者測(cè)試使用服務(wù)器

  6. 主-被動(dòng)模式服務(wù)器對(duì)稱設(shè)置

    確保兩臺(tái)服務(wù)器上有相同的數(shù)據(jù)

    啟用二進(jìn)制日志,選擇唯一的服務(wù)器ID,并創(chuàng)建復(fù)制賬號(hào)

    啟用備庫(kù)更新的日志記錄

    把被動(dòng)服務(wù)器配置成只讀,防止可能與主動(dòng)服務(wù)器上的更新產(chǎn)生沖突

    啟動(dòng)每個(gè)服務(wù)器的MySQL實(shí)例

    將每個(gè)主庫(kù)設(shè)置為對(duì)方的備庫(kù),使用新建的二進(jìn)制日志開始工作

    主動(dòng)服務(wù)器上更新時(shí):更新記錄到二進(jìn)制日志中,通過(guò)復(fù)制傳遞給被動(dòng)服務(wù)器的中繼日志中 被動(dòng)服務(wù)器執(zhí)行查詢并將其記錄到自己的二進(jìn)制日志中,由于事件的服務(wù)器ID與主動(dòng)服務(wù)器的 相同,因此主動(dòng)服務(wù)器忽略這些事件。

    這種類似于創(chuàng)建一個(gè)熱備份,但是可以使用這個(gè)備份來(lái)提高性能,比如執(zhí)行讀操作、備份、離線 維護(hù)升級(jí)等。但是不會(huì)獲得比單臺(tái)服務(wù)器更好的寫性能。

  7. 擁有備庫(kù)的主-主結(jié)構(gòu)

    為每一個(gè)主庫(kù)增加一個(gè)備庫(kù),增加了冗余,對(duì)于不同地理位置的復(fù)制拓?fù)?,能夠消除站點(diǎn)但電視系哦啊的問題 可以將讀查詢分配到備庫(kù)上

    主庫(kù)失效時(shí),用備庫(kù)來(lái)代替主庫(kù)是可行的,也可以把備庫(kù)只想一個(gè)不同的主庫(kù),但需要考慮增加的復(fù)雜度

  8. 環(huán)形復(fù)制拓?fù)?/strong>

    每一個(gè)服務(wù)器都是他之前服務(wù)器的備庫(kù),是他之后服務(wù)器的主庫(kù)

  9. 主庫(kù) 分發(fā)主庫(kù) 備庫(kù)

    分發(fā)主庫(kù)實(shí)際上也是一個(gè)備庫(kù),他的目的是提取和提供主庫(kù)的二進(jìn)制日志 多個(gè)備庫(kù)連接到分發(fā)主庫(kù),原來(lái)的主庫(kù)擺脫了負(fù)擔(dān),為了避免在分發(fā)主庫(kù)上做實(shí)際的查詢, 可以將他的表修改為blackhole存儲(chǔ)引擎

    可以使用分發(fā)主庫(kù)實(shí)現(xiàn)對(duì)二進(jìn)制日志時(shí)間執(zhí)行過(guò)濾和重寫規(guī)則,這個(gè)比在每個(gè)備庫(kù)上重復(fù)進(jìn)行日志記錄、 重寫和過(guò)濾效率高得多

    在分發(fā)主庫(kù)上使用blackhole表,可以支持更多的備庫(kù),雖然會(huì)在分發(fā)主庫(kù)上執(zhí)行查詢, 但其代價(jià)非常小,因?yàn)閎lackhole的表里面沒有任何數(shù)據(jù),blackhole表的缺點(diǎn)是存在bug, 在某些情況下會(huì)忘記將自增的id寫入二進(jìn)制日志

    使用分發(fā)主庫(kù)無(wú)法使用一個(gè)備庫(kù)來(lái)代替主庫(kù),因?yàn)榉职l(fā)主庫(kù)的存在,導(dǎo)致各個(gè)備庫(kù)與原始主庫(kù)的二進(jìn)制日志坐標(biāo)已經(jīng)不相同

  10. 日志服務(wù)器

    mysqlbinlog:用來(lái)記錄mysql內(nèi)部增刪改查等對(duì)數(shù)據(jù)庫(kù)有更新的內(nèi)容的記錄,對(duì)數(shù)據(jù)庫(kù)的查詢select或show等不會(huì)被binlog記錄,主要用于數(shù)據(jù)庫(kù)的主從復(fù)制以及增量恢復(fù)

    復(fù)制作為應(yīng)用二進(jìn)制日志的方法已經(jīng)被大量的用戶所測(cè)試,能夠證明是可行的的,mysqlbinlog可能無(wú)法正確生成二進(jìn)制日志中的數(shù)據(jù)更新

    復(fù)制的速度更快,因?yàn)闊o(wú)需將語(yǔ)句從日志導(dǎo)出來(lái)并傳送給mysql

    很容易觀察到復(fù)制過(guò)程

    方便處理錯(cuò)誤,例如可以跳過(guò)執(zhí)行失敗的語(yǔ)句

    方便過(guò)濾復(fù)制事件

    有時(shí)候mysqlbinlog會(huì)因?yàn)槿罩居涗浉袷礁臒o(wú)法讀取二進(jìn)制日志

  11. 緩存

    應(yīng)用層以下的緩存:MySQL服務(wù)器有自己的內(nèi)部緩存,也可以構(gòu)建自己的緩存和匯總表,緩存表比許多應(yīng)用層緩存更加持久,在服務(wù)器重啟之后他們還存在

    應(yīng)用層緩存:在同一臺(tái)機(jī)器的內(nèi)存中緩存數(shù)據(jù),或者通過(guò)網(wǎng)絡(luò)存在另一臺(tái)機(jī)器的內(nèi)存中, 應(yīng)用層緩存可以節(jié)省獲取數(shù)據(jù)以及基于這些數(shù)據(jù)進(jìn)行計(jì)算。但是緩存命中率低,并且可能使用更多的內(nèi)存。

    應(yīng)用緩存之本地緩存:小,只在進(jìn)程處理請(qǐng)求期間存在于進(jìn)程內(nèi)存中??梢员苊鈱?duì)某些資源的重復(fù)請(qǐng)求

    應(yīng)用緩存之本地共享內(nèi)存緩存:中等大小,快速,難以在多臺(tái)機(jī)器間同步,對(duì)小型的半靜態(tài)位數(shù)據(jù)比較合適 ,但是訪問非???,通常比任何遠(yuǎn)程緩存訪問都快

    應(yīng)用緩存之分布式內(nèi)存緩存:比本地共享內(nèi)存緩存大得多,增長(zhǎng)容易,緩存中創(chuàng)建的數(shù)據(jù)的每一個(gè)比特都只有一個(gè)副本,不會(huì)浪費(fèi)內(nèi)存,也不會(huì)因?yàn)榫彺鎰?chuàng)建的數(shù)據(jù)存在不同的地方而引入一致性問題。 非常適合存儲(chǔ)共享對(duì)象,但是演示高,最有效的方法是批量進(jìn)行多個(gè)獲取操作,還要考慮怎么增加更多的節(jié)點(diǎn), 以及某個(gè)節(jié)點(diǎn)崩潰了怎么處理,應(yīng)用程序必須決定在節(jié)點(diǎn)間怎么分布或充分不緩存對(duì)象

    應(yīng)用緩存之磁盤緩存:最好是持久性對(duì)象,很難全部存進(jìn)內(nèi)存的對(duì)象或者金泰內(nèi)容

  12. 緩存控制策略

    問題:重復(fù)數(shù)據(jù),有多而地方需要更新數(shù)據(jù),所以要避免督導(dǎo)臟數(shù)據(jù)

    TTL(time to live 存活時(shí)間):緩存對(duì)象存儲(chǔ)是設(shè)置一個(gè)過(guò)期時(shí)間,可以通過(guò)清理進(jìn)程在未達(dá)到過(guò)期時(shí)間后刪除對(duì)象, 或者留到下次訪問時(shí)再清理,對(duì)于數(shù)據(jù)很少變更或沒有新數(shù)據(jù)的情況,這是最好的失效策略。

    顯示失效:如果不能接受臟數(shù)據(jù),那么在更新原始數(shù)據(jù)時(shí)同時(shí)使緩存失效

    寫——失效:標(biāo)記緩存數(shù)據(jù)已經(jīng)過(guò)期(是否清理緩存數(shù)據(jù)是可選的)。

    寫——更新:更新數(shù)據(jù)時(shí)替換掉緩存項(xiàng)

    讀時(shí)失效:采用對(duì)象版本控制

    緩存對(duì)象分層:分層緩存對(duì)象對(duì)檢索、失效和內(nèi)存利用都有幫助,相對(duì)于只緩存對(duì)象,也可以緩存對(duì)象的ID、對(duì)象的ID組等需要一起檢索的數(shù)據(jù)

    預(yù)生成內(nèi)容:在后臺(tái)預(yù)先請(qǐng)求一些頁(yè)面,并將結(jié)果存為靜態(tài)頁(yè)面。

    作為基礎(chǔ)組件的緩存

    使用handlerSocket 和memcached:handlerSocketto 剛剛一個(gè)簡(jiǎn)單的協(xié)議訪問innodb handler 繞過(guò)上層的服務(wù)器層,通過(guò)網(wǎng)絡(luò)直接連接innodb引擎,通過(guò)memcached協(xié)議訪問innoDB

到此,關(guān)于“高性能MySQL復(fù)制與緩存的用法”的學(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問一下細(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