PostgreSQL 上 100 TB 数据库(无分片)

PostgreSQL 上 100 TB 数据库(无分片)

在 PostgreSQL 上建立一个 100 TB 的数据库(实际上大约 90 TB)是否现实?数据分片多个节点之间如何实现?是否有类似设置的成功案例/示例?

答案1

通常,每秒需要处理 50K 次写入,这已经不是什么挑战了。即使在插入操作相当简单的综合基准测试中,PostgreSQL 的限制也往往最高约为 10 K/s - 而且就数据库大小而言,你甚至没有遇到过这么大的怪物。

另外,单个 PostgreSQL 节点的 I/O 系统将会很有趣,因为即使使用 RAID 10,并假设 50K 插入将等于 50K IOPS(这可能是错误的,但这取决于您的数据库方案和索引),您将需要大约一百个磁盘与一个非常好的阵列配对,这样就不必购买几百个磁盘以及时为这些写入提供服务。

如果分片很容易,而且你预计会有如此巨大的写入负载,那么就选择分片吧。写入可能很难扩展。

答案2

这是现实可行的。性能很大程度上取决于你有多少 RAM。RAM 越大,缓存越大,PostgreSQL 在将数据卸载到磁盘之前可以缓存的时间越长。

PostgreSQL 会将数据写入缓存,并时不时地卸载缓存。因此,每秒 50k 个 INSERT 不会转换为 50k IOPS。它会少得多,因为它会将记录聚集在一起并同时写入所有记录。

如果大部分工作都是 INSERT,那么这么大的数据库就不是问题了。PostgreSQL 必须时不时地更改索引,但这确实是一件容易的事。如果在这个大小的数据库中有很多 SELECT,那么您确实需要分片。

我曾经在一台 16GB 服务器上使用过一个 400TB 的 Oracle DB(Oracle 10g),只有一个实例。数据库工作负载也是主要的 INSERT,因此每天只有几个 SELECT 和数百万个 INSERT。性能远不是问题。

答案3

100TB 会给你带来一些重大挑战。它是否适合你取决于你想如何解决这些问题。

  1. 您需要足够的方法来吸收写入负载。这取决于写入负载。但只要有足够大的存储空间,就可以解决这个问题。速度在这里是一个大问题。同样,必须仔细考虑读取访问。

  2. 大多数数据库并不由一堆较小的表组成,但通常有一两个非常大的表,这些表可能占数据库大小的一半。PostgreSQL 每个表的硬限制为 32TB。此后,tid 类型将用尽页面计数器。这可以通过自定义构建 PostgreSQL 或通过表分区来处理,但这是一个需要首先解决的严峻挑战。

  3. PostgreSQL 对于各种任务可以使用的 RAM 数量有实际限制。因此,超过一定限度,拥有更多 RAM 可能会或可能不会对您有所帮助。

  4. 备份.... 这种规模的备份很有趣。据我所知,60TB 数据库必须使用 fs 快照备份,然后伪造备份以供 barman 进行 wal 归档。这些伪备份是 fs 快照备份的代理。正如我所说,“它们不是伪备份。它们是替代备份!”

有些人的数据库接近这个范​​围。我见过至少一位在荷兰银行工作的人,他拥有 60TB 的 PostgreSQL 数据库。然而,这真的取决于你的工作量,大小本身并不是问题。

相关内容