【问题标题】:PostgreSQL Connection Pooling in a Nodejs ClusterNodejs 集群中的 PostgreSQL 连接池
【发布时间】:2019-11-11 15:46:26
【问题描述】:

问题

您有多个节点进程在某个集群中运行,每个核心一个,但您的集群有多个虚拟机,因此有很多进程正在运行。每个进程都是独立的,您正在对它们进行负载平衡,因此它们的平均工作负载相似。

您正在运行 postgres,并且希望充分利用连接池,否则建立连接的成本非常高。

  1. 您要确保不会因连接过多而使 postgres 过载。
  2. 您希望确保集群即使在低负载时间也具有高可用性(即,您不希望客户在使用该服务之前非常空闲的情况下导致连接建立缓慢)。

建议的解决方案

  1. 使用每个节点的 pod 连接池:node-pg-pool 或 sidecar PGBouncer 设置(如果您使用的是 docker 或 k8s 或类似的东西)。
  2. 使用集群中所有节点进程都连接到的连接池服务。

是否可以在整个集群中始终保持多个连接处于空闲状态以确保高可用性?是否有任何细节需要牢记以使该解决方案有效扩展?

【问题讨论】:

  • 每个虚拟机都有自己的应用服务器和数据库服务器,还是所有虚拟机都指向一个数据库?
  • "(即,如果服务的使用以前非常空闲,您不希望客户导致连接建立缓慢”这真的是一个问题吗?它增加了多少延迟?在我的手动连接大约需要 0.01 秒。如果你每小时这样做一次,那真的很重要吗?
  • 所有虚拟机都指向一个数据库。我们在尝试连接时看到了巨大的延迟差异(比如在页面加载时有几个查询执行,比如 1s 加载差异,我们之前在本地池化连接),尽管对于这个问题我没有花足够的时间问为什么(我的最初的想法可能是带节点的 DNS)。
  • 显然 Azure 的连接性能糟糕stackoverflow.com/questions/57094912/…
  • 如果是 DNS 问题,那么这似乎排除了选项 2,因为它会遇到同样的问题,不是吗?我过去所做的只是让 cron 作业每分钟运行一次 DNS 查找,以保持 DNS 缓存温暖或任何问题。 (最好解决根本问题,但那是别人的工作,他们没有完成)

标签: node.js postgresql


【解决方案1】:

始终保持几十个真正空闲的(不是“事务中的空闲”)连接应该不是问题。几百个会更令人担忧。

如果空闲连接被某个网关或防火墙切断,则可能会出现问题,然后当应用程序检查连接时,池会对其进行测试,发现它无效,并且无论如何都需要打开一个新连接.因此,如果您可以将池化器配置为定期测试空闲连接(我不知道 node-pg-pool 是否/如何做到这一点),那可能是个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多