主頁 > 知識(shí)庫 > MySQL的Flush-List和臟頁的落盤機(jī)制

MySQL的Flush-List和臟頁的落盤機(jī)制

熱門標(biāo)簽:信陽穩(wěn)定外呼系統(tǒng)運(yùn)營(yíng)商 芒果電話機(jī)器人自動(dòng)化 廣東人工電話機(jī)器人 南通自動(dòng)外呼系統(tǒng)軟件 湖南人工外呼系統(tǒng)多少錢 百度地圖圖標(biāo)標(biāo)注中心 申請(qǐng)外呼電話線路 日照旅游地圖標(biāo)注 石家莊電商外呼系統(tǒng)

一、回顧

MySQL啟動(dòng)后Buffer Pool會(huì)初始化。Buffer Pool也會(huì)初始化好N多個(gè)空白的緩存頁,以及它們的描述數(shù)據(jù)會(huì)被組織成LRU鏈表以及FreeList 雙向鏈表。

這時(shí)你從磁盤中讀取一個(gè)數(shù)據(jù)頁,會(huì)先從Free List中找出一個(gè)空閑緩存頁的描述信息,然后將你讀出的數(shù)據(jù)頁中加載進(jìn)緩存頁中。同時(shí)將緩存頁的描述信息從Free List中剔除,此外該描述信息塊還會(huì)被維護(hù)進(jìn)LRU鏈表中。

數(shù)據(jù)頁被加載進(jìn)Buffer Pool后你就可以對(duì)其進(jìn)行變更操作了。

二、Flush List

為了加快響應(yīng)客戶端的速度,MySQL會(huì)在Buffer Pool中對(duì)數(shù)據(jù)進(jìn)行修改,可是一旦你對(duì)LRU鏈表中的緩存頁做了修改,那該頁中的數(shù)據(jù)和磁盤中的數(shù)據(jù)頁信息就不一致了!大家一般管這種數(shù)據(jù)頁叫做臟頁。

為了保證數(shù)據(jù)的最終一致性,MySQL是需要將臟頁刷新回磁盤的!

但是問題是:需要將哪些數(shù)據(jù)頁刷新回磁盤呢?

這就引出了Flush List~

Flush List 和 Free List很像,都是由Buffer Pool中數(shù)據(jù)描述信息組織而成的雙向鏈表。

一旦你對(duì)內(nèi)存中的緩沖頁作出了修改,那該緩沖頁對(duì)應(yīng)的描述信息塊就會(huì)添加進(jìn) Flush List。這樣當(dāng)Buffer Pool中的數(shù)據(jù)頁不夠用時(shí),我們就可以優(yōu)先將 Flush List中的臟數(shù)據(jù)頁刷新進(jìn)磁盤中。

如果你讀了前幾篇文章那你肯定知道了 LRUList、FreeList、FlushList、Buffer Pool、臟頁、臟數(shù)據(jù)。

下面乘勝追擊!一起看一下臟頁的落盤機(jī)制

三、什么是臟頁?什么是臟數(shù)據(jù)?

什么是臟頁?

我在介紹Flush List 的那篇文章有提及,臟頁就是LRU鏈表中被修改了的緩存頁。他們和磁盤中的數(shù)據(jù)頁不一致,臟頁是需要被刷新回磁盤的。

什么是臟數(shù)據(jù)?

這個(gè)問題其實(shí)引出了臟讀的概念。舉個(gè)例子:事物A中讀取到了事物B中未提交的數(shù)據(jù),我們管這些數(shù)據(jù)叫做臟數(shù)據(jù)。

四、臟頁刷回磁盤的時(shí)機(jī)

當(dāng)Buffer Pool不夠用時(shí),根據(jù)LRU機(jī)制,MySQL會(huì)將Old SubList部分的緩存頁移出LRU鏈表。如果被移除出去的緩存頁的描述信息在Flush List中,MySQL就得將其刷新回磁盤。

InnoDB存儲(chǔ)引擎將臟頁刷回磁盤的時(shí)機(jī)有蠻多的,你可以把它當(dāng)作拓展知識(shí)大概瀏覽一下。

1、當(dāng)MySQL數(shù)據(jù)庫關(guān)閉時(shí),會(huì)將所有的臟數(shù)據(jù)頁刷新回磁盤。這個(gè)功能由參數(shù):innodb_fast_shutdown=0控制,默認(rèn)讓InnoDB在關(guān)閉前將臟頁刷回磁盤,以及清理掉undo log。

2、有一個(gè)后臺(tái)線程Master Thread會(huì)按照每秒或者每十秒的速度,異步的將Buffer Pool中一定比例的頁面刷新回磁盤中。

3、在MySQL5.7中,Buffer Pool的刷新由page cleaner threads完成。

我們可以通過innodb_page_cleaners參數(shù)控制page cleaner threads線程的數(shù)量,但是當(dāng)你將這個(gè)數(shù)值調(diào)整的比Buffer Pool的數(shù)量還大時(shí),MySQL會(huì)自動(dòng)將 innodb_page_cleaners數(shù)量設(shè)置為innodb_buffer_pool_instances的數(shù)量。
Innodb1.1.x之前需要保證LRU列表中有至少100個(gè)空閑頁可以使用。低于這個(gè)閾值就會(huì)觸發(fā)臟頁的刷新。
從MySQL5.6,也就是innodb1.2.X開始,innodb_lru_scan_depth參數(shù)為每個(gè)緩沖池實(shí)例指定page cleaner threads 掃描Buffer Pool來查找要刷新的臟頁的下行距離。默認(rèn)為1024,該后臺(tái)線程每秒都會(huì)執(zhí)行一次。
4、當(dāng)臟數(shù)據(jù)頁太多時(shí),也會(huì)觸發(fā)將臟數(shù)據(jù)頁刷新回磁盤。該機(jī)制可由參數(shù)innodb_nax_dirty_pages_pct控制,比如將其設(shè)置為75,表示,當(dāng)Buffer Pool中的臟數(shù)據(jù)頁達(dá)到整體緩存的75%時(shí),觸發(fā)刷新的動(dòng)作?,F(xiàn)實(shí)情況是該參數(shù)默認(rèn)值為0。以此來禁用Buffer Pool早期的刷新行為。

5、當(dāng)redo log不可用時(shí),也會(huì)強(qiáng)制臟頁列表中的臟頁刷新回磁盤。這個(gè)機(jī)制同樣由一個(gè)后臺(tái)線程完成。

五、其他關(guān)于臟頁刷新的知識(shí)點(diǎn)

刷新臨接數(shù)據(jù)頁:意思是當(dāng)MySQL將某臟頁刷新回磁盤時(shí),是否也以相同的態(tài)度將該臟頁鄰接的臟頁一并刷新回磁盤。

可以通過參數(shù)innodb_flush_neighbors控制該過程。

  • 設(shè)置為0時(shí)表示,禁用刷新鄰接的功能。
  • 設(shè)置為1時(shí)表示,以相同的態(tài)度刷新其鄰接的臟頁。
  • 設(shè)置為2時(shí)表示,以相同的程度刷新臟頁。

那如何選擇將其設(shè)置為哪種狀態(tài)呢?

你可以根據(jù)MySQL實(shí)例所在機(jī)器的存儲(chǔ)類型來決定。如果為HDD存儲(chǔ)建議將其開啟,因?yàn)镠DD的磁盤刷新速率較低,開啟該參數(shù)后可以有效的減少IO操作。相反如果使用SSD存儲(chǔ),其本身就有高磁盤IO的特性,建議禁用該參數(shù)。

以上就是MySQL的Flush-List和臟頁的落盤機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于MySQL Flush-List和臟頁的落盤機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Mysql臟頁flush及收縮表空間原理解析
  • mysql臟頁是什么

標(biāo)簽:公主嶺 天津 阿里 呼和浩特 惠州 牡丹江 沈陽 合肥

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL的Flush-List和臟頁的落盤機(jī)制》,本文關(guān)鍵詞  MySQL,的,Flush-List,和,臟頁,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL的Flush-List和臟頁的落盤機(jī)制》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL的Flush-List和臟頁的落盤機(jī)制的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章