我想将CNPG操作符集成到我的k8s集群中,但有几个问题,我试图在网上找到答案,但不能,所以决定在这里问他们。
我的团队需要具有自动故障转移的HA Postgres集群,因为CNPG可以提供。但是,此外,开发人员团队需要一些一致性保证:在写入之后读取。这意味着,当一些写请求的响应返回时,所有接下来的读取都必须看到这个写(或稍后的一个)。当PG以单示例方式运行时,它是有保证的。在主副本模式下运行时,可以通过remote_apply
和synchronous_standby_names
设置来保证。但是如果我选择使用synchronous_standby_names
设置中的所有名称,集群将失去其HA状态,因为单个Pod失败将导致拒绝整个系统的写查询。
因此,Postgres配置允许,CNPG配置允许使用仲裁复制用于以下目的:我们可以只等待N个副本中的K个来应答主副本。但是,问题是:我们是否可以像CNPG一样,在备用副本上对读取查询进行负载平衡?CNPG创建了3个k8s服务(-rw用于读取和写入,导致主服务器,-ro用于只读,导致副本服务器,-r用于读取,导致副本服务器和主服务器,因为它们都可以处理读取)。
那么,如果服务将我的查询发送到副本,而副本不在上一次写入的仲裁中,该怎么办?有没有可能,或者CNPG做了一些事情来避免这种行为,我的应用程序可以使用-r
或-ro
服务将所有副本用于读取?或者连接池可以平衡对正确副本的查询?(我在网上查了一下,但没查到)
我需要回答这些问题来选择在我们的平台中构建的架构。如果你对我的情况有什么建议,会很乐意听你的!
试图在web上或文档中找到这些信息,但所有的链接都在谈论同步提交的工作,而不需要关于quorum角落案例的信息。
1条答案
按热度按时间yftpprvb1#
需要说明的是,这通常与Postgres有关,而不是CloudNativePG。
请注意,Postgres中的同步提交可以在事务级别更改,这可能会使您的假设无效。无论如何,假设您对所有事务的“remote_apply”感兴趣。您正在考虑的是,操作员需要根据集群中属于仲裁和主集群的示例对重做日志的实际应用,不断更新服务。这将是过于侵入性和昂贵的。
但是,我建议您研究一下CloudNativePG如何实现同步复制支持。文档中定义的公式如下:
这意味着如果一个示例不健康,它会被CloudNativePG自动从仲裁中排除--因为它优先考虑自我修复(目前我们没有一个旋钮来转换当前的同步“偏好”与实际需求,但如果需要的话,它可以很容易地实现)。
由于这种自我修复机制,我相信您可以使用“-r”服务随机指向集群中的任何可用示例,并为您的读取操作提供一致的视图。
我从来没有尝试过,但理论上应该是可行的。有消息通知我们。