我已经在Kubernetes上部署了Kubernetes。节点池被配置为允许最多1000个豆荚来服务流量。
随着荚数的增加,我的数据库开始抛出
“对不起,客户太多了”。
数据库是PostgreSQL,在K8之外--在一个独立的Linux机器上。
作为临时措施,我增加了我的数据库的max_connections。这不是我要找的答案。
我试图理解为什么这个问题出现在第一位-- Django打开数据库连接并保持打开吗?1000个豆荚会导致1000个与我的数据库的实时连接吗?
我还试图了解处理这一问题的不同方法。
我是否需要用我的Django配置来改变一些东西来减少连接的数量?还是需要更改数据库层以支持更多的连接?
容器编排系统上的web部署通常是如何处理这个问题的?
发布于 2019-08-01 08:01:31
我在网上搜索了"django数据库连接“,第一个结果是此页,它说:
持久连接避免了在每个请求中重新建立到数据库的连接的开销。它们由
CONN_MAX_AGE参数控制,该参数定义连接的最大生存期。它可以为每个数据库独立设置。 默认值为0,保留在每个请求结束时关闭数据库连接的历史行为。若要启用持久连接,请将CONN_MAX_AGE设置为正秒数。对于无限持久连接,请将其设置为None。
它还说:
每个线程都维护自己的连接。
因此,如果您有每个有T线程的P荚,那么您可以根据在最后一个CONN_MAX_AGE秒内尚未完成的请求数量,从Django应用程序到PG数据库的P*T打开连接。
您可以研究的一件事是使用连接池,以便在线程之间共享一个连接。这也有它的权衡(如这),你可以搜索互联网了解更多。
即使您将CONN_MAX_AGE设置为0(或者根本不设置它,因为0是默认的)并使用池,如果您有P荚和大量入站通信量,以便您得到(至少)需要处理的P并发请求,数据库也会接收P并发连接。
在这种情况下,一种选择就是确保您的DB被配置为接收那么多并发连接。您可以变得更加复杂,并考虑大多数传入请求是否只需要对DB的读访问;在这种情况下,您可以设置数据库的多个读取副本,并设置这样的设置,以便从Django应用程序读取的请求在读取副本之间得到平衡;在这种情况下,每个副本不需要支持完整的P并发最大连接。
发布于 2019-08-01 10:11:05
您尝试过在集群中添加PgBouncer吗?
这样您就可以创建一个新的部署并限制副本的数量,这将允许您限制连接的数量,但仍然允许应用程序继续运行。
这里有一个我已经使用过的:https://github.com/edoburu/docker-pgbouncer。有一个码头枢纽关联。
https://stackoverflow.com/questions/57303585
复制相似问题