起因
研究这个问题的起因是需要在ESXI机器分配一台高IO的虚拟机做数据库,但实际测试性能完全没有达到测试预期
本想着5块ssd硬盘做raid5,性能肯定没有问题,但分配硬盘后测试发现,4k随机读取iops有500k,符合甚至超出预期,但4k随机写入iops仅11k左右,不仅与我理想中的40k+相差甚远,甚至比我我预期单盘4k随机写入iops(20k)都相差甚远
推测和排查
根据这个结果,我认为是ESXI限制了其性能的发挥,于是找了一些资料,其中可能的问题包括如下:
- esxi版本比较低,其存储驱动可能有瓶颈
- 阵列卡驱动可能较低,达到瓶颈
- ESXI低版本固有的性能问题
于是我分别从这三个问题入手,尝试升级驱动,也新增了一台高版本ESXI虚拟机(3块SSD硬盘raid5),结果读iops与之前差不多,写iops也与之前差不多,这似乎说明并非ESXI的问题
为了印证不是虚拟化影响的性能,接着我又把ESXI物理机直接更换为centos,跳过所有虚拟化的性能影响,仍保持3块SSD硬盘raid5,结果读写iops与之前仍然相似
至此,问题变成了raid本身的性能问题
RAID级别
我们通常接触的raid级别有raid0、raid1、raid10、raid5、raid6,还有一些更高级的raid50、raid60基本上不太常用,其要求的硬盘位较多,接下来我们从安全性、空间、性能分别分析一下常用的几种raid的特点
raid0
空间:N,raid0拥有最大的空间,他跟jbod有点类似,把所有的硬盘空间叠加 性能:把数据条带化分布到每块硬盘,那么其性能也是最高的,可以是所有硬盘的叠加 安全性:安全性最低,因为所有数据分布在不同硬盘,如果一块硬盘损坏,那么所有数据不可用
raid1
空间:2,raid1因为需要保持镜像,所以空间利用率为50% 性能:写入的时候需要写入两份数据,所以写入性能会下降,读取策略如果每块硬盘都可以参与,那么示有性能提升的 安全性:安全性适中,允许损失一块硬盘
raid10
空间:N/2,可以看做是多块硬盘两两组合成raid1之后再组成raid0,所以空间利用率为50% 性能:写入的时候会先写入两个raid0,再同步两个raid1,理论上是有提升的。读取性能肯定会有提升 安全性:允许两个raid1各丢失一块硬盘,最多丢失两块硬盘,但不能允许单个raid1中丢失两块硬盘
raid5
空间:N-1,数据会被条带化为硬盘数量-1,如果有5块硬盘,那么数据会被条带化为4份数据+1份(条带数据异或)奇偶校验值,如果数据甚至小于条带大小,那么只有第一块硬盘会存储完整数据,其他硬盘则存储填充值 性能:写入的时候需要做奇偶计算,性能有所下降,读取时会分布式读取不同硬盘,性能有所提升 安全:允许丢失任意一块硬盘
raid6
空间:N-2,数据会被条带化为硬盘数量-2,如果有4块硬盘,那么数据会被条带化为2份数据+2份数据的奇偶校验,如果数据甚至小于条带大小,那么只有第一块硬盘会存储完整数据,其他硬盘则存储填充值 性能:写入的时候需要生成两份奇偶计算数据,性能有所下降,读取时会分布式读取不同硬盘,性能有所提升 安全:允许丢失任意两块硬盘(与raid10的差别)
基于以上特性,我们一直使用的 raid5、raid6的模式,因为不挑损坏的硬盘,比如raid10和raid6都是4块硬盘,但raid10不能一组raid1同时损坏,而raid6可以损坏任意两块,在安全性上更高
raid选择
根据数据安全、可用容量、性能等特性,raid5写入性能比较差,raid6理论上会更差,raid建议如下:
- 对于性能要求较高的场景,考虑使用raid10的方式来均衡性能和权限,但同时安全性要通过监控+到期更换的方式来弥补
- 对于安全要求保障较高的场景,建议raid6,其空间在超过4盘时优于raid10
- 对于空间要求较高的场景,建议raid5
评论