目录
1.磁盘的访问模式
2.磁盘分类
2.1 HDD机械磁盘
2.1.1 机械磁盘性能
2.1.2 IOPS
2.1.3 提升IOPS性能手段
2.1.4 RAID技术
RAID 0
RAID 1
RAID 5
RAID 6
RAID 10
RAID 50
RAID总结
2.2 SSD固态硬盘
2.2.1 查看磁盘调度算法
2.2.2 修改磁盘调度算法
2.2.3 参数innodb_flush_neighbors
2.2.4 参数innodb_log_file_size
2.2.5 SSD选择
3.文件系统与操作系统
1.磁盘的访问模式
顺序、随机访问严格意义上说是逻辑的
2.磁盘分类
左边是HDD机械磁盘,右边是SSD固态硬盘,mysql一般要用SSD
2.1 HDD机械磁盘
2.1.1 机械磁盘性能
机械磁盘顺序访问性能好,100M/s的速度叫做带宽(磁盘吞吐率)
机械磁盘随机访问性能较差,每次随机读都会去旋转定位
2.1.2 IOPS
IOPS(Input/Output Operations Per Second)即每秒处理IO的能力,用来形容随机访问性,数据库比较多的是随机访问,通过B+tree索引定位是比较随机的,如果是顺序的话通常来说是扫描,比如join,但是mysql大部分用作OLTP系统,所以大部分看重IOPS性能,机械硬盘7200转/分钟的IOPS是7200/60=120。
每次IO可以4k、8k、16k甚至1M都可以,上面的图 4KB Random Write-MB/s Intel x25-E 64G(SLC)换算成IOPS是1MB/4KB*48=12288
一般的磁盘1次IO是4KB(块大小,业界默认),mysql中innodb_page_size(块大小)是16K,所以IOPS需要除以4
2.1.3 提升IOPS性能手段
raid和共享存储设备都是将多块盘组成一个逻辑设备 ,raid对IOPS性能提升非常有限
2.1.4 RAID技术
RAID(Redundant Array of Independent Disks)即独立磁盘冗余阵列,RAID技术将多个单独的物理硬盘以不同的方式组合成一个逻辑硬盘,从而提高了硬盘的读写性能和数据安全性。
RAID 0
条带化(数据分块)但没有冗余,提供较高的读写性能。
- 优点:可以提高读写速度,对于需要处理大型文件的应用程序非常有用。
- 缺点:不提供数据冗余,一旦硬盘出现故障,所有数据都将丢失。
- 适用场景:适用于对数据冗余要求不高的应用,如游戏、视频编辑、图形处理等。
RAID 1
又称镜像(Mirror),数据同时一致写到主硬盘和镜像硬盘,提供容错能力。
- 优点:提供了良好的数据冗余和保护,可以容忍一个硬盘的故障,数据仍然可以从其他硬盘中恢复。
- 缺点:需要使用更多的硬盘以实现数据冗余,读写性能可能会受到影响。
- 适用场景:适用于对数据可靠性要求较高的场景,如数据库、文件服务器等。
RAID 5
条带化加分布式奇偶校验,提供数据冗余和读取性能,RAID 5是最常用的RAID方式之一。
- 优点:提供了良好的数据冗余和性能,可以容忍一个硬盘的故障,且读取性能较高。
- 缺点:写入性能可能受到影响,且在发生故障时进行重建需要较长时间。
- 适用场景:适用于多读少写的应用,如Web服务器、文件共享等。
RAID 6
类似于RAID 5,但提供更高级别的容错能力。
- 优点:提供了更好的数据冗余和可靠性,可以容忍两个硬盘的故障。
- 缺点:需要使用更多的硬盘以实现更高的数据冗余,写入性能可能会受到影响。
- 适用场景:适用于需要高可靠性和数据冗余的应用,如金融和医疗领域。
RAID 10
将镜像和条带进行两级组合的RAID级别,第一级是RAID1镜像对,第二级为RAID 0,提供较高的容错能力和读写性能。RAID10也是一种应用比较广泛的RAID级别。
- 优点:提供了较好的性能和数据冗余,可以容忍一个或多个硬盘的故障。
- 缺点:需要使用更多的硬盘,成本较高。
- 适用场景:适用于需要高性能和可靠性的应用,如虚拟化服务器、数据库等。
RAID 50
RAID 5组合成RAID 0,提供较高的性能和容错能力。
- 优点:提供较高的数据传输速度和系统性能,更高级别的数据冗余,同时发生多个驱动器故障,仍能恢复丢失的数据。
- 缺点:较高的成本,配置和管理复杂性。
- 使用场景:适用于需要高性能和更高级别的数据冗余的场景,如大规模数据存储、图形渲染和动画制作、虚拟化环境
RAID总结
RAID级别 | 最小磁盘数 | 容错能力 | 磁盘空间开销 | 读取速度 | 写入速度 | 硬件成本 |
---|---|---|---|---|---|---|
RAID 0 | 2 | 无 | 0% | 高 | 高 | 低 |
RAID 1 | 2 | 单个磁盘 | 50% | 高 | 低 | 中 |
RAID 5 | 3 | 单个磁盘 | 1 / N | 中 | 低 | 中 |
RAID 6 | 4 | 两个磁盘 | 2 / N | 中 | 低 | 高 |
RAID 10 | 4 | 多个磁盘 | 50% | 高 | 中 | 高 |
RAID 50 | 6 | 单个磁盘 | 1 / N | 高 | 中 | 高 |
2.2 SSD固态硬盘
2.2.1 查看磁盘调度算法
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
2.2.2 修改磁盘调度算法
[root@localhost ~]# echo cfq > /sys/block/sda/queue/scheduler
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
[root@localhost ~]# echo deadline > /sys/block/sda/queue/scheduler
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
是SSD的话,强烈要求使用deadline算法
2.2.3 参数innodb_flush_neighbors
innodb_flush_neighbors是MySQL InnoDB存储引擎的一个配置参数,用于控制邻近页的刷新行为。它影响了InnoDB在刷新脏页到磁盘时的写入策略。
在 InnoDB 中设置 innodb_flush_neighbors这个参数的值为 0,来规定 MySQL只刷当前脏页,MySQL 8 这个值默认是 0,MySQL 5.7默认是1
innodb_flush_neighbors参数的取值可以是0或1,具体含义如下:
当innodb_flush_neighbors设置为1时,InnoDB会尽量按照邻近页的顺序进行刷新,以提高顺序写入的效率。这意味着InnoDB会将邻近的脏页一起刷新到磁盘,而不是单独刷新每个脏页。
当innodb_flush_neighbors设置为0时,InnoDB将按照页号的顺序进行刷新,而不考虑邻近页。这可能导致更多的随机写入操作,但在某些场景下可能适用。
2.2.4 参数innodb_log_file_size
innodb_log_file_size参数是用来设置InnoDB存储引擎的日志文件大小的。修改此参数后重启mysql才能生效。在MySQL中,日志文件用来记录数据库的变更操作,包括事务的提交和回滚。在设置innodb_log_file_size参数时,需要考虑以下几个因素:
- 日志文件大小的合理性:日志文件大小太小会导致频繁的切换和写入操作,降低数据库的性能,而日志文件大小太大则会占用较多的磁盘空间。
- 磁盘空间的可用性:在调整日志文件大小时,需要确保磁盘空间足够存储新的日志文件。
根据服务器性能配置来设置,innodb_log_file_size=4G等等
2.2.5 SSD选择
推荐intel
3.文件系统与操作系统
提高挂载性能
mount -o noatime,nobarrier /dev/sdb1 /data
- noatime参数:这个选项可以阻止在文件被访问时更新文件的访问时间,这可能会稍微提高文件访问的性能,因为不需要更新inode
- nobarrier参数:这个选项主要用于“barrier”的用途,barrier是一种同步数据写入到磁盘和提交数据到日志的方法。在某些情况下,例如电源故障,可能会导致数据丢失,因此需要barrier。但是,在使用某些SSD或RAID配置时,可以禁用barrier以获得更好的性能。