Django的容器编排的自动缩放部署打开了太多与数据库的连接

Django的容器编排的自动缩放部署打开了太多与数据库的连接,django,database,kubernetes,Django,Database,Kubernetes,我在Kubernetes上部署了Django。节点池配置为最多允许1000个POD来服务流量 随着POD数量的增加,我的数据库开始抛出 “对不起,客户太多了” 数据库是独立Linux机器上的PostgreSQL,位于K8之外 作为一项临时措施,我增加了数据库的max_连接。这不是我想要的答案 我试图理解为什么首先会出现这个问题,Django是否打开数据库连接并保持其打开状态?1000个pod会导致1000个到我的数据库的实时连接吗 我还试图了解处理这个问题的不同方法 我是否需要更改我的Djang

我在Kubernetes上部署了
Django
。节点池配置为最多允许1000个POD来服务流量

随着POD数量的增加,我的数据库开始抛出

“对不起,客户太多了”

数据库是独立Linux机器上的
PostgreSQL
,位于
K8
之外

作为一项临时措施,我增加了数据库的max_连接。这不是我想要的答案

我试图理解为什么首先会出现这个问题,
Django
是否打开数据库连接并保持其打开状态?1000个pod会导致1000个到我的数据库的实时连接吗

我还试图了解处理这个问题的不同方法

我是否需要更改我的
Django
config以减少连接数?还是需要更改数据库层以支持更多连接


容器编排系统上的web部署通常如何处理此问题?

我在Internet上搜索了“django数据库连接”,第一个结果是:

持久连接避免了在每个请求中重新建立到数据库的连接的开销。它们由定义连接的最大生存期的参数控制。它可以为每个数据库单独设置

默认值为
0
,保留在每个请求结束时关闭数据库连接的历史行为。要启用持久连接,请设置为正秒数。对于无限持久连接,请将其设置为
None

它还说:

每个线程都维护自己的连接

因此,如果您有p个pod,每个pod都有T个线程,那么根据在最近
CONN\u MAX\u AGE
秒内尚未完成的请求数量,您可以有多达p*T个从Django应用程序到PG数据库的打开连接

您可以研究的一件事是使用连接池,以便在线程之间共享一个连接。这也有它的折衷之处(例如),你可以通过搜索互联网了解更多信息

即使您将
CONN_MAX_AGE
设置为0(或者根本不设置它,因为0是默认值)并使用池,如果您有p个pod和大量入站流量,从而获得(至少)p个需要处理的并发请求,您的数据库将接收p个并发连接


在这种情况下,一个选项是确保您的数据库配置为接收这么多并发连接。您可以更复杂,并考虑您的大多数传入请求是否只需要对数据库的读访问;在这种情况下,您可以设置数据库的多个读取副本,并进行设置,以使来自Django应用程序的读取请求在读取副本之间保持平衡;在这种情况下,每个副本不需要支持完整的P并发最大连接。

您是否尝试在集群中放置PgBouncer

通过这种方式,您可以创建新部署并限制副本的数量,这将允许您限制连接的数量,但仍允许应用程序继续缩放

这里有一个我已经用过了:。有一个相关的Docker中心