Сте*_*лић 6 postgresql replication pgpool
如果我们比较多种类型的复制(单领导者、多领导者或无领导者),单领导者复制有可能是线性化的。在我的理解中,线性化意味着一旦写入完成,所有后续读取都应返回该值或后续写入的值。或者说,只有一个数据库应该有印象,但没有更多。所以我想,没有陈旧的阅读。
PostgreSQL 在其流复制中,能够使用 使其所有副本同步synchronous_standby_names,并且还能够使用该synchronous_commit选项进行微调,可以将其设置为remote_apply,因此领导者会等待,直到事务在备用数据库上重播(使其对查询可见)。在文档中,在讨论 remote_apply 选项的段落中,它指出这允许在简单情况下实现负载平衡并具有因果一致性。
前几页,它是这么说的:
,,一些解决方案是同步的,这意味着在所有服务器都提交了数据修改事务之前,该事务不会被视为已提交。这保证了故障转移不会丢失任何数据,并且无论查询哪个服务器,所有负载平衡的服务器都将返回一致的结果,
因此,我很难理解如果我们将读取查询负载平衡到只读副本,可以保证什么,以及会发生什么异常情况。还会有陈旧的读吗?当我查询不同的副本以获得不同的结果时,即使在领导者上发生后没有写入,也会发生这种情况吗?我的印象是肯定的,但我不太确定。如果不是,PostgreSQL 如何防止过时读取?我没有找到任何关于它如何在引擎盖下完全工作的更多细节。它是否使用两阶段提交或对其进行某种修改,或者使用其他算法来防止过时读取?
如果它不提供无陈旧读取的选项,有没有办法实现这一点?我看到,PgPool 必须选择对落后于不超过定义阈值的副本进行负载平衡,但我不明白是否可以将其定义为对与领导者一致的副本进行负载平衡。
我真的很困惑如何真正理解 PostgreSQL 中的完全同步复制是否会发生异常。
我知道这样的设置存在可用性问题,但现在这不是问题。
如果您使用同步复制synchronous_commit = remote_apply,则可以确定一旦提交修改事务,您就会在备用数据库上看到修改后的数据。
同步复制不使用两阶段提交,主服务器先在本地提交,然后简单地等待同步备服务器的反馈才COMMIT返回。因此,以下情况是可能的:
COMMIT在返回之前以及数据传播到备用数据库之前,观察者将看到主数据库上修改的数据。
COMMIT在主数据库返回之前,观察者将看到备用数据库上修改的数据。
如果提交事务在返回前的适当时刻在主服务器上被中断COMMIT,则该事务将仅在主服务器上提交。从服务器上发生提交的时间到向客户端报告的时间之间始终存在一定的时间窗口,但随着流式复制,该窗口会大大增加。
但最终,数据修改总是会到达备用数据库。
| 归档时间: |
|
| 查看次数: |
3049 次 |
| 最近记录: |