35 | 生产经验:数据库服务器使用的RAID存储架构初步介绍

1、mysql与CPU、内存、磁盘、网卡等关系
image.png
2、RAID
1)很多数据库部署在机器上的时候,存储都是搭建的RAID存储架构
2)RAID是一个磁盘冗余阵列,大致理解为用来管理机器里多块磁盘的一种磁盘阵列技术
3)RAID作用:往磁盘里读写数据的时候,会告诉你应该在哪块磁盘上读写数据

image.png

36 | 生产经验:数据库服务器上的RAID存储架构的电池充放电原理

1、RAID的缓存
RAID缓存模式设置为write back,所有写入磁盘阵列的数据,会先缓存在RAID卡的缓存里,然后后续再写入到磁盘阵列里面去,缓冲机制,可以大幅提升数据库磁盘写的性能。
image.png

2、断电造成SDRAM缓存里数据丢失,怎么解决
RAID卡里一般都配置自己独立的锂电池或者电容,一旦断电,RAID基于锂电池供电运行,会把缓存里的数据写入到阵列中的磁盘上
image.png

3、锂电池存在性能衰减,所以一般配置定时充放电
锂电池充放电过程中,RAID缓存级别会从write back变成 write through

37 | 案例实战:RAID锂电池充放电导致的MySQL数据库性能抖动的优化

1、RAID 1 : 两块磁盘为镜像关系,在两块磁盘上都有,形成了数据冗余
2、RAID10 : RAID0 + RAID 1 组合;
假设有6块磁盘组成了一个RAID10阵列,其实是每2块磁盘组成一个RAID1互为镜像的架构,一共3组RAID1;
对于每一组RAID1写入数据时,用RAID0的思路,不同组的磁盘数据是不一样的,但是同一组的数据是冗余一致的
image.png


38 | 案例实战:数据库无法连接故障的定位,Too many connections

image.png

image.png

39 | 案例实战:如何解决经典的Too many connections故障?背后原理是什么

其实就是经典的Too many connections故障,他的核心就是linux的文件句柄限制,导致了MySQL的最大连接数被限制,那么今天来讲讲怎么解决这个问题。

其实核心就是一行命令:

ulimit -HSn 65535

然后就可以用如下命令检查最大文件句柄数是否被修改了

cat /etc/security/limits.conf
cat /etc/rc.local

40 | 重新回顾redo日志对于事务提交后,数据绝对不会丢失的意义

1、回顾
1)执行增删改SQL的时候,针对一个表的某些数据去执行
2)首先找到这个表对应的表空间
3)找到表空间对应的磁盘文件
4)从磁盘文件里把你要更新的那批数据所在的数据页从磁盘读取出来
5)放到buffer pool的缓存页里去
6)更新数据都是操作的buffer pool的缓存页的数据
7)更新缓存页时,会更新free、flush、lru链表
8)有专门的后台IO线程,不定时的根据flush链表、lru链表,把更新过的缓存页刷新后磁盘文件的数据页里去
image.png
2、redo log 机制
image.png
image.png
1)只要事务提交的时候,保证修改的以日志的形式写入到redolog日志
2)mysql重启后,把之前事务更新过的修改根据redo log在buffer pool里重做一遍,就可以恢复出来当时事务对缓存页做的修改,然后找时机再把缓存页刷入磁盘文件里去
3)redo log形式记录下来做的修改,性能远超于刷新缓存页,数据库并发能力更强

41 | 在Buffer Pool执行完增删改之后,写入日志文件的redo log长什么样

1)表空间号+数据页号+偏移值+修改几个字节的值 + 具体的值
2)redo log类型:根据修改了数据页里面几个字节的值区分
举例:
MOLOG_1BYTE : 修改了1个字节的值
MOLOG_4BYTE:修改了4个字节的值

42 | redo log是直接一条一条写入文件的吗?非也,揭秘redo log block

1、redo log block
1)mysql内的数据结构,大致理解为 存放多个单行日志
2)一个redo log block 是 512字节,分为3个部分:

  • 12字节的header块头
  • 496字节的body块体
  • 4字节的trailer块尾

image.png
3)header块头,分为4部分:

  • block no :4字节,块的唯一编号
  • data length :2字节,block里写入了多少字节数据
  • first record group:2字节,每个事物都会有多个redo log,是一个redolog group,即一组redo log

;那么在这个block里第一组的redo log 的偏移量,就是这2个字节存储的

  • checkpoint on :4字节

image.png

image.png

43 | 直接强行把redo log写入磁盘?非也,揭秘redo log buffer

1、redo log buffer
1)用来缓冲redo log写入的
2)在mysql启动的时候,跟操作系统申请的一块连续的内存空间,里面划分出了N多个空的redo log
image.png
2、原理
1)当写入一条redo log时,会从第一个redologblock开始写入
2)写满了一个redo log block,就会继续写入下一个redo log block,以此类推,直到所有redo log block都写满
3)把 redo log buffer里的block都写满了,会强制把redo log block刷入到磁盘中去
3、
image.png
image.png

44 | redo log buffer中的缓冲日志,到底什么时候可以写入磁盘

1、redo log block什么时机刷入到磁盘文件里去
1)写入redo log buffer的日志已经占据了redo log buffer总容量的一半,也就是超过了8MB的redo log在缓存里
2)一个事务提交的时候,必须把相关redo log 所在 redo log block都刷入到磁盘文件里去。只有这样,当事务提交之后,他修改的数据绝对不会丢失,因为redo log有重做日志,随时可以恢复事务的修改
3)后台线程定时刷新,有一个后台线程每隔1秒都会把redo log buffer里的block刷到磁盘里去
4)mysql关闭时,redo log block都会刷入到磁盘文件里去

情况1)不常见
情况2)常见,短暂事务提交时发生
情况3)没有别的情况触发,后台线程会不断刷新redolog到磁盘

45 | 如果事务执行到一半要回滚怎么办?再探undo log回滚日志原理

1、undo log 回滚日志
1)场景:一个事务里要执行一些增删改操作,必然是把对应的数据页从磁盘加载出来放 buffer pool缓存页,然后缓存页里执行执行一通增删改,同时记录redo log。万一事务执行了一半,回滚了?
2)undo log 回滚日志,比如做了一个insert操作,undo log里记录的必有一个主键和对应的delete操作
3)delete操作,必有insert
4)update操作,把更新前的值记录下来,重新update
5)select操作,没有在buffer pool进行操作,不需要记录 undo log
image.png

46 | 一起来看看INSRET语句的undo log回滚日志长什么样

1、insert语句 undo log类型是 TRX_UNDO_INSERT_REC
2、undo log 包含:
image.png
image.png

47 | 简单回顾一下, MySQL运行时多个事务同时执行是什么场景

image.png