【问题标题】:Django settings when using pgbouncer使用 pgbouncer 时的 Django 设置
【发布时间】:2017-03-08 00:49:15
【问题描述】:

我有一个带有 Postgresql 后端的 Django 网站,为此我使用 pgbouncer 进行数据库连接池(事务模式)。

应用程序和数据库位于不同的服务器上(每台服务器 1 台)。我已经在应用服务器上安装了pgbouncer。我的问题是:settings.py 中的配置应该是什么?请注意,我使用 Unix 套接字 连接到 pgbouncer。


我当前的settings.py 包含:

DATABASE_URL = 'postgres://user1:pass1@xx.xxx.xxx.xxx:5432/db1'
DATABASES = {
'default': dj_database_url.config(default=DATABASE_URL)
}

pgbouncer.ini的相关部分是:

[databases]
db1 = host=xx.xxx.xxx.xxx port=5432 dbname=db1

listen_addr = *
listen_port = 6432
auth_type = md5
unix_socket_dir = /var/run/postgresql
pool_mode = transaction
max_client_conn = 200
default_pool_size = 300

userlist.txt 包含:

"user1" "pass1"

注意:一个答案is here,但对我不起作用,因为数据库在我的情况下在本地不可用。我需要设置 DATABASE_URL 环境变量,而不是使用default = '...'

一个建议似乎是将pgbouncer 视为settings.py 中的数据库。在那种情况下,类似以下的工作吗?

if PRODUCTION == '1':
    #PRODUCTION is set to '1' if in production environment
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'pgbouncer',
            'USER': 'user1',
            'PASSWORD': 'pass1',
            'HOST': '/var/run/postgresql',
            'PORT': '6432',
        }

【问题讨论】:

  • 您的问题不清楚。您在将 pgbouncer 连接到 postgresql 或将 django 连接到 pgbouncer 时遇到问题吗?如果是后者,你只要把 pgbouncer 当作一个数据库就好了
  • @e4c5:嘿,你好吗?具体来说,我应该如何连接到settings.py 中的pgbouncer?我在问题中添加了一个 sn-p 代码来说明我认为应该如何完成。你能帮忙改正吗? :-)
  • 你的引擎不应该是 psycopg2 还是 postgis 而不是 o
  • @e4c5:已更正。现在就来看看吧。

标签: django postgresql pgbouncer


【解决方案1】:

settings.py 中的所有数据库设置都应该与 pgbouncer 配置中的设置相同,除了 settings.py 中的主机将指向 pgbouncer。您可能需要将'NAME': 'pgbouncer' 更改为'NAME': 'db1'。由于您使用的是 unix 套接字,因此端口无关紧要。

【讨论】:

  • 感谢您的加入。两点澄清:1) NAME 不应包含 pgbouncer 数据库的名称(即 pgbouncer)。不是在settings.py中连接pgbouncerdb的想法,剩下的交给pgbouncer自己来做? 2)我认为在我们之前的讨论中,共识是不使用unix套接字,因为pgbouncer安装在应用服务器上,而DB服务器是独立的?
  • 您说 pgbouncer 在您的应用服务器上,因此 Django 可以使用 unix 套接字连接到它。 pgbouncer 只是不能使用 unix 套接字连接到您的远程 PG 实例。 HOST 告诉 Django 在哪里进行网络连接(pgbouncer),NAME 告诉它连接到哪个数据库。设置 'NAME': 'pgbouncer' 将导致 pgbouncer 尝试将查询转发到上游 PG 实例并连接到该实例上名为 pgbouncer 的数据库,这可能不是您想要的。
  • pgbouncer.inisettings.py 中配置不同的dbname 是可能的,但我不建议这样做,不要让事情变得更加混乱。
  • 嗯,当我尝试这些设置时,应用程序无法运行。我看不到任何错误,即使是debug = true/var/log/postgresql/pgbouncer.log 也没有任何错误。尝试了unix socket和localhost。关于从哪里开始调试有什么建议吗?
  • “不起作用”是什么意思?身份验证失败了吗?连接超时了吗?它会永远挂起吗?
【解决方案2】:

来自docs

pgbouncer 是一个 PostgreSQL 连接池。任何目标应用程序 可以像 PostgreSQL 服务器一样连接到 pgbouncer,并且 pgbouncer 将创建一个到实际服务器的连接,或者它会 重用其现有连接之一。

还有,

让您的应用程序(或 psql 客户端)连接到 pgbouncer 而不是直接到 PostgreSQL 服务器。


配置

pgbouncer.inipgbouncer.ini 的示例,其中包含有关默认值的 cmets

[databases]
db1 = host=xx.xxx.xxx.xxx port=5432 dbname=db1

[pgbouncer]
listen_addr = *
listen_port = 6432
auth_type = md5
auth_file = userlist.txt
unix_socket_dir = /var/run/postgresql
pool_mode = transaction
max_client_conn = 100
default_pool_size = 20

userlist.txt

"user1" "pass1"

放入settings.py

if PRODUCTION == '1':
    #PRODUCTION is set to '1' if in production environment
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'db1',
            'USER': 'user1',
            'PASSWORD': 'pass1',
            'HOST': '/var/run/postgresql',
            # 'PORT': '6432',
        }

额外

如果不使用 unix 套接字 - 如果 pgbouncer 在本地运行,您可以设置 HOST : '127.0.0.1' 或 'localhost',或者任何服务器 pgbouncer 的 IP 将在其上运行。 来自docs

如果您使用的是 PostgreSQL,默认情况下(空主机),连接到 数据库是通过 UNIX 域套接字完成的(在 pg_hba.conf)。如果您的 UNIX 域套接字不在标准中 位置,使用相同的 unix_socket_directory 值 postgresql.conf。如果要通过 TCP 套接字连接,请设置 HOST 到“localhost”或“127.0.0.1”(pg_hba.conf 中的“host”行)。在 Windows,您应该始终定义 HOST,因为 UNIX 域套接字不是 可用。


对于 ENGINE 的 postgreSQL,您可以使用 postgresqlpostgresql_psycopg2 - 鉴于您的 Django 版本,两者之间存在差异 - postgresql_psycopg2 vs posgresql

【讨论】:

  • 这个答案又救了我这么久。我在 settings.py 中包含了'PORT': '6432',我按照这个答案删除了它,瞧!你能解释一下你为什么评论这条线吗?有什么意义?
  • default_pool_size 应该肯定低于 pgbouncer.ini 中的 max_client_conn。您的 default_pool_size 是从 pgbouncer 到您的数据库的连接数量(每个用户。大多数设置只有一个)。 postgresql 数据库的默认最大连接数为 100。您需要保留其中一些连接以供管理员访问等,因此 default_pool_size 应该最大为 95。但最好将其设置为 20 甚至更少,并让 pgbouncer 处理池。跨度>
  • 感谢 Christoffer 指出这一点,我已根据默认值更新了值。
猜你喜欢
  • 1970-01-01
  • 2014-01-14
  • 2021-11-27
  • 2023-01-24
  • 2021-11-23
  • 2018-12-16
  • 1970-01-01
  • 2013-05-06
  • 2012-05-12
相关资源
最近更新 更多