使用 RAID10 + BBWC 时,为什么将 PostgreSQL 数据文件与操作系统和事务日志分开比将它们全部保存在同一个阵列上更好?

使用 RAID10 + BBWC 时,为什么将 PostgreSQL 数据文件与操作系统和事务日志分开比将它们全部保存在同一个阵列上更好?

我到处都看到过这样的建议(包括这里这里): 将操作系统分区、数据库数据文件和数据库事务日志保存在单独的磁盘/阵列上。一般建议对操作系统使用 RAID1,对数据使用 RAID10(如果负载非常偏向读取,则使用 RAID5),对事务日志使用 RAID1。

但是,考虑到您至少需要 6 或 8 个驱动器来构建此设置,使用 BBWC 的 6-8 个驱动器组成的 RAID10 性能不是更好吗?如果驱动器是 SSD 怎么办?

我在这里谈论的是内部服务器驱动器,而不是 SAN。

答案1

提出此建议的原因是为了避免使一个磁盘组过载。请考虑以下一组同时发生的事件:

  1. DB 连接在大表上运行 SELECT
  2. 第二个 DB 连接在另一个表上运行大型 INSERT 或 UPDATE
  3. 几个人同时登录机器(SSH)

如果你的系统在单个磁盘上运行,那么磁头现在需要在我们正在访问的表的位置SELECT、任何/var存在的位置(用于记录登录)、预写式日志的位置(用于记录或INSERTUPDATE、启动新用户会话所需的 中的各个位置/home以及最终被编辑或删除/bin的表之间来回跳动。INSERTUPDATE

所有的磁盘磁头移动都需要时间 - 随着冲突请求数量的增加,所需的时间变得可测量,并且可能以性能下降的形式显现出来。

如果上述三项操作分别发生在不同的磁盘组(SELECTs 发生于数据组,INSERTs 和UPDATEs 发生于 WAL 组,OS 内容发生于 OS 组),则上述三项操作理论上可以并行发生(并且最终可以在数据组方便时刷新预写日志)。


关键在于,这基于理论上较少的主轴数量 - 单个磁盘或 2-4 个驱动器的小型 RAID 组。
正如您和 ewwhite 所指出的那样,在某个时候,拥有更多主轴可以缓解冲突的磁头移动请求,最终收益会抵消大多数工作负载的潜在性能损失。

这里的关键是对您的工作负载进行基准测试(尽可能多地进行基准测试)。
另外,正如有人指出的那样,SSD 使主要的基本假设无效(SSD 对任何“扇区”的访问都是恒定时间的 - 没有旋转或磁头定位延迟),因此如果您在设计中使用 SSD,则应牢记这一点:您可能从条带化 SSD 中看到的好处比将它们分开以隔离活动的好处更多,因为假设冲突的磁盘请求需要更多时间来重新定位机械磁头和盘片。

答案2

我不太在意在内部磁盘设置中将操作系统与数据驱动器分开,因为拥有更多主轴(在那种规模上)带来的好处胜过拥有离散磁盘组带来的好处。

找出答案的最佳方法是使用您的设置和数据进行测试...

请记住,您使用的是 HP 控制器。智能阵列控制器可以采用一组 8 个磁盘(阵列),并将其划分为具有不同 RAID 级别的多个逻辑驱动器。因此,如果您愿意,可以将其划分为 200GB 的 RAID 5、36GB 的 RAID 1+0、100GB 的 RAID 1+0 和 50GB 的 RAID 0...如果可以,最好利用更多磁盘。

SSD 会稍微改变一些。使用 P410 控制器,您实际上不应该使用超过 6 个磁盘。高于该水平的收益递减

答案3

上面的答案都很好,但还有另一个原因需要将操作系统与数据和/或日志分开。这样可以更轻松地设置不同的防病毒策略。将数据与操作系统分开也是数据库和 Web 服务器的安全最佳实践/要求。最后一件事是,您可以擦除并重建操作系统,而不必担心数据。

答案4

这可能取决于您的 IO 速率。4 磁盘 RAID 10 阵列每秒可能接近 500 个 IO 操作。您最好的数据将来自性能测试,其中您监控 IO 速率、磁盘队列长度和磁盘繁忙百分比。如果一切看起来都很好,就没有必要移动东西。

对于 SSD,情况就不同了。一个磁盘将能够处理巨大的 IO 负载。RAID 1 阵列的性能可能好近 2 倍;这取决于您的 RAID 卡有多好,以及它是否确实从两个磁盘读取数据(很可能确实如此)。我对 SSD 和 DB 日志的担心是写入次数太多,以及它是否会缩短驱动器的使用寿命。我还没有看到太多关于这方面的数据。

相关内容