我有一个带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',
}
答案 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
,你可以使用postgresql
或postgresql_psycopg2
- 给出你的Django版本 - postgresql_psycopg2 vs posgresql两者之间存在差异。
答案 1 :(得分:1)
settings.py中的所有数据库设置应与pgbouncer配置中的设置相同,但settings.py中的主机将指向pgbouncer。您可能需要将'NAME': 'pgbouncer'
更改为'NAME': 'db1'
。由于您使用的是unix套接字,因此端口无关紧要。