使用pgbouncer

时间:2016-10-25 20:17:32

标签: django postgresql pgbouncer

我有一个带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',
        }

2 个答案:

答案 0 :(得分:7)

来自docs

  

pgbouncer 是一个PostgreSQL连接池。任何目标应用   可以连接到pgbouncer,好像它是一个PostgreSQL服务器,并且   pgbouncer将创建与实际服务器的连接,否则它将   重用其中一个现有连接。

另外,

  

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

配置

<强> 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 = 200
default_pool_size = 300

<强> 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在本地运行,或者运行服务器pgbouncer的IP,则可以设置HOST:'127.0.0.1'或'localhost'。 来自docs

  

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

对于postgreSQL For ENGINE,你可以使用postgresqlpostgresql_psycopg2 - 给出你的Django版本 - postgresql_psycopg2 vs posgresql两者之间存在差异。

答案 1 :(得分:1)

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