只读查询的 Postgresql 冗余,按需刷新
Postgresql redundancy for read-only queries with refresh on demand
我想知道是否有任何 postgresql 工具可以促进按需复制到只读服务器。问题描述如下:
每个数据更改过程都是 运行 多个事务(过程很复杂 - 例如,加载数据,运行 计算,运行 更多数据, ETC。)。在流程完成之前,我认为数据库 不一致 用于报告。
报告应仅使用一致数据,但不应等待数据更改过程完成 - 它们应使用旧的(一致) 数据。
理想情况下,报告应该 运行 在数据库的 一致 快照上。
解决这个问题的思路如下:
- 有两台服务器 - 主服务器和从服务器。最初两者具有完全相同的数据。
- 所有数据更改进程将 运行 在 master
上
- 所有报告任务将 运行 在从
- 一旦数据更改过程完成,就会触发slave的刷新。触发器例如:运行 一些命令,在文件系统上创建文件等。不允许读取部分刷新的从站。
- 这不能花太长时间 - 应该与 master 上的更改大小成比例
从站不会用于故障转移,这不是目的。
这个问题有什么好的解决办法吗?或者可以用不同的方式解决?
看起来有一个很好的解决方案。 Postgres >= 9.2 可以导出当前事务的快照 ID。每个使用相同快照 ID 的事务在开始时都会看到相同的数据。
在我的例子中,我可以创建一个 "dummy" 交易并导出它的快照。虚拟事务不会做任何事情,它会在流程开始时开始,并在流程结束时结束。所有报告都将使用此快照 ID 来报告在创建虚拟交易时可见的数据。
更多关于快照的信息:https://www.willglynn.com/2013/10/25/postgresql-snapshot-export/
我想知道是否有任何 postgresql 工具可以促进按需复制到只读服务器。问题描述如下:
每个数据更改过程都是 运行 多个事务(过程很复杂 - 例如,加载数据,运行 计算,运行 更多数据, ETC。)。在流程完成之前,我认为数据库 不一致 用于报告。
报告应仅使用一致数据,但不应等待数据更改过程完成 - 它们应使用旧的(一致) 数据。
理想情况下,报告应该 运行 在数据库的 一致 快照上。 解决这个问题的思路如下:
- 有两台服务器 - 主服务器和从服务器。最初两者具有完全相同的数据。
- 所有数据更改进程将 运行 在 master 上
- 所有报告任务将 运行 在从
- 一旦数据更改过程完成,就会触发slave的刷新。触发器例如:运行 一些命令,在文件系统上创建文件等。不允许读取部分刷新的从站。
- 这不能花太长时间 - 应该与 master 上的更改大小成比例
从站不会用于故障转移,这不是目的。
这个问题有什么好的解决办法吗?或者可以用不同的方式解决?
看起来有一个很好的解决方案。 Postgres >= 9.2 可以导出当前事务的快照 ID。每个使用相同快照 ID 的事务在开始时都会看到相同的数据。
在我的例子中,我可以创建一个 "dummy" 交易并导出它的快照。虚拟事务不会做任何事情,它会在流程开始时开始,并在流程结束时结束。所有报告都将使用此快照 ID 来报告在创建虚拟交易时可见的数据。
更多关于快照的信息:https://www.willglynn.com/2013/10/25/postgresql-snapshot-export/