目录

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以获得更好的性能。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐