10

我有一个带有 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"

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

一个建议似乎是pgbouncersettings.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',
        }
4

2 回答 2

14

文档

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

还,

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


配置

pgbouncer.ini : 一个例子pgbouncer.ini带有关于默认值的注释

[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

用户列表.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 在本地运行,或者服务器 pgbouncer 的 IP 将在其上运行,您可以设置 HOST : '127.0.0.1' 或 'localhost'。从文档

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


在 postgreSQL 的情况下,ENGINE您可以使用postgresqlor postgresql_psycopg2- 给定您的 Django 版本 - postgresql_psycopg2 与 posgresql两者之间存在差异。

于 2016-10-26T19:08:19.957 回答
1

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

于 2016-10-26T18:46:50.310 回答