使用 BBU 存储通过 iSCSI 在 Postgres 上异步提交

2 postgresql

我的理解是,synchronous_commit如果您的服务器具有本地电池备份存储控制器,则可以关闭。

在我的环境中,我在一个块存储通过 iSCSI 连接的 VM 上,其中 iSCSI 节点使用 DRBD,并且主节点和辅助节点都有电池备份控制器。

FWIW,具体如下:

  • PostgreSQL 9.3
  • CentOS 6.3 (虚拟机)
  • 虚拟机 5.1
  • Infiniband QDR 传输
  • SLES 11 个 iSCSI 节点
  • DRBD
  • 带有 CacheCade Pro 2.0(使用中)的 LSI BBU SCSI 控制器。

我可以安全关闭synchronous_commit吗?

Cra*_*ger 6

我的理解是,如果您的服务器具有本地电池备份存储控制器,则关闭 synchronous_commit 是可以的。

实际上,这有点倒退。打开synchronous_commit关闭是不安全的,无论是什么,因为它允许数据库丢失最近提交的事务,如果它崩溃。无论是否使用 BBU 或防碰撞 SSD 存储,都是如此。

是什么synchronous_commit = off做的是让你当你在存储在那里,所以你想批量他们,并希望避免客户等待时间,而应用程序等待冲洗冲洗价格昂贵耐久性交易速度。它对刷新速度较快的存储的影响要小得多,因为您等待提交发生的时间更少 - 所以它几乎都是缺点并且几乎没有好处。

在一般情况下,你应该设置synchronous_commit全局关闭。正如文档所建议的那样,您应该SET LOCAL synchronous_commit = off在不需要持久的特定事务中,否则将其启用。这样,您可能会丢失您不太关心的交易,但不会丢失那些正在进行重要更改的交易。

如果您根本无法承受客户认为已提交的事务的潜在损失,您可能需要考虑 a commit_delay,它会在刷新之前暂停以尝试将几个提交批处理在一起。这可以提高 I/O 子系统的吞吐量,刷新速度非常慢,而不会牺牲持久性。

您可能还需要考虑将UNLOGGED表用于在崩溃中可以承受的特定表。如果 Pg 在表变脏时崩溃,它将截断它,您必须重新填充它,但不会有更广泛的数据库损坏。

如果有人告诉你fsync关闭 - 请不要。它应该被称为eat_my_data = on,并且完全不适合任何东西,除了可以在崩溃后轻松重建该批次的一次性实例。