不断向现有 PostgreSQL 服务器添加 SSD

Nyx*_*nyx 5 postgresql tablespaces scalability raid timescaledb

专门运行 PostgreSQL 11.2 服务器(带有 TimescaleDB 扩展)的 Ubuntu 18.04 服务器将很快耗尽磁盘空间,因此需要向计算机添加新的 SSD 磁盘以支持不断增长的数据库大小。

数据预计将以相同/更高的速率继续增加,因此需要不断增加存储硬件,直到机器用完 2.5 英寸驱动器托架。只有这时才会考虑将数据库分布在多台机器上,因为所涉及的复杂性增加。

想法

  1. 联合文件系统mergerfs可以将驱动器集中在一起,轻松解决存储扩展问题。但这会增加数据库操作的延迟,因此不建议这样做。可以通过底层 RAID-1/5/6/10 或使用 SnapRAID 添加冗余。

  2. RAID-0 和 RAID-10 允许将 RAID 阵列扩展到新添加的驱动器中,并通过条带化提高性能。然而,每个添加的驱动器都会增加一个故障点。此外,许多人声称镜像 SSD 的用途有限,因为RAID-0 中的两个 SSD 可能会同时发生故障。所以也许这意味着 RAID-10 并不比 RAID-0 更好。此外,故障率随着每增加一个 SSD 而线性增加。

  3. RAID-5/6 由于奇偶校验计算和写入 2 个驱动器而降低了性能,从而使有效 IOPS 降低了 75%。对于数据库来说似乎是一个糟糕的选择。

  4. PostgreSQLTABLESPACES可用于将每个表分配到特定驱动器。然而,使用表空间会使恢复变得非常复杂。此外,是否可以在新驱动器上创建新表空间并让 Postgres 自动决定将新记录写入何处?

  5. ZFS、BTRFS?对他们不熟悉,愿意探索他们是否合适。

问题: 2020年推荐的PostgreSQL机器扩容方法是什么,如果扩容频繁(一年1-2次),性能应该不会受到太大影响,恢复也不会太复杂可能会导致数据丢失?

RAID-10 对我来说似乎是一个好主意,但 RAID-1 的使用似乎有限,同时会导致“损失”一半的磁盘空间,随着驱动器数量的增加,故障点也会增加,情况会变得更糟。

由于预算限制,我们无法一次性将 2U 机箱中的 16 个驱动器托架全部装满 SSD,因此必须逐步完成。

任何意见是极大的赞赏!

编辑:在研究了 ZFS 之后,这似乎可能是我的案例的解决方案之一。

  • 仅包含镜像 ZFS vdev(每个 vdev 2 个驱动器)的 ZFS 池将允许通过一次添加 2 个驱动器来扩展存储池

  • 在 ZFS 池中保留 1-2 个热备件可以在其中 1 个驱动器发生故障时允许 ZFS 自动进行故障转移

  • 使用镜像 vdev,驱动器发生故障后的重建时间将比使用 RAIDZ vdev 快得多。这也减少了用于重建的幸存驱动器在此过程中出现故障的可能性。在重建期间,降级的镜像 vdev 将比降级的 RAIDZ vdev 具有更高的性能

  • ZFS 支持内联数据压缩,这有助于显着(4 倍压缩)降低 TimescaleDB 数据的存储要求,而无需使用本机 TimescaleDB 压缩,该压缩会阻止压缩数据更新,除非未压缩。这也非常重要,因为众所周知,与 InfluexDB 等其他数据库相比,TimescaleDB 的数据压缩较差

  • 按照jjanes的建议,在 SSD 即将发生故障时监控并更换它们

如果我理解正确的话,使用 ZFS 镜像 vdev 将选中我的所有框:连续添加驱动器、允许提供单个安装点、数据冗余和额外的约 4 倍数据压缩的驱动器池。

小智 3

您是否打开了从 v1.5 起可用的 TimescaleDB 原生压缩?我问这个问题是因为您在上面提到了 ZFS/BTRFS,这表明您尚未使用其压缩。

通常情况下可以节省 90-98% 的存储空间...

https://docs.timescale.com/latest/using-timescaledb/compression

此外,您可以使用 TimescaleDB 的attach_tablespace命令添加更多磁盘,然后新块在可用表空间之间进行负载平衡。

https://docs.timescale.com/latest/api#attach_tablespace

  • 在使用 timescael-db 压缩之前请仔细考虑:如果没有手动解压缩,您将无法修改数据或模式(!):[参考文档](https://docs.timescale.com/latest/using-timescaledb/压缩) (4认同)