提起MySQL数据库在硬件方面的优化无非是CPU、内存和IO。下面我们着重梳理一下关于磁盘I/O方面的优化。

1.磁盘冗余阵列RAID

RAID(Redundant Array of Inexpensive Disk)的基本目的是把小型廉价的硬盘合并成一块大容量的硬盘,用于解决数据冗余性并降低成本,且提高数据处理性能。

1.1 RAID的优点

RAID的优点可以从高传输速率和容错两方面来阐述:

(1)提高传输速率。RAID通过在多个磁盘上同时存储和读取数据来大幅提高存储系统的数据吞吐量(Throughput)。在RAID中,可以让很多磁盘驱动器同时传输数据,而这些磁盘驱动器在逻辑上又是一个磁盘驱动器,所以使用RAID可以达到单个磁盘驱动器几倍、几十倍甚至上百倍的速率。这也是RAID最初想要解决的问题。因为当时CPU的速度增长很快,而磁盘驱动器的数据传输速率无法大幅提高,所以需要有一种方案解决二者之间的矛盾。

(2)通过数据校验提供容错功能。普通磁盘驱动器无法提供容错功能,如果不包括写在磁盘上的CRC(循环冗余校验)码的话。RAID容错是建立在每个磁盘驱动器的硬件容错功能之上的,所以它提供更高的安全性。在很多RAID模式中都有较为完备的相互校验/恢复的措施,甚至是直接相互的镜像备份,从而大大提高了RAID系统的容错度,提高了系统的稳定冗余性。

1.2RAID常见类别

RAID0数据在从内存缓冲区写入磁盘时,根据磁盘数量将数据分成N份,这些数据同时并发写入N块磁盘,使得数据整体写入速度是一块磁盘的N倍。读取时也是一样的。因此RAID0具有极快的数据读写速度。但是RAID0不做数据冗余,N块磁盘中只要一块损坏,数据完整性就被破坏,所有的数据都会损坏,即任何一块硬盘的损坏都将导致数据的丢失。

RAID1 数据在写入磁盘时,将一份数据同时写入两块磁盘,这样任何一块磁盘损坏都不会导致数据丢失,插入一块新磁盘就可以通过复制数据的方式自动修复,具有极高的可靠性。但对应的存储能力有所降低,如两块相同硬盘组成的RAID1,则容量为其中一块硬盘的大小,即磁盘利用率为50%。

RAID5 RAID5也是一种普遍使用的RAID类型,是一种存储性能、数据安全和存储成本兼顾的存储解决方案。磁盘空间利用率要比RAID1高,存储成本相对较低。RAID5 和RAID4、RAID3相比,校验数据分布在阵列中的所有磁盘上,而没有采用专门的校验磁盘。对于数据和校验数据,它们的写操作可以同时发生在完全不同的磁盘上。因此, RAID5 不存在 RAID4 中的并发写操作时的校验盘性能瓶颈问题。另外, RAID5 还具备很好的扩展性。当阵列磁盘 数量增加时,并行操作量的能力也随之增长,可比 RAID4 支持更多的磁盘,从而拥有更高的容量以及更高的性能。RAID5 的磁盘上同时存储数据和校验数据,数据块和对应的校验信息存保存在不同的磁盘上,当一个数据盘损坏时,系统可以根据同一条带的其他数据块和对应的校验数据来重建损坏的数据。与其他 RAID 等级一样,重建数据时, RAID5 的性能会受到较大的影响。

说明:图中零散分布 APBPCPDP为校验数据

RAID10  结合RAID0和RAID1两种方案。Raid 10其实结构非常简单,首先创建2个独立的Raid1,然后将这两个独立的Raid1组成一个Raid0,当往这个逻辑Raid中写数据时,数据被有序的写入两个Raid1中。磁盘1和磁盘2组成一个Raid1,磁盘3和磁盘4又组成另外一个Raid1;这两个Raid1组成了一个新的Raid0。如写在硬盘1上的数据0、2、4、6 写在硬盘2中则为数据0、2、4、6,硬盘3中的数据为1、3、5、7,硬盘4中的数据则为1、3、5、7,因此数据在这四个硬盘上组合成Raid10,且具有raid0和raid1两者的特性。虽然Raid10方案造成了50%的磁盘浪费,但是它提供了200%的速度和单磁盘损坏的数据安全性,并且当同时损坏的磁盘不在同一Raid1中,就能保证数据安全性。假如磁盘中的某一块盘坏了,整个逻辑磁盘仍能正常工作的。当我们需要恢复RAID 10中损坏的磁盘时,只需要更换新的硬盘,按照RAID10的工作原理来进行数据恢复,恢复数据过程中系统仍能正常工作。原先的数据会同步恢复到更换的硬盘中。

1.3 总结

为数据库服务器配置RAID的时候,建议采用RAID10配置,尽管RAID10会更浪费空间,但它提供了更好的性能。直观地将,采用RAID5时,由于需要更新校验数据信息,所以每写一次数据,都需要读取数据奇偶信息,经过计算后,再更新校验数据,让后再写入实际数据,而RAID10则是直接写入数据。

2. 尽可能地使用SSD硬盘

SSD(Solid State Disk 或 Solid State Drive 固态硬盘)是一种基于永久性存储器的计算机外部存储设备。

与传统磁盘相比,其性能非常惊艳。

特点

数据对比

高IOPS

IOPS 即1秒内能够完成的读写次数,是存储性能的最直接的表现。传统磁盘每秒差不多可以完成200次IO请求,而SSD每秒钟可以高达60万次。

低延迟

低延迟 即主机下达存储指令后,存储介质完成存储并返回正确应答的时间。传统磁盘由于驱动马达转动盘片和摇动磁头手臂,完成单个IO需要2000微妙左右,而SSD只需要不到100微妙。

低功耗

如果使用传统的磁盘来创建接近SSD性能的磁盘阵列总功耗高达几百到上千瓦;而一块PCIe SSD的功耗不会超过25瓦。

大容量

传统磁盘容量在4TB以下,并且增长困难,而PCIe SSD已有单盘 12.8TB的容量,并且增长趋势可期。

故障率低且可预测

传统磁盘由于是机械部件,故障不可预测,年故障率在百分之三左右,而SSD的故障可以预测,年故障率在千分之五以内。

抗震能力强,且无噪音

传统磁盘是机械旋转设备,对震动敏感,甚至引发磁盘停转,同时马达也会发出噪音;而SSD完全是电子元件,抗震能力强,且不噪声。

3 IO调度策略--SSD推荐设置为noop,SATA为deadline

3.1  IO调度器

每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request。I/O调度器的基本目的是将请求按照它们对应在块设备上的扇区号进行排列,以减少磁头的移动,提高效率。每个设备的请求队列里的请求将按顺序被响应。实际上,除了这个队列,每个调度器自身都维护有不同数量的队列,用来对递交上来的request进行处理,而排在队列最前面的request将适时被移动到请求队列中等待响应。

IO调度器在内核栈中所处位置如下:

3.2 调度算法

内核中实现的IO调度器主要有四种--Noop,Deadline,CFG, Anticipatory。

如果简单概括总结的的话:1.NOOP 先进先出  2.Deadline 截止时间调度程序 3.CFQ 完全公平排队I/O调度程序 4.AS(预料I/O调度程序) .

Noop调度算法是内核中最简单的IO调度算法。Noop调度算法也叫作电梯调度算法,它将IO请求放入到一个FIFO队列中,然后逐个执行这些IO请求,当然对于一些在磁盘上连续的IO请求,Noop算法会适当做一些合并。这个调度算法特别适合那些不希望调度器重新组织IO请求顺序的应用。

Deadline算法的核心在于保证每个IO请求在一定的时间内一定要被服务到,以此来避免某个请求饥饿。

CFQ(Completely Fair Queuing)算法,顾名思义,绝对公平算法。它试图为竞争块设备使用权的所有进程分配一个请求队列和一个时间片,在调度器分配给进程的时间片内,进程可以将其读写请求发送给底层块设备,当进程的时间片消耗完,进程的请求队列将被挂起,等待调度。 每个进程的时间片和每个进程的队列长度取决于进程的IO优先级,每个进程都会有一个IO优先级,CFQ调度器将会将其作为考虑的因素之一,来确定该进程的请求队列何时可以获取块设备的使用权。

Anticipatory算法的核心是局部性原理,它期望一个进程做完一次IO请求后还会继续在此处做IO请求。在IO操作中,有一种现象叫“假空闲”(Deceptive idleness),它的意思是一个进程在刚刚做完一波读操作后,看似是空闲了,不读了,但是实际上它是在处理这些数据,处理完这些数据之后,它还会接着读,这个时候如果IO调度器去处理另外一个进程的请求,那么当原来的假空闲进程的下一个请求来的时候,磁头又得seek到刚才的位置,这样大大增加了寻道时间和磁头旋转时间。所以,Anticipatory算法会在一个读请求做完后,再等待一定时间t(通常是6ms),如果6ms内,这个进程上还有读请求过来,那么我继续服务,否则,处理下一个进程的读写请求。

对于一些非旋转磁头氏的存储设备,使用Noop的效果更好。因为对于旋转磁头式的磁盘来说,IO调度器的请求重组要花费一定的CPU时间,但是对于SSD磁盘来说,这些重组IO请求的CPU时间可以节省下来,因为SSD提供了更智能的请求调度算法,不需要内核去画蛇添足。

3.3 性能对比

以下性能Report是在SSD存储介质下,各调度策略的性能表现。

通过数据对比,我们也可以发现:SSD推荐设置为noop。

(网上还有一个别人相关的测试报告,大家可以参阅  https://www.percona.com/blog/2009/01/30/linux-schedulers-in-tpcc-like-benchmark/)

4.其它的注意事项

例如:进程打开文件数:65535 ;文件系统:选XFS(centos7已经默认是XFS了)等等。

参考文献:

1. https://www.cnblogs.com/cobbliu/p/5389556.html

2.《MySQL 运维内参》

3. 网络分享

本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

扩有mysql的磁盘_为提高MySQL性能而在磁盘IO方面的设置相关推荐

  1. 如何提高mysql查询效率_如何提高MySQL查询效率

    MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由于P2P的应用中,结点数动辄上万个,而且节点变化频繁,因此一 ...

  2. go连接mysql集群_什么是MySQL集群-Go语言中文社区

    一.什么是MySQL集群 MySQL集群是一个无共享的(shared-nothing).分布式节点架构的存储方案,其目的是提供容错性和高性能. 数据更新使用读已提交隔离级别(read-committe ...

  3. mysql 树形结构_再读MySQL索引-《高性能MySQL》索引手记

    最近工作中经常和MySQL打交道,当数据量小的时候,不同查询方式以及是否使用索引并无大碍,当数据量随着业务的成长急剧加速时,索引的重要性不言而喻. 本篇文章以<高性能MySQL>中的索引章 ...

  4. mysql数据库参考_干货:MySQL数据库优化参考

    标签: 本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适当的索引即可达到效果,更复杂的就 ...

  5. mysql数据库算法_数据库:MySQL索引背后的数据结构及算法原理【转】

    原文:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话 ...

  6. sphinx mysql存储引擎_基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计...

    Sphinx,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级).Sphinx创建索引的速度为:创建100万条记录的索引只需3-4分钟,创建1000万条记录的索引可以在5 ...

  7. 什么是mysql的索引_什么是MySQL索引?【详解】

    本篇文章主要给大家介绍什么是MySQL索引? MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基 ...

  8. mysql 列合并_实战讲解MySQL执行计划,面试官当场“要了我”

    explain或者desc获取MySQL如何执行select语句的信息. 结果包含很多列 1 各列字段说明 1.1 id SELECT标识符.这是查询中SELECT的序列号,表示查询中执行select ...

  9. mysql三大日志_了解的mysql三大日志-----binlog

    binlog用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中.binlog是mysql的逻辑日志,并且由Server层进行记录,使用任何存储引擎的mysql数据库都会记录b ...

最新文章

  1. [ZZ]风险评估和最佳实践
  2. linux简单搭建ftp服务器
  3. java获取数据库的列名,类型等信息
  4. RHEL5.4部署中央日志服务器之rsyslog+loganalyzer
  5. 新生代中Eden:S1:S2为什么是8:1:1?
  6. centos php 开启libgdgd_CentOS搭建PHP环境
  7. 2018年大数据趋势
  8. [Redux/Mobx] redux和flux的区别是什么?
  9. 使用PowerDesinger 正向工程
  10. django的 信号
  11. vscode 修改(自定义)插件的快捷键
  12. Spark学习笔记——构建基于Spark的推荐引擎
  13. itextpdf 数字签名
  14. 详细安装 kali 教程
  15. 美萍足浴远程共享狗使用方法
  16. Base64 | Base32 | Base16编码和解码小结
  17. Android studio 教程入门
  18. Java设置PPT幻灯片背景——纯色、渐变、图片背景
  19. 口令破解(web安全入门07)
  20. SCIENCE CHINA LATEX模板缺少的一个重要文件psfig.sty,File `picins.sty’ not found.

热门文章

  1. Java 线程池(ThreadPoolExecutor)原理分析与使用
  2. mysql 把表的值用来计算_mysql一张表到底能存多少数据?
  3. python 导入模型h20_【机器学习】模型融合方法概述
  4. k近邻回归算法python_K近邻算法用作回归的使用介绍(使用Python代码)
  5. 一步带你了解java程序逻辑控制
  6. 安装程序未能打开日志文件_工地开工,安全日志记录这样写才规范!
  7. python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...
  8. 权限管理系统中 管理员能看到所有用户的密码么_计算机毕设项目002之学生成绩管理系统...
  9. axure文件如何加密_怎么样给PDF加密?PDF文件如何加密?
  10. 【必看】Linux 系统的备份恢复