文档章节

MySQL与IO

天天顺利
 天天顺利
发布于 2016/01/05 09:48
字数 2082
阅读 60
收藏 6
   数据库作为存储系统,所有业务访问数据的操作都会转化为底层数据库系统的IO行为(缓存系统也可以当做是key-value的数据库),本文主要介绍访问mysql数据库的IO流程以及IO相关的参数。

一 MySQL 的文件

首先简单介绍一下MySQL的数据文件,MySQL 数据库包含如下几种文件类型:
数据文件 (datafile) 存放表中的具体数据的文件。
数据字典 记录数据库中所有innodb表的信息。
重做日志 (redolog) 记录数据库变更记录的文件,用于系统异常crash(掉电)后的恢复操作,可以配置多个比如 ib_logfile0、 ib_logfile1,
回滚日志 (undolog) 也存在于mysql 的ibdata文件,用户记录事务的回滚操作。
归档日志 (binlog) 事务提交之后,记录到归档日志中。
中继日志 (relaylog) 从master 获取到slave 的中转日志文件,sql_thread 则会应用relay log 
其他日志 slowlolg, errorlog, querylog

    对于以上文件的IO访问顺序可以分为顺序访问 比如binlog ,redolog ,relay log是顺序读写,datafile,ibdata file是随机读写,这些IO访问的特点决定了在os 配置磁盘信息时候,如何考虑分区 ,比如顺序写可以的log 可以放到SAS 盘 ,随机读写的数据文件可以放到ssd 或者fio 高性能的存储。

二 数据访问流程

数据库访问分为两种类型, 一种是读操作,另外一种是写操作。
1 读操作 
    create table t (
      id int not null primary key ,
      k1 int not null,
      data varchar(50),
      key ind_k1(k1)
     ) engine=innodb default charset=utf8;
   
以 select * from tab where k1=1 ;为例
   
                                              图-1 读操作的 IO 流程
  1 查看缓存中是否存在id,
  2 如果有 则从内存中访问,否则要访问磁盘,
  3 并将索引数据存入内存,利用索引来访问数据,
  4 对于数据也会检查数据是否存在于内存,
  5 如果没有则访问磁盘获取数据,读入内存。
  6 返回结果给用户。

2 写操作
    为了保证数据写入操作的安全性,数据库系统设置了 undo,redo  保护机制,避免因为os或者数据库系统异常导致的数据丢失或者不一致的异常情况发生。
    以 insert into t values(1,1,'shuiyi');为例
  
                               图-2 写操作的 IO 流程

我们假定数据在内存中,不考虑从磁盘中获取数据的情形。大致的写操作步骤:
   1 先写undo log 
   2 在内存更新数据
   3 记录变更到redo log,prepare 
   4 写入binlog
   5 redo log 第二阶段,commit  
   6 返回给client
 
如果有slave
   第4步之后 经过slave 服务线程 io_thread 写到从库的relay log ,再由sql thread 应用relay log 到从库中。

关于性能
     写undo redo log ,binlog的过程中都是顺序写,都会很快的完成,随机写操作,inset_buffer 功能
    对于非聚集类索引的插入和更新操作(5.5 版本及以上支持Update/Delete/Purge等操作的buffer功能),不是每一次都直接插入到索引页中,而是先插入到内存中。具体做法是:如果该索引页在缓冲池中,直接插入;否则,先将其放入插入缓冲区中,再以一定的频率和索引页合并,就可以将同一个索引页中的多个插入合并到一个IO操作中,改随机写为顺序写,大大提高写性能。
  关于数据安全,这是数据库写入的重点
    
     1,2,3  过程失败 就是事务失败,因为此时还未写入磁盘,对磁盘中的数据无影响,返回事务失败给client,从库也不会受到影响。
     4,5 过程失败的时候或者已经将写成功返回给客户,可以根据redo log 的记录来进行恢复,如果出现部分写失效 请参考《double write》
     mysql的写redo log的第一个阶段会把所有需要做的操作做完,记录数据变更,第二阶段的工作比较简单 ,只做事务提交确认。如果写入binlog 成功,而第二阶段失败,mysql 启动时也会将事务进行重做,最终更新到磁盘中。
     5.5 +的 smei sync  可以更好的保障主从的事务一致性。  

三 文件访问方式

    IO 访问的方式分为两种顺序读写和随机读写, 在mysql 的io过程中可以以此来将数据库文件分类
     顺序读写
     重做日志  ib_logfile*,binlog file
     随机读写 
     innodb 表数据文件,ibdata文件。
  根据系统的访问类型,对硬件做如下分类
  读多 SSD+RAID
  写多 FIO(flashcache)
  容量密集 fio + flashcache
  由于随机io会严重降低系统的性能,在当前的硬件水平下,可以考虑选择奖数据库服务器配置ssd/fusionio。
  
四 影响IO的参数和策略

    影响mysql io 的参数有很多个,这里罗列几个重要的参数。 
    innodb_buffer_pool_size
    该参数控制innodb 缓存大小,用于缓存应用访问的数据,推荐配置为系统可用内存的80%。
    binlog_cache_size
    该参数控制二进制日志缓冲大小,当事务还没有提交时,事务日志存放于cache,当遇到大事务cache不够用的时,mysql会把uncommitted的部分写入临时文件,等到committed的时候才会写入正式的持久化日志文件。
    innodb_max_dirty_pages_pct
    该参数可以直接控制Dirty Page在BP中所占的比率,当dirty page 达到了该参数的阈值,就会触发MySQL 系统刷新数据到磁盘
  
    innodb_flush_log_at_trx_commit
    该参数确定日志文件何时write、flush。
为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。
为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去.
为2,每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
注意:
  由于进程调度策略问题,这个“每秒执行一次 flush(刷到磁盘)操作”并不是保证100%的“每秒”。
    sync_binlog
    sync_binlog 的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。
当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。
   innodb_flush_method
   该参数控制日志或数据文件如何write、flush。可选的值为 fsync, o_dsync ,o_direct,littlesync,nosync
  fdatasync 模式:写数据时,write这一步并不需要真正写到磁盘才算完成(可能写入到操作系统buffer中就会返回完成),真正完成是flush操作,buffer交给操作系统去flush,并且文件的元数据信息也都需要更新到磁盘。
  O_DSYNC 模式:写日志操作是在write这步完成,而数据文件的写入是在flush这步通过fsync完成
  O_DIRECT模式:数据文件的写入操作是直接从mysql innodb buffer到磁盘的,并不用通过操作系统的缓冲,而真正的完成也是在flush这步,日志还是要经过OS缓冲
  注意:关于mysql 和io相关的参数,并不是一成不变的,需要根据自身业务系统和硬件系统做相应调整,系统上线之前,测试出一个最佳值。


五 小结
    数据库的io是一个很复杂和细致的知识层面,涉及数据库层和OS层面的IO写入策略,也和硬件的配置有关,本文主要针对MySQL 层面做分析,可能分析的不够全面,请各位朋友指点。

六 参考文档




本文转载自:http://cuda.itpub.net/22664653/viewspace-1146808/

天天顺利
粉丝 46
博文 167
码字总数 73007
作品 0
海淀
技术主管
私信 提问
Zabbix监控mysql配置及故障告警配置

本文主要介绍zabbix监控mysql的配置,包含使用zabbix自带模板监控mysql相关信息及自定义key监控mysql同步情况。同时介绍了触发器的创建及zabbix通过邮件方式告警配置。 一、配置自带模板监控...

hnr1017
2018/07/03
0
0
mysql 主要性能指标 初级参考2 针对io和innodb

从系统方面入手的话,参考MySQL 调优基础(四) Linux 磁盘IO https://www.2cto.com/database/201510/445288.html iotop -k -u mysql (-k 表示KB,-u mysql表示显示mysql用户的所有进程的IO) i...

liqius
2017/10/25
0
0
MySQL主从同步 利用原有从库添加新从库

转载自:http://www.jquerycn.cn/a14879 mysql主从复制服务器 1主 1从 ,现在要添加一个mysql从服务器,要求主库不能停止服务,以前由于不是线上的服务器,可以在主服务器上 执行 flush tabl...

kuSorZ
2018/07/20
0
0
zabbix 平时有用的监控项

mysql 最关注的项 Threads cached State Sending Data innoDB Rows Deleted per second(读写数量) io方面 disk:sda:Read:Bytes/sec BandWIDTH UTILIZATION for sda MySQL Connections tableo......

liqius
2017/11/17
0
0
mysql重启后io突然很高

之前mysql cpu很高,基本在300%左右,磁盘io在10%左右,昨天改了wait_timeout参数,重启了mysql,io突然暴增,cpu、内存都很高,将mysql配置还原后还是这样,慢查询也变得非常多,之前正常的...

Colan
2014/03/27
665
2

没有更多内容

加载失败,请刷新页面

加载更多

NIO基于长度域的报文在Netty下的解码

1, 先复习一下粘包/拆包 1.1, 粘包/拆包的含义 TCP是个“流”协议, 并不了解上层业务数据的具体含义, 它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP...

老菜鸟0217
今天
8
0
从零开始搭建spring-cloud(2) ----ribbon

在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。 其实我们已经在上...

Vincent-Duan
今天
17
0
get和post的区别?

doGet:路径传参。效率高,安全性差(get的传送数据量有限制,不能大于2Kb) doPOST:实体传参。效率低,安全性好 建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Pos...

花无谢
昨天
4
0
当谈论迭代器时,我谈些什么?

当谈论迭代器时,我谈些什么? 花下猫语:之前说过,我对于编程语言跟其它学科的融合非常感兴趣,但我还说漏了一点,就是我对于 Python 跟其它编程语言的对比学习,也很感兴趣。所以,我一直...

豌豆花下猫
昨天
14
0
10天学Python直接做项目,我做了这5件事

初学者如何尽快上手python? 市面上关于如何学python的资料很多,但是讲的都太复杂。 我就是很简单的几句话,从小白到开发工程师,我只做了五件事。 我觉得任何商业计划书如果不能用几句话讲...

Python派森
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部