伊人99re_av日韩成人_91高潮精品免费porn_色狠狠色婷婷丁香五月_免费看的av_91亚色网站

中培偉業(yè)IT資訊頻道
您現(xiàn)在的位置:首頁 > IT資訊 > 數(shù)據(jù)庫 > MYSQL中binlog有哪些常見的問題及解決方案?

MYSQL中binlog有哪些常見的問題及解決方案?

2020-07-23 11:58:56 | 來源:中培企業(yè)IT培訓(xùn)網(wǎng)

MYSQL數(shù)據(jù)庫是我們比較常見的數(shù)據(jù)庫,因此關(guān)于MYSQL數(shù)據(jù)庫在使用過程中的問題提問的人也非常多。那么MYSQL中binlog有哪些常見的問題?這些問題的解決方案是什么?下文是關(guān)于MYSQL數(shù)據(jù)庫中通過示例代碼詳細(xì)介紹了一些binlog優(yōu)化的思維問題,這些示例代碼對于每個人的學(xué)習(xí)或工作都具有一定的參考學(xué)習(xí)價值。

  首先說一下問題:

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

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

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

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

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

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

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

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

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

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

  其次:上述問題的解決方案

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

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

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

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

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ù)庫崩潰時的正確性。因為一旦binlog落盤了,它就可能被下游節(jié)點消費。這種事務(wù)必須在重啟后被commit而非rollback。而對于binlog未落盤的事務(wù),崩潰恢復(fù)時直接回滾。

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

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

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

1.innobase_xa_prepare()

2.write() and fsync() binary log

3.innobase_commit()

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

  問題3

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

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

prepare:該階段刷存儲引擎層(innodb)的redo log并將事務(wù)狀態(tài)設(shè)置為PREPARED(更新undo page上事務(wù)狀態(tài)),該階段不涉及binlog;

commit:寫binlog日志并刷盤,同時引擎層釋放鎖,釋放回滾段、設(shè)置事務(wù)狀態(tài)為COMMITTED等。

所謂的組提交技術(shù)其本質(zhì)上是將耗時的commit步驟進行更細(xì)粒度的拆分,具體來說:

  將步驟2的commit 分為三個階段:

Flush:寫binlog,但不sync;

Sync:調(diào)用 fsync 操作將文件落盤;

Commit:調(diào)用存儲引擎接口提交事務(wù)。

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

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

  如此設(shè)計有以下幾點好處:

1.使用Leader執(zhí)行而非每個線程各自執(zhí)行可有效減少write/fsync等調(diào)用次數(shù),提高效率;

2.可保證事務(wù)寫binlog和引擎層提交的順序一致;

3.多事務(wù)可并發(fā)執(zhí)行,而不再需要被prepare_commit_mutex鎖強制串行化。

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

通過上述介紹,我們知道MYSQL中binlog有哪些常見及這些問題的解決方法是什么了吧。想了解更多關(guān)于MYSQL數(shù)據(jù)庫的信息,請繼續(xù)關(guān)注中培偉業(yè)吧。

標(biāo)簽: MySQL 數(shù)據(jù)庫
主站蜘蛛池模板: 97久久精品人人澡人人爽缅北 | 在线观看的黄色 | 日本不卡高清在线 | 国产亚洲人成无码网在线观看 | 爆乳2把你榨干哦 | 久久久综合九色合综国产精品 | av中文版| 日本黄色小网站 | 麻豆视频在线看 | 日本成aⅴ人片日本伦 | 亚洲男女羞羞无遮挡久久丫 | 久久久久国产一级毛片高清片 | 69式精品视频免费观看 | 男同性恋在线观看 | 成年女人片免费看 | 免费视频wwwyyy在线观看 | 欧韩av| 国产帅男男GAY网站视频 | www国产一区| 欧美午夜一区二区三区免费大片 | 夜夜精品浪潮av一区二区三区 | 日韩精品一区二区三区中文不卡 | 国产第一页浮力影院草草影视 | 国产精品永久免费在线 | 亚洲AV成人无码网天堂 | 日日躁夜夜躁狠狠躁超碰97 | 亚洲人成人网站色www | 调教凌虐妻妾奴在线播放 | 136fldh福利免费视频观看 | 在线国产不卡 | 国产偷久久久精品专区 | 91精品无码中文字幕在线不卡 | 在线播放免费人成毛片 | 综合成人av | 久久久精品人妻久久影视 | 国产精品色区 | 日韩欧美大片在线观看 | 特级黄色网 | 久久久久久久久久久久网站 | 护士扒下内裤让我爽一夜 | 日韩人妻一区二区三区久久 |