MySQL Doublewrite Buffer及业务评估
1. 关于Doublewrite Buffe的总结
Doublewrite Buffer:Doublewrite Buffer出现的初衷是防止buffer pool中的脏页刷新到磁盘中,出现部分写的问题,innodb页大小一般为16k,而Linux操作系统的block size一般为4k。这样在刷新的过程中,如果OS发生crash或者停电,会导致16k的页块只有部分block刷新到磁盘中,而其它的没有,这样会导致数据不一致。Doublewrite Buffer放到系统表空间中,有100个页的大小,当innodb将buffer pool中的页刷新到磁盘中时,会首先copy到Doublewrite Buffer中,再刷新到磁盘中。如果在刷新磁盘的过程中出现问题,innodb会利用doublewrite buffer中存储的页来恢复数据。如果在刷新doublewrite buffer的过程中出现问题,则会利用物理磁盘上的原始页和redo log来恢复数据。
Doublewrite Buffer的启用会对MySQL的整体性能降低5-10%,可通过innodb_doublewrite参数进行设置,默认是开启的。
Percona有个单独的参数来设置Doublewrite Buffer的存放位置,innodb_doublewrite_file。
2. 根据以下内容,演算推导出机器相关的指标:
响应时间 查询和操作请求ms级返回。
数据总量 1年内数据量大约500G数据量。
每秒请求量 每秒有3w次请求。
读写比 读写比是1:1。
重要程度 核心系统,P1级故障。
其他说明 数据记录长度约为1KB,数据1周内数据操作频繁
推导过程:
Step1:1年内数据大约500G
结果:每秒产生的数据量大约诶500*1024*1024/(365*24*60*60)=17KB/s
Step2: 每秒有3w次请求,读写比是1:1
结果:每秒读请求为3w/2=1.5w/s,每秒写请求为3w/2=1.5w/s
Step3: 记录长度大约为1KB
结果:根据Step1得出的结果,每秒insert的速率为17次/s,根据Step2得到的每秒写请求为1.5w/s,可知每秒14983次为delete和update操作。由于MySQL数据读写操作按照页来处理,页大小为16KB,假设每次操作的页都不相同。那么每秒写操作数据量为:16KB*1.5w=234MB/s,每秒读操作数据量为:16KB*1.5w=234MB/s
Step4:数据1周内数据操作频繁
结果:热数据量为:(500/365)*7=9.6G
Step5:操作ms级返回
操作ms级别返回,那么需要尽可能的将热数据加载到内存。按照内存命中率接近100%计算的话,那么Innodb buffer大约为9.6GB,而其他内存需求大概为1~2GB,因此内存超配大约为12GB。按照超配原则,写带宽(wBPS)限制为300MB/s;读带宽(rBPS)限制为300MB/s。