数据库体系架构
回顾复习一下体系架构:
首先MySQL数据库的架构如下:
InnoDB体系架构
1.架构图
可以看到innodb的整个体系架构就是由多个
内存块组成的缓冲池及多个后台线程构成。
缓冲池缓存磁盘数据(解决cpu速度和磁盘速度的严重不匹配问题),
后台进程保证缓存池和磁盘数据的一致性(读取、刷新),并保证数据异常宕机时能恢复到正常状态
2.四个线程
1.master thread:
将缓冲池中的数据异步刷新到磁盘
最高级别线程
分为两种操作
每1s的操作:
日志缓冲刷新到磁盘,尽管事务没提交(总是)
insert buffer (可能)
最多刷新100个脏页到磁盘(可能) 通过innodb_max_dirty_pages_pct这个参数控制,超过90就进行操作
没活动,切换到background loop
每10s操作:
刷新100或者10个脏页到磁盘(总是)
合并至多5个插入缓冲(总是)
将日志缓冲刷新到磁盘(总是)
删除无用的UNDO页(总是)
background loop操作:
删除无用的undo页(总是)
合并20个插入缓冲(总是)
后续美1s和每10s的脏页刷新拿到一个单独的page clean thread,减轻master thread压力 提高并发性
2.io thread:
异步io处理,可通过参数调整读写的io线程数量
3.purge thread:
回收事务被提交后的undo页
undo保存的就是修改前的数据
4.page clean thread:
脏页的刷新操作单独拿出来
3.缓冲池
缓冲池是一块内存区域,通过内存的速度来弥补cpu和磁盘的交互
可以设置多个缓冲池实例 每个页根据哈希值平均分不到不同的实例中,
提高并发,innodb_buffer_pool_instances控制
一般DBA会将innodb_buffer_pool_size调大一点,来缓存更多的数据和索引。
缓冲池是由LRU算法来进行管理的
LRU链表,分为两个子链表,new和old,old占37%,
超过block_time参数就会将old移至new,new是活跃的数据页
midpoint机制,
上图对于的
Buffer pool size 总共多少页
Free buffers free链表中页的数量
Database pages LRU 页数量
Old database pages LRU old页数量 = LRU + unzip_LRU
Modified db pages 脏页的数量
--查看LRU每个页的具体信息
select table_name,space,page_number,page_type from innodb_buffer_page_lru where space = 1 limit 10;
脏页:缓冲池中的页和磁盘中的页数据不一致,即被LRU链表修改过的页
同时存在于LRU和FLUSH中
flush 链表:存储脏页,用于回刷到磁盘
redo log buffer 将重做日志信息放在这里 然后以特定的条件和频率进行刷回道重做日志文件
4.checkpoint机制
事务数据库系统目前凑采用wal 策略,
提交事务的时候,先写重做日志,再修改页
脏页的刷新由checckpoint机制处理
checkpoint好处:
缩短恢复数据库的时间,只根据每次checkpoint之后去重做恢复
缓冲池不够用的时候 将脏页刷新回磁盘
重做日志不可用时刷新磁盘
可以通过LSN 版本号来确定位置
Checkpoint分类
sharp checkpoint 数据库关闭时
innodb_fast_shutdown =1 控制
fuzzy CheckPoint
分为四种
master 线程的每10s操作
LRU的checkpoint 为了保证LRU有可用的列,会从尾部删除,
如果尾部刚好有脏页的时候刷回,默认为可用100页
Async/Sync Flush 重做日志不可用的时候,将fulsh链表的刷新
dirty page too much脏页太多的情况下,目的是为了保证缓冲池中有足够的可用页,
innodb_max_dirty_pages_pct参数控制 当超过多少就刷回一部分
5.innodb关键特性
1.insert buffer
非聚集索引插入的离散性
即合并插入
2.doublewrite两次写
数据页的可靠性
当对缓冲池中脏页刷新时,先通过函数将脏页复制到内存中的doublewrite buffer 大小为2MB中,然后调用同步函数,同步磁盘,因为磁盘的doublewrite页是连续的128个页 2个区 所以写的很快,写完成之后,再将doublewrite buffer写入各个表空间中,此时写入是离散的
--可以查看写入的页数和写入的次数,为64:1 大于这个值说明压力有点大
show global status like 'innodb_dblwr%';
3.自适应hash索引
对某个页的连续访问模式是一致的
Hash只适用于等值查询
4.异步IO AIO
将多个IO合并成一个IO,像扫描索引的时候
5.刷新邻居页
刷脏页的时候 会讲该页所在区的所有脏页刷回磁盘
这个特性主要针对于HDD磁盘,对于SSD因为IOPS很高,所以不需要开启刷新
邻结数据页。