溫馨提示×

溫馨提示×

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

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

MYSQL 8 日志系統(tǒng)到底比MYSQL 5.X好在哪里

發(fā)布時間:2021-10-25 09:28:28 來源:億速云 閱讀:188 作者:柒染 欄目:大數(shù)據(jù)

MYSQL  8 日志系統(tǒng)到底比MYSQL 5.X好在哪里,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

實(shí)際上MYSQL 5.x的日志系統(tǒng)存在兩個問題,導(dǎo)致一些性能問題,尤其在高并發(fā)寫入和對數(shù)據(jù)修改的情況下,其中的瓶頸的問題在于兩個瓶頸, 當(dāng)多線程訪問數(shù)據(jù)在落入到 log_buffer 的情況下,還是需要獲取鎖讓寫入有順序性, 同時在獲取redo已經(jīng)將數(shù)據(jù)頁面寫入后,也會在log_buffer中將寫入到日志中的順序進(jìn)行一個重排,這也是需要有順序性.

MYSQL  8 日志系統(tǒng)到底比MYSQL 5.X好在哪里

MYSQL  8 日志系統(tǒng)到底比MYSQL 5.X好在哪里

有順序性則就會有鎖的需求,否則無法保證系統(tǒng)的硬性需求,所以性能的問題在這個部分就會產(chǎn)生. 下面的源代碼中 log_sys->mutex, log_sys->flush_order_mutex, 對于日志的寫入產(chǎn)生了兩個鎖.

MYSQL  8 日志系統(tǒng)到底比MYSQL 5.X好在哪里

為什么MYSQL 8 要解決這個問題,主要的原因是多CPU 在MYSQL中的使用越來越被支持,而瓶頸在于并發(fā)和順序之間的矛盾.

MYSQL 8 解決關(guān)于鎖的問題,采用了另一種方式,因?yàn)橛涗洷仨氂许樞蛐?而不在增加鎖,則順序性如何完成, 這里MYSQL 8 采用的方式是預(yù)留空間的方式來對還未寫的日志預(yù)留空間,然后

MYSQL  8 日志系統(tǒng)到底比MYSQL 5.X好在哪里

通過預(yù)留的方式,將log_sys->mutex 數(shù)據(jù)鎖去掉 ,預(yù)留空間的方式可以進(jìn)行并發(fā)的寫入,保證了之前的部分的順序性,但又沒有相關(guān)的寫入的強(qiáng)制的順序性.

但這還沒有完全解決問題,log_sys->flush_order_mutex 鎖是解決最終刷入到日志中的鎖. 如何避免這個鎖.

MYSQL  8 日志系統(tǒng)到底比MYSQL 5.X好在哪里

MYSQL 8 提出了新的一個數(shù)據(jù)結(jié)構(gòu),來解決以下幾個問題

1 填補(bǔ)的數(shù)據(jù)并沒有完全填充滿, 而其中有空洞的問題

2 怎么能不使用鎖來將信息繼續(xù)有序的刷入到日志中

這里MYSQL 8 采用了log_writer線程來檢測日志中LOG BUFFER 有沒有空洞的問題,如果有寫入就會等待,通過并集的方式來確認(rèn)LOG BUFFER 寫入的日志是否有空洞,

MYSQL  8 日志系統(tǒng)到底比MYSQL 5.X好在哪里

上圖是官方給出的圖,通過并集很快的可以知道某個塊是否是空, 寫數(shù)據(jù)到log buffer也就從左到右的方式,并且看似是無序的但無序最終是有序的寫入,但不在使用原來的兩個鎖,進(jìn)行寫入數(shù)據(jù)的控制.

MYSQL  8 日志系統(tǒng)到底比MYSQL 5.X好在哪里

通過更細(xì)化的設(shè)計(jì),將原來的數(shù)據(jù)中的瓶頸化解, 這點(diǎn)的設(shè)計(jì),其實(shí)和MYSQL GROUP REPLICATION 的化解原有數(shù)據(jù)復(fù)制的瓶頸的想法有共同的地方.

MYSQL  8 日志系統(tǒng)到底比MYSQL 5.X好在哪里

其中把log buffer 中的對應(yīng)的dirty page 并不按照順序添加到flush list. 用戶寫完log buffer 可以將相應(yīng)的 log buffer 對應(yīng)的dirty page 添加到flush list列表中,InnoDB 用一個recent_closed 來記錄添加到flush list 的這一段log buffer 確認(rèn)是否連續(xù), 那么容易得出, flush list 上page lsn - recent_closed.size() 得到的lsn 用于做checkpoint同時InnoDB 后臺有Log_closer 線程定期檢查recent_closed 是否連續(xù), 如果連續(xù)就把 recent_closed buffer 向前推進(jìn), 那么checkpoint 的信息也可以往前推進(jìn)了.

MYSQL  8 日志系統(tǒng)到底比MYSQL 5.X好在哪里

這里借用某帖子關(guān)于MYSQL 8 改進(jìn)后整體的數(shù)據(jù)寫入的流程總結(jié)

MYSQL  8 日志系統(tǒng)到底比MYSQL 5.X好在哪里

在整體將MYSQL 8 相關(guān)的改進(jìn)過了一遍后, 發(fā)現(xiàn)以下幾個問題

1 有鎖的設(shè)計(jì)相對簡單,但有鎖的設(shè)計(jì)并發(fā)性差

2 無鎖的設(shè)計(jì)復(fù)雜,其中,中間段是優(yōu)化的方面,將原來有序的寫入,變?yōu)榱藷o序的寫入,加大了由于順序+鎖的方式造成的寫入的性能瓶頸

3 雖然是無鎖的設(shè)計(jì),但最終數(shù)據(jù)的寫入與原先設(shè)計(jì)的方式并沒有區(qū)別,都是有序的.

這里面覺得相關(guān)的數(shù)據(jù)處理方式,由整體,變?yōu)榉稚⑻幚?在重新歸位整體, 增加了多線程并發(fā)寫入的方式, 并且部分預(yù)處理了數(shù)據(jù)刷新到磁盤的方式提高了寫入的速度.

看完上述內(nèi)容,你們掌握MYSQL  8 日志系統(tǒng)到底比MYSQL 5.X好在哪里的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

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

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

AI