InnoDB 存储引擎体系架构
首先以一張圖簡(jiǎn)單展示 InnoDB 的存儲(chǔ)引擎的體系架構(gòu).從圖中可見(jiàn), InnoDB 存儲(chǔ)引擎有多個(gè)內(nèi)存塊,這些內(nèi)存塊組成了一個(gè)大的內(nèi)存池,主要負(fù)責(zé)如下工作:
-
維護(hù)所有進(jìn)程/線程需要訪問(wèn)的多個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)
-
緩存磁盤(pán)上的數(shù)據(jù), 方便快速讀取, 同時(shí)在對(duì)磁盤(pán)文件修改之前進(jìn)行緩存
-
重做日志(redo log)緩沖
后臺(tái)線程的主要作用是負(fù)責(zé)刷新內(nèi)存池中的數(shù)據(jù),保證緩沖池中的內(nèi)存緩存的是最新數(shù)據(jù);將已修改數(shù)據(jù)文件刷新到磁盤(pán)文件;保證數(shù)據(jù)庫(kù)發(fā)生異常時(shí) InnoDB 能恢復(fù)到正常運(yùn)行 的狀態(tài)
后臺(tái)線程
InnoDB 使用的是多線程模型, 其后臺(tái)有多個(gè)不同的線程負(fù)責(zé)處理不同的任務(wù)
1. Master Thread
這是最核心的一個(gè)線程,主要負(fù)責(zé)將緩沖池中的數(shù)據(jù)異步刷新到磁盤(pán),保證數(shù)據(jù)的一致性,包括贓頁(yè)的刷新、合并插入緩沖、UNDO 頁(yè)的回收等.
2. IO Thread
在 InnoDB 存儲(chǔ)引擎中大量使用了異步 IO 來(lái)處理寫(xiě) IO 請(qǐng)求, IO Thread 的工作主要是負(fù)責(zé)這些 IO 請(qǐng)求的回調(diào).
可以通過(guò)命令來(lái)觀察 InnoDB 中的 IO Thread:
mysql> SHOW ENGINE INNODB STATUS\G *************************** 1. row ***************************Type: InnoDBName: Status: ===================================== 2016-03-23 20:19:53 0x700000d51000 INNODB MONITOR OUTPUT .... ... -------- FILE I/O -------- I/O thread 0 state: waiting for i/o request (insert buffer thread) I/O thread 1 state: waiting for i/o request (log thread) I/O thread 2 state: waiting for i/o request (read thread) I/O thread 3 state: waiting for i/o request (read thread) I/O thread 4 state: waiting for i/o request (read thread) I/O thread 5 state: waiting for i/o request (read thread) I/O thread 6 state: waiting for i/o request (write thread) I/O thread 7 state: waiting for i/o request (write thread) I/O thread 8 state: waiting for i/o request (write thread) I/O thread 9 state: waiting for i/o request (write thread) ...... ---------------------------- END OF INNODB MONITOR OUTPUT可以看到, InnoDB 共有10個(gè) IO Thread, 分別是 4個(gè) write、4個(gè) read、1個(gè) insert buffer和1個(gè) log thread.
3. Perge Thread
事物被提交之后, undo log 可能不再需要,因此需要 Purge Thread 來(lái)回收已經(jīng)使用比分配的 undo頁(yè). InnoDB 支持多個(gè) Purge Thread, 這樣做可以加快 undo 頁(yè)的回收
InnoDB 引擎默認(rèn)設(shè)置為4個(gè) Purge Thread:
4. Page Cleaner Thread
Page Cleaner Thread 是新引入的,其作用是將之前版本中臟頁(yè)的刷新操作都放入單獨(dú)的線程中來(lái)完成,這樣減輕了 Master Thread 的工作及對(duì)于用戶查詢線程的阻塞
內(nèi)存
1. 緩沖池
InnoDB 存儲(chǔ)引擎是基于磁盤(pán)存儲(chǔ)的,其中的記錄按照頁(yè)的方式進(jìn)行管理,由于 CPU 速度和磁盤(pán)速度之間的鴻溝, InnoDB 引擎使用緩沖池技術(shù)來(lái)提高數(shù)據(jù)庫(kù)的整體性能.
緩沖池簡(jiǎn)單來(lái)說(shuō)就是一塊內(nèi)存區(qū)域.在數(shù)據(jù)庫(kù)中進(jìn)行讀取頁(yè)的操作,首先將從磁盤(pán)讀到的頁(yè)存放在緩沖池中,下一次讀取相同的頁(yè)時(shí),首先判斷該頁(yè)是不是在緩沖池中,若在,稱(chēng)該頁(yè)在緩沖池中被命中,直接讀取該頁(yè).否則,讀取磁盤(pán)上的頁(yè).
對(duì)于數(shù)據(jù)庫(kù)中頁(yè)的修改操作,首先修改在緩沖池中頁(yè),然后再以一定的頻率刷新到磁盤(pán),并不是每次頁(yè)發(fā)生改變就刷新回磁盤(pán).
緩沖池的大小直接影響數(shù)據(jù)庫(kù)的整體性能,對(duì)于 InnoDB 存儲(chǔ)引擎而言,緩沖池配置通過(guò)參數(shù)?innodb_buffer_pool_size?來(lái)設(shè)置. 下面顯示本機(jī)虛擬機(jī)上一臺(tái) MySQL 數(shù)據(jù)庫(kù)配置:
mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool_size'\G *************************** 1. row *************************** Variable_name: innodb_buffer_pool_size Value: 134217728 1 row in set (0.00 sec) 緩沖池中緩存的數(shù)據(jù)頁(yè)類(lèi)型有:索引頁(yè)、數(shù)據(jù)頁(yè)、 undo 頁(yè)、插入緩沖、自適應(yīng)哈希索引、 InnoDB 的鎖信息、數(shù)據(jù)字典信息等.索引頁(yè)和數(shù)據(jù)頁(yè)占緩沖池的很大一部分.
下圖顯示 InnoDB 存儲(chǔ)引擎總內(nèi)存的結(jié)構(gòu)情況.
2. 重做日志緩沖
InnoDB 存儲(chǔ)引擎先將重做日志信息放入這個(gè)緩沖區(qū),然后以一定頻率將其刷新到重做日志文件.重做日志文件一般不需要設(shè)置得很大,因?yàn)樵谙铝腥N情況下重做日志緩沖中的內(nèi)容會(huì)刷新到磁盤(pán)的重做日志文件中.
Master Thread 每一秒將重做日志緩沖刷新到重做日志文件
每個(gè)事物提交時(shí)會(huì)將重做日志緩沖刷新到重做日志文件
當(dāng)重做日志緩沖剩余空間小于1/2時(shí),重做日志緩沖刷新到重做日志文件
3. 額外的內(nèi)存池
在 InnoDB 存儲(chǔ)引擎中, 對(duì)一些數(shù)據(jù)結(jié)構(gòu)本身的內(nèi)存進(jìn)行分配時(shí),需要從額外的內(nèi)存池中進(jìn)行申請(qǐng).例如,分配了緩沖池,但是每個(gè)緩沖池中的幀緩沖還有對(duì)應(yīng)的緩沖控制對(duì)象,這些對(duì)象記錄以一些諸如 LRU, 鎖,等待等信息,而這個(gè)對(duì)象的內(nèi)存需要從額外的內(nèi)存池中申請(qǐng).
from:?https://segmentfault.com/a/1190000004673132
總結(jié)
以上是生活随笔為你收集整理的InnoDB 存储引擎体系架构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 分布式消息系统:Kafka
- 下一篇: 如何实现一个分布式 RPC 框架