如果 Kubernetes 中的主容器发生故障,则将流量转发到冗余容器

如果 Kubernetes 中的主容器发生故障,则将流量转发到冗余容器

我有一个带有后端服务(BS)和数据库服务(DS)的 k8 集群。

DS 有一个包含单个 PgBouncer 容器(Postgres 服务器的代理)的 pod。BS 将其数据库请求发送到 DS,然后 DS 再路由回这个单个 pod。

我希望在 DS 内部有一个冗余 Pod,以便在主 Pod 发生故障时路由数据库请求。除非主 Pod 发生故障,否则我不想将请求路由到这个冗余 Pod。我尝试这样设计的原因是为了确保在发生故障时停机时间更短。

这可能吗?您能指导我如何做到这一点吗?可以提供一些参考吗?

先感谢您!

答案1

由于我没有足够的关于所使用的架构的信息,并且它仅基于一个非常描述性的示例 - 我正在上传从研究中获得的信息,以允许社区成员完成/扩展这个答案。

基于本文档PgBouncer 没有内部多主机配置。要在多个服务器之间实现查询负载平衡,可以使用外部工具,例如:

  1. DNS 循环。在一个 DNS 名称后面使用多个 IP。每次启动新连接时,PgBouncer 不会查找 DNS。相反,它会缓存所有 IP 并在内部进行循环。注意:如果一个名称后面有超过 8 个 IP,DNS 后端必须支持 EDNS0 协议。有关详细信息,请参阅 README。

  2. 用一个TCP 连接负载均衡器。 任何一个 低压开关柜 或者 HAProxy 似乎是不错的选择。在 PgBouncer 方面,最好将其设置得 server_lifetime 小一些,并开启 server_round_robin :默认情况下,空闲连接由 LIFO 算法重用,当需要负载平衡时,该算法可能效果不佳。

本博客解释了为什么要使用 pgBouncer 的另一种负载均衡器机制。根据该机制,您不应该使用 pgBouncer 代替 HAProxy 或其他负载均衡器。很明显,pgBouncer 有几个可配置的功能来解决负载均衡器所解决的问题 - 但最常见的是生产环境使用 HAProxy 或其他负载均衡器来实现 HA。原因是 HAProxy 比 pgbouncer 更好地平衡了实时服务器之间的工作负载。

尽管 pgbouncer 更适合 postgres 连接池,但最好使用一个可以完美执行一项任务的小型守护进程,而不是使用一个可以执行两项任务但效果更差的大型守护进程。

使用 PgPool 也是一个好主意。另请参阅这个答案

这里还有比较 PgBouncer 和 PgPool 的文章。其中一小部分:| | PGBOUNCER | PGPOOL-II | |--|--|--| |高可用性|不支持。|PostgreSQL 高可用性 通过 Pgpool-II 内置观察进程支持。 优胜者!| |负载均衡|不支持 - PgBouncer 建议使用 HAProxy 实现高可用性和负载平衡。| 支持自动负载平衡 - 甚至足够智能,可以将读取请求重定向到备用服务器,并写入主服务器。 优胜者!|

相关内容