【问题标题】:Can Google Cloud Local SSD be used for PostgreSQL Temp Tablespace?Google Cloud Local SSD 可以用于 PostgreSQL 临时表空间吗?
【发布时间】:2018-01-08 14:23:00
【问题描述】:

我们在 Google Cloud 的虚拟机中运行了一个 PostgreSQL 实例。我们运行的查询的性质涉及大量 PostgreSQL 临时表空间。 (每天 5 或 6 或更多 TB 的磁盘 I/O)

这种 I/O 仍然是我们数据库中的主要瓶颈。目前,我将这一切都发生在 SSD 永久磁盘上 - 不是因为我们需要在重启时保存任何数据,而是因为 PostgreSQL 在磁盘上布置了一个文件结构,然后用于临时表,如果数据库启动时文件结构丢失,不是很好。

我想做的是在本地 SSD 上配置临时表空间,因为它们的 I/O 吞吐量要高得多。不幸的是,它们在每次重新启动时都会消失。我想要一种简单的方法,能够在重启后和 PostgreSQL 启动备份之前重新布局磁盘。

我可以压缩空文件结构,然后编写一个脚本,在每次启动后解压缩它。那有意义吗?有没有更好的方法/最佳实践来做到这一点?

如果有一个 PostgreSQL 扩展可以神奇地做到这一点,那就太棒了。

想法?

【问题讨论】:

  • 我们在 GCE 上的本地 SSD 上运行整个 PG 数据库大约 1 年。速度很棒。但后来突然其中一张表损坏了,我们没有找到任何解释。谷歌解释说本地 SSD 没有任何纠错功能。网络上的一些 cmets 似乎暗示其他人也有这个问题。因此,本地 SSD 确实很快,但在较长时间内并非 100% 可靠......
  • 但这对临时空间有影响吗?
  • 您是否在每次重新启动时都考虑过exporting the structure,而不是在适合您的情况下进行 tar 升级?
  • @nezda 我们有热备用副本,但仅在持久 SSD 上。我们的本地 SSD 数据库旨在进行繁重的夜间计算 - 以获得更好的速度。除此之外,我们还使用永久性磁盘维护了另一个相同的数据库。在本地 SSD 上出现文件一致性问题后,我们开始使用 Bigquery - 价格相似,运行时间要好得多。
  • 我们遇到了 SSD 驱动器的驱动程序问题,这些问题会导致数据库在高负载下无法恢复的随机错误。为了稳定性,我们不得不退出高性能易失性驱动器配置并返回到持久性驱动器。我不建议再这样做了,除非您不介意数据库偶尔锁定。

标签: postgresql google-cloud-platform google-compute-engine


【解决方案1】:

我对之前的测试进行了一些研究,以下是一些总结:

PostgreSQL 表空间只是一个目录——没什么大不了的。另外 - 如果您将其仅用作临时表空间,则关闭数据库时将不会留下持久文件。

您可以在您想要的任何位置为临时表创建表空间,然后转到该位置并检查目录结构以查看 PG 创建的内容。但是你必须在 OS 下进行,因为 PG 只会显示表空间主目录 - psql 中的 \db+ 或 select oid, spcname, pg_tablespace_location(oid) from pg_tablespace; 的工作方式相同。

我的例子:

  • (我使用 /tempspace/pgtemp 作为假定的安装点)CREATE TABLESPACE p_temp OWNER xxxxxx LOCATION '/tempspace/pgtemp'; 在我的案例结构中创建 /tempspace/pgtemp/PG_10_201707211
  • 我在 postgresql.conf 中设置了temp_tablespaces = 'pg_temp' 并重新加载了配置。
  • 当我使用create temp table .... 时,PG 添加了另一个子目录 - /tempspace/pgtemp/PG_10_201707211/16393 = oid of schema - 但这对于临时表空间无关紧要,因为如果缺少该子目录,PG 将创建它。
  • 在这个子目录文件中为临时表创建了 PG。
  • 当我关闭此会话时,临时表的文件不见了。

现在我停止了 PG 并测试了如果目录丢失会发生什么:

  • 我删除了PG_10_201707211 及其子目录
  • 已启动 PG 并且日志显示消息 LOG: could not open tablespace directory "pg_tblspc/166827/PG_10_201707211": No such file or directory 但 PG 已启动
  • 我尝试创建临时表 - 我收到错误消息 ERROR: could not create directory "pg_tblspc/166827/PG_10_201707211/16393": No such file or directory SQL state: 58P01
  • 现在(在运行 PG 的情况下)我在 OS 中发出了这些命令:
    • sudo mkdir -p /tempspace/pgtemp/PG_10_201707211
    • sudo chown postgres:postgres -R /tempspace/pgtemp
    • sudo chmod 700 -R /tempspace/pgtemp
  • 我尝试再次创建临时表并插入和选择值,一切正常

所以结论是 - 由于 PG 表空间不是“大魔法”只是目录,您可以简单地创建在 linux 启动时运行的 bash 脚本,该脚本将检查(并在必要时挂载)本地 SSD 并为 PG 临时表空间创建必要的目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2017-01-26
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多