我很难找到使用pgbouncer进行事务池与会话池的优点/缺点的总结.
这是否意味着交易繁重的工作负载在某种程度上更好地负载平衡?是否要防止从pgbouncer连接到数据库需要多少连接?
我有一些基于gevent的管理命令.由于我的管理命令使成千上万的请求,我可以使用Gevent将所有套接字调用转换为非阻塞调用.这真的加快了我的应用程序,因为我可以同时提出请求.
目前我应用程序的瓶颈似乎是Postgres.这似乎是因为用于连接Django的Psycopg库是用C语言编写的,不支持异步连接.
我还读到使用pgBouncer可以将Postgres加速2倍.这听起来不错,但如果有人能解释pgBouncer如何工作和帮助会很棒吗?
谢谢
我正在运行一个多租户网站,我希望减少每个请求创建PostgreSQL连接的开销.Django的CONN_MAX_AGE允许这样做,代价是创建了许多与PostgreSQL的开放空闲连接(8个工作者*20个线程= 160个连接).每个连接10MB,这会消耗大量内存.
主要目的是减少连接时间开销.因此我的问题:
Django 1.6设置:
DATABASES['default'] = {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
....
'PORT': '6432'
'OPTIONS': {'autocommit': True,},
'CONN_MAX_AGE': 300,
}
ATOMIC_REQUESTS = False # default
Run Code Online (Sandbox Code Playgroud)
Postgres的:
max_connections = 100
Run Code Online (Sandbox Code Playgroud)
PgBouncer:
pool_mode = session # Can this be transaction?
max_client_conn = 400 # Should this match postgres max_connections?
default_pool_size = 20
reserve_pool_size = 5
Run Code Online (Sandbox Code Playgroud) 通过JDBC执行批量查询到pgbouncer时,我收到以下错误:
org.postgresql.util.PSQLException: ERROR: prepared statement "S_1" already exists
Run Code Online (Sandbox Code Playgroud)
我在网上发现了bug报告,但它们似乎都处理Postgres 8.3或更低版本,而我们正在使用Postgres 9.
这是触发错误的代码:
this.getJdbcTemplate().update("delete from xx where username = ?", username);
this.getJdbcTemplate().batchUpdate( "INSERT INTO xx(a, b, c, d, e) " +
"VALUES (?, ?, ?, ?, ?)", new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setString(1, value1);
ps.setString(2, value2);
ps.setString(3, value3);
ps.setString(4, value4);
ps.setBoolean(5, value5);
}
@Override
public int getBatchSize() {
return something();
}
});
Run Code Online (Sandbox Code Playgroud)
有人见过这个吗?
编辑1:
这被证明是在使用会话池以外的任何东西时发生的pgBouncer问题.我们使用的是事务池,显然不支持预准备语句.通过切换到会话池,我们解决了这个问题.
不幸的是,这不是我们用例的好方法.我们对pgBouncer有两个单独的用途:我们系统的一部分进行批量更新,这些更新作为预处理语句最有效,另一部分需要非常快速连续的许多连接.由于pgBouncer不允许在会话池 …
我了解到JDBC PreparedStatement和PGBouncer无法一起工作,因为PreparedStatement使用会话池并且是预编译的,PGbouncer使用事务级别池.
我的问题是可以createStatement和PGBouncer一起使用,因为它没有预编译?如果没有,有人可以指向另一个可以连接到数据库并可以使用PGbouncer的Java API吗?
我在事务模式下使用pgbouncer并尝试允许接近500个活动事务.目的只是对设置进行压力测试
当前设置:['n'客户--- --- 1 pgbouncer ----> 1 postgres]
我注意到当我使用pgbouncer而不是直接连接到postgres时,我的事务/秒(tps)显着减少.
对于同一套交易(通过pgbench)
直接连接=> 10k(tps)appx
pgbouncer connection => 3k(tps)appx
pgbouncer中是否有任何配置需要调整才能获得更好的性能?
我知道pgbouncer是一个单线程应用程序,但是想把它调整到最好.以下是我的pgbouncer配置:
pgbouncer.ini
pool_mode = transaction
server_reset_query =
# Time outs
server_lifetime=6000
server_idle_timeout=0
server_connect_timeout=30
#pool configuration
max_client_conn=10000
default_pool_size=500
pool_size=500
##other
pkt_buf=4096
server_login_retry=2
Run Code Online (Sandbox Code Playgroud)
我能看到的唯一应用是使用多个pgbouncers指向同一个数据库服务器.
UPDATE
在执行测试时:
cpu利用率:30%appx
磁盘利用率:40%appx
观察:许多交易处于"闲置"状态
测试细节:
10个机器充当客户端向DB服务器运行pgbench触发请求.
命令:pgbench -h -p 6541 -c 512 -j 16 -f pgbench_SchemaScript.sql -T 360 -U postgres test
pgbench_SchemaScript.sql
\setrandom delta 0 100000
insert into t1.emplog values(nextval('t1.employeeSeq'),:delta);
Run Code Online (Sandbox Code Playgroud)
安装了pgbouncer的1个DB服务器(16核,24 Gb RAM)
我正在使用PostgreSQL 9.1/PostGIS 1.5,psycopg2 2.4.2和pgbouncer 1.4.2运行Django 1.3.
在与数据库的每个连接上,我在pgbouncer.log中获得一个日志条目:
2011-11-20 02:15:25.027 29538 LOG S-0x96c2200:app_db/postgres@192.168.171.185:5432关闭因为:unclean server(age = 0).
我找不到任何解决这个问题的方法 - 任何人都知道为什么?我已经尝试重新配置pgbouncer(会话/事务模式,不同的超时等),但无济于事.
我需要配置我的pgbouncer用于超过2000个客户端连接的工作,我正在阅读有关如何使用最大连接的一些信息,然后我已经理解了我必须在pgbouncer上做max_client_con = 2000,但是default_pool_size,它们是什么,不仅仅是要问一些支持,以便了解在大型客户端连接上配置pgbouncer的正确方法
postgres.conf
port = 5432 # (change requires restart)
max_connections = 100 # (change requires restart)
unix_socket_directory = '/var/run/postgresql' # (change requires restart)
Run Code Online (Sandbox Code Playgroud)
pgbouncer.ini
[pgbouncer]
logfile = /var/log/postgresql/pgbouncer.log
pidfile = /var/run/postgresql/pgbouncer.pid
listen_addr = 127.0.0.1
listen_port = 6432
unix_socket_dir = /var/run/postgresql
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
admin_users = carlos
pool_mode = statement
server_reset_query = DISCARD ALL
max_client_conn = 100
default_pool_size = 20
Run Code Online (Sandbox Code Playgroud) 我们正在考虑在我们的项目中使用 pgbouncer,其中包括动态数据库创建(即添加的每个租户 - 创建一个新数据库)
据我了解,pgbouncer 采用一个映射数据库的配置文件。
问题是 - 有没有办法在不重新启动的情况下向 pgbouncer 添加新数据库?(在 config.ini 文件中添加新的 db 行)
pgbouncer ×10
postgresql ×7
django ×4
java ×2
jdbc ×2
django-1.7 ×1
pgpool ×1
psycopg2 ×1
python ×1