亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MYSQL中binlog優(yōu)化的一些思考匯總

 更新時(shí)間:2020年06月11日 08:50:01   作者:丁凱  
這篇文章主要給大家介紹了關(guān)于MYSQL中binlog優(yōu)化的一些思考,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

問題

問題1:如何解決事務(wù)提交時(shí)flush redo log帶來的性能損失

WAL是實(shí)現(xiàn)事務(wù)持久性(D)的一個(gè)常用技術(shù),基本原理是將事務(wù)的修改記錄redo log。redo log順序追加寫入。事務(wù)提交時(shí),只需要保證事務(wù)的redo log落盤即可,通過redo log的順序?qū)懘骓撁娴碾S機(jī)寫提升數(shù)據(jù)庫系統(tǒng)的性能。但是,該方案必須要求每個(gè)事務(wù)提交時(shí)都將其生成的redo log進(jìn)行一次刷盤,效率不高。

問題2:binlog和引擎層事務(wù)提交的順序問題

對(duì)于單個(gè)事務(wù)而言,日志寫入順序是先redo log再binlog,只要維持該順序即可維持正確性。但對(duì)于一個(gè)高并發(fā)的數(shù)據(jù)庫系統(tǒng)而言,每時(shí)每刻可能都會(huì)存在眾多并發(fā)執(zhí)行的事務(wù)。我們還需要通過一定的手段來維護(hù)Server層binlog和引擎層事務(wù)提交的順序一致性。

維護(hù)這種順序一致性其實(shí)是為了保證備份工具Xtrabackup的正確性。

當(dāng) binlog 作為協(xié)調(diào)者,如果其中記錄的事務(wù)順序和存儲(chǔ)引擎層記錄的順序不一樣的話,備份工具(Innodb Hot Backup)拿到備份集的位點(diǎn)可能會(huì)存在空洞。因?yàn)閭浞莨ぞ邥?huì)拷貝 redo 日志,在 redo 的頭部會(huì)記錄最后一個(gè)提交的事務(wù)對(duì)應(yīng)的 binlog 位點(diǎn),備份集建立之后就會(huì)根據(jù)這個(gè)位點(diǎn)繼續(xù)從主庫 dump binlog。

假如有三個(gè)事務(wù) T1,T2,T3 已經(jīng) fsync 到 binlog 文件中,三個(gè)事務(wù)的在文件中的位點(diǎn)分別是 100,200,300,但是在引擎層的只有 T1 和 T3 完成了 commit 并記錄到 redo 中,最后一個(gè) commit 的事務(wù) T3 位點(diǎn)是 300。此時(shí)通過備份工具拿到的數(shù)據(jù)就是這樣的狀態(tài),備份集啟動(dòng)的時(shí)候會(huì)走崩潰恢復(fù)的流程,prepare 事務(wù)被回滾(備份集不會(huì)備份 binlog 文件,對(duì)應(yīng)上個(gè)小節(jié) xid 集合為空),自位點(diǎn) 300 繼續(xù)從主庫同步binlog并apply,導(dǎo)致 T2 在備庫就丟失了。

因此,我們必須設(shè)計(jì)一種機(jī)制來保證Server層的binlog寫入順序和存儲(chǔ)引擎層的事務(wù)提交順序保持一致。

問題3:同時(shí)寫redo和binlog帶來的性能下降

問題1中提到每次的事務(wù)提交會(huì)帶來性能問題,而這個(gè)問題在引入binlog后會(huì)變得更加嚴(yán)重。每個(gè)事務(wù)提交都會(huì)增加一次文件IO,且需要刷盤。如果系統(tǒng)并發(fā)比較高,那么這些IO將會(huì)成為拖慢整體性能的瓶頸。

解決方案

問題1:Redo log組提交技術(shù)

redo組提交技術(shù)思想很簡單:通過將多個(gè)事務(wù)redo log的刷盤動(dòng)作合并,減少刷盤次數(shù)。Innodb的日志系統(tǒng)里面,每條redo log都有一個(gè)LSN(Log Sequence Number)。事務(wù)將日志拷貝到redo log buffer時(shí),都會(huì)獲取當(dāng)前最大的LSN,且LSN單調(diào)遞增,因此可以保證不同事務(wù)的LSN不會(huì)重復(fù)。那么假設(shè)三個(gè)事務(wù)Trx1、Trx2、Trx3的日志的最大LSN分別為LSN1、LSN2、LSN3(LSN1 < LSN2 < LSN3),它們同時(shí)進(jìn)行提交,那么如果trx3率先執(zhí)行提交,它會(huì)要求刷盤至LSN3處,這樣就順便將Trx1、Trx2的redo log也刷了,Trx1和Trx2會(huì)判斷自己的LSN小于當(dāng)前已落盤的最大LSN,就無需再次刷盤。

問題2:內(nèi)部XA事務(wù)

開啟binlog情況下,引入內(nèi)部XA事務(wù)來協(xié)調(diào)上層和存儲(chǔ)引擎層,具體來說,在事務(wù)提交時(shí)引入兩個(gè)階段:

prepare:將redo log刷盤操作以確保data頁和undo頁的更新已經(jīng)刷新到磁盤,設(shè)置事務(wù)狀態(tài)為PREPARE狀態(tài);

commit:1). 寫binlog并刷盤,2).調(diào)用引擎層事務(wù)提交接口。將事務(wù)狀態(tài)設(shè)置為COMMIT。

如此兩階段提交主要是要保證數(shù)據(jù)庫崩潰時(shí)的正確性。因?yàn)橐坏゜inlog落盤了,它就可能被下游節(jié)點(diǎn)消費(fèi)。這種事務(wù)必須在重啟后被commit而非rollback。而對(duì)于binlog未落盤的事務(wù),崩潰恢復(fù)時(shí)直接回滾。

具體來說,故障恢復(fù)時(shí),掃描最后一個(gè)binlog文件(在flush階段,如果binlog大小超過閥值,進(jìn)行rotate binlog文件,會(huì)保證該文件記錄的最后一個(gè)事務(wù)一定被提交),提取其中的xid。重做檢查點(diǎn)以后的redo日志,讀取事務(wù)的undo段信息,搜集處于prepare階段的事務(wù)列表,將事務(wù)的xid與binlog中記錄的xid對(duì)比,若存在,則提交,否則就回滾。

MySQL5.6以前,為了保證數(shù)據(jù)庫binlog的寫入順序和InnoDB層的事務(wù)提交順序一致,MySQL數(shù)據(jù)庫內(nèi)部使用了prepare_commit_mutex鎖。

具體來說,在兩階段提交引擎層 prepare 的時(shí)候加鎖,在引擎層 commit 之后釋放鎖:

innobase_xa_prepare()
write() and fsync() binary log
innobase_commit()

這樣確實(shí)可以保證 binlog 和 innodb 的事務(wù)順序一致,但是這把鎖會(huì)導(dǎo)致所有的事務(wù)串行化執(zhí)行,且每次提交都會(huì)至少調(diào)用多次fsync,效率很低。這也是接下來需要探討并解決的一個(gè)問題。

問題4

參考redo log優(yōu)化技術(shù),引入組提交技術(shù)來優(yōu)化binlog的寫入性能。

考慮未優(yōu)化時(shí)事務(wù)提交流程:

prepare:該階段刷存儲(chǔ)引擎層(innodb)的redo log并將事務(wù)狀態(tài)設(shè)置為PREPARED(更新undo page上事務(wù)狀態(tài)),該階段不涉及binlog
commit:寫binlog日志并刷盤,同時(shí)引擎層釋放鎖,釋放回滾段、設(shè)置事務(wù)狀態(tài)為COMMITTED等
所謂的組提交技術(shù)其本質(zhì)上是將耗時(shí)的commit步驟進(jìn)行更細(xì)粒度的拆分,具體來說:

將步驟2的commit 分為三個(gè)階段:

Flush:寫binlog,但不sync
Sync: 調(diào)用 fsync 操作將文件落盤
Commit :調(diào)用存儲(chǔ)引擎接口提交事務(wù)

這里的fsync是耗時(shí)操作,因此我們希望能攢足夠多的寫入后才進(jìn)行一次fsync調(diào)用,在這里使用batch技術(shù)。其原理是:上述步驟中的每個(gè)階段都有一個(gè)對(duì)應(yīng)的任務(wù)鏈表,每個(gè)進(jìn)入該階段的線程會(huì)將自己的任務(wù)加入至該鏈表中,鏈表加鎖以保證正確性。第一個(gè)加入該鏈表的線程會(huì)成為Leader,后續(xù)的線程成為Follower。鏈表中的所有任務(wù)組成一個(gè)Batch,由Leader負(fù)責(zé)執(zhí)行,而Follower則等待其任務(wù)完成即可。

一旦某階段的鏈表任務(wù)執(zhí)行完成,這些任務(wù)會(huì)進(jìn)入下一個(gè)階段,同樣加入該階段的任務(wù)鏈表,重復(fù)上述執(zhí)行流。

如此設(shè)計(jì)有以下幾點(diǎn)好處:

  1. 使用Leader執(zhí)行而非每個(gè)線程各自執(zhí)行可有效減少write/fsync等調(diào)用次數(shù),提高效率
  2. 可保證事務(wù)寫binlog和引擎層提交的順序一致
  3. 多事務(wù)可并發(fā)執(zhí)行,而不再需要被prepare_commit_mutex鎖強(qiáng)制串行化

除此之外,MYSQL還對(duì)prepare階段刷redo log進(jìn)行了進(jìn)一步優(yōu)化。原來的設(shè)計(jì)是多事務(wù)可并發(fā)地刷redo log,同樣效率不夠高??梢詫repare階段的redo log刷盤放在commit階段的Flush階段執(zhí)行。但有個(gè)小問題需要說明的是:優(yōu)化前每個(gè)線程各自負(fù)責(zé)自己的redo log的落盤,且知道需要flush的redo log的lsn,如果改為在Flush階段由其Leader線程統(tǒng)一落盤,此時(shí)它不了解每個(gè)線程的redo log的lsn,因此它簡單粗暴地flush至log_sys的最大lsn,這就保證了要提交事務(wù)的redo log一定可以被落盤。

總結(jié)

到此這篇關(guān)于MYSQL中binlog優(yōu)化思考的文章就介紹到這了,更多相關(guān)MYSQL binlog優(yōu)化思考內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文教會(huì)你在MySQL中使用DateTime

    一文教會(huì)你在MySQL中使用DateTime

    mysql數(shù)據(jù)庫在我們的工作中經(jīng)常需要使用,經(jīng)常在表中需要使用時(shí)間,下面這篇文章主要給大家介紹了關(guān)于在MySQL中使用DateTime的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • MySQL的安裝與配置詳細(xì)教程

    MySQL的安裝與配置詳細(xì)教程

    MySQL是一種關(guān)系數(shù)據(jù)庫管理系統(tǒng),所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用的,本文主要以Mysql免安裝版為例,幫助大家解決安裝與配置mysql的步驟
    2021-06-06
  • Mac下mysql 5.7.17 安裝配置方法圖文教程

    Mac下mysql 5.7.17 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.17 源碼編譯安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 分享20個(gè)數(shù)據(jù)庫設(shè)計(jì)的最佳實(shí)踐

    分享20個(gè)數(shù)據(jù)庫設(shè)計(jì)的最佳實(shí)踐

    下面給出了20個(gè)數(shù)據(jù)庫設(shè)計(jì)最佳實(shí)踐,當(dāng)然,所謂最佳,還是要看它是否適合你的程序。一起來了解了解吧
    2014-06-06
  • 關(guān)于Mysql中json數(shù)據(jù)類型的查詢操作指南

    關(guān)于Mysql中json數(shù)據(jù)類型的查詢操作指南

    mysql在5.7版本之后就開始支持json數(shù)據(jù)類型,并且mysql8.0版本對(duì)json的處理已經(jīng)做的非常完善了,json數(shù)據(jù)類型的優(yōu)點(diǎn)缺點(diǎn)可自己查詢,本文主要介紹一些關(guān)于json數(shù)據(jù)類型的查詢操作
    2023-07-07
  • MySQL內(nèi)部臨時(shí)表的具體使用

    MySQL內(nèi)部臨時(shí)表的具體使用

    MySQL臨時(shí)表在很多場(chǎng)景中都會(huì)用到,比如用戶自己創(chuàng)建的臨時(shí)表用于保存臨時(shí)數(shù)據(jù),以及MySQL內(nèi)部在執(zhí)行復(fù)雜SQL時(shí),需要借助臨時(shí)表進(jìn)行分組、排序、去重等操作,本文就來詳細(xì)的介紹一下MySQL內(nèi)部臨時(shí)表
    2021-10-10
  • mysql日志文件General_log和Binlog開啟及詳解

    mysql日志文件General_log和Binlog開啟及詳解

    MySQL中的數(shù)據(jù)變化會(huì)體現(xiàn)在上面日志中,下面這篇文章主要給大家介紹了關(guān)于mysql日志文件General_log和Binlog開啟及詳解的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • MySQL中LIKE子句相關(guān)使用的學(xué)習(xí)教程

    MySQL中LIKE子句相關(guān)使用的學(xué)習(xí)教程

    這篇文章主要介紹了MySQL中LIKE子句相關(guān)使用的學(xué)習(xí)教程,LIKE子句一般用于WHERE語句中,需要的朋友可以參考下
    2015-12-12
  • 淺談SQLite時(shí)間函數(shù)的使用說明與總結(jié)分析

    淺談SQLite時(shí)間函數(shù)的使用說明與總結(jié)分析

    本篇文章是對(duì)SQLite時(shí)間函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • MySQL可重復(fù)讀級(jí)別能夠解決幻讀嗎

    MySQL可重復(fù)讀級(jí)別能夠解決幻讀嗎

    這篇文章主要給大家介紹了關(guān)于MySQL可重復(fù)讀級(jí)別能否解決幻讀的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論