Innodb体系架构
Innodb有多个内存块,这些内存块组成了一个大的内存池
Innodb是多线程模型,因此后台有多个不同的后台线程,负责处理不同的任务
后台线程:
1.Master thread
负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新,合并插入缓冲,undo页的回收。
2.I/O thread
Innodb中使用了大量的异步IO处理写请求--》IO thread主要负责这些IO的回调(callback ),
主要包括四类thread: log,read,write ,insert buffer
mysql> show engine innodb status;
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
3.purge thread
事务被提交后,所使用的undolog可能不再被需要,因此需要 purge thread 来回收已经使用并分配的undo页
mysql> show variables like 'innodb_purge_threads'\G;
*************************** 1. row ***************************
Variable_name: innodb_purge_threads
Value: 4
1 row in set (0.00 sec)
可以看到有四个 purge thread
Innodb关键特性
缓冲池:一块内存中的区域,用于弥补cpu与磁盘之间速度之间的鸿沟。
数据库在进行读取页的操作时,首先将磁盘读到的页放到缓冲池,下一次再读相同的页时,首先判断该页是否在缓冲池中,如果命中,直接读取该页,否则,读取磁盘上的页。
数据库对页的修改-》首先修改缓冲池中的页,然后以一定的频率刷新到磁盘上。
查看innodb缓冲池大小:
大小为8MB;
缓存池中缓存的数据页有:
索引页,数据页,undo页,插入缓冲和,自适应哈希,innodb存储的锁信息等。
允许有多块缓冲池,默认个数为1
mysql> show variables like 'innodb_buffer_pool_instances'\G;
*************************** 1. row ***************************
Variable_name: innodb_buffer_pool_instances
Value: 1
1 row in set (0.00 sec)
缓冲池管理方式:
Free List : 空闲列表。数据库刚启动时,LRU列表是空的,需要从Free List 中分配页。
LRU List : 数据库的缓冲池是通过LRU(Latest Recent Used,最近最少使用)算法进行管理的。最频繁使用的页放在LRU列表前端,最少使用的页放在LRU列表尾端。
Flush List : 脏页列表。LRU列表中的页被修改后成为脏页,数据库通过checkpoint机制将脏页刷新会磁盘中。
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 140621
Buffer pool size 8191
Free buffers 7857
Database pages 334
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 300, created 34, written 38
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 334, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
Buffer pool size :共有8191页
Free buffers :free 列表中页的数量
Database pages :LRU列表中页的数量
Innodb特性:异步IO (AIO)
同步IO:每进行一次IO操作,需要等待此次操作结束才能继续接下来的操作。
异步IO:用户可以在发出一个IO请求后立即在发出另外一个IO请求,当全部IIO请求发送完毕后,等待所有IO操作完成。
Innodb1.1x开始提供内核级别AIO支持,称为Native AIO:
刷新邻接页
Innodb还提供Flush neighbor page特性:当刷新一个脏页时,Innodb会检查该页所在区的所有页,如果是脏页,那么一起刷新。
通过异步IO(AOI)可以将多个IO写入操作合并为一个IO。
CheckPoint技术
在LRU列表的页被修改以后,称为脏页,即缓冲池的页和磁盘的页的数据产生了不一致,这时候数据库会通过CHECKPOINT机制将脏页刷新回磁盘。
如果从缓冲池将脏页刷新到磁盘时发生了宕机,那么数据就不能恢复了。为了避免数据丢失,数据库系统普遍采用了Write after Log策略,即,当事务提交时,先写重做日志,再修改页