我有多个用于 Web 应用程序的 PostgreSQL 服务器。通常在热备模式(异步流复制)下一个主多从。
我使用 PGBouncer 进行连接池:安装在每个 PG 服务器(端口 6432)上的一个实例连接到本地主机上的数据库。我使用事务池模式。
为了在从站上平衡我的只读连接,我使用 HAProxy (v1.5) 和 conf 或多或少像这样:
listen pgsql_pool 0.0.0.0:10001
mode tcp
option pgsql-check user ha
balance roundrobin
server master 10.0.0.1:6432 check backup
server slave1 10.0.0.2:6432 check
server slave2 10.0.0.3:6432 check
server slave3 10.0.0.4:6432 check
Run Code Online (Sandbox Code Playgroud)
因此,我的 Web 应用程序连接到 haproxy(端口 10001),即在每个 PG 从站上配置的多个 pgbouncer 上的负载平衡连接。
这是我当前架构的表示图:
这很有效,但我意识到有些人的实现方式完全不同:Web 应用程序连接到单个 PGBouncer 实例,该实例连接到 HAproxy,它在多个 PG 服务器上进行负载平衡:
最好的方法是什么?第一个(我现在的)还是第二个?一种解决方案相对于另一种解决方案有什么优势吗?
谢谢
postgresql scalability high-availability pgbouncer load-balancing
我在繁忙的 postgres 9 数据库前运行 pgBouncer。在大多数情况下,它运行良好。但是每隔几个小时我就会收到一封来自我的应用程序的错误电子邮件,但 psycopg2 除外:
OperationalError('无法连接到服务器:无法分配请求的地址服务器是否在主机“neo-hulk”上运行并接受端口 6432 上的 TCP/IP 连接?')
这是一个 python 应用程序,其中有一堆 celery 工人正在运行任务。当这些错误到达时,我检查 pgbouncer db 并且池大小在限制范围内。经过一些实验,我将池最大大小设置为 400,池大小设置为 200。池模式是“会话”(请求主要是自动提交,几乎没有事务)。
是什么让 pgBouncer 像那样“消失”?它只是在很短的时间内(总的来说,与它处理的大量请求相比,我们谈论的是极少量的请求),但那些失败的请求很重要。
谢谢!
由于在这种模式下 pgbouncer 为每个入站连接创建出站连接,因此在我看来 pgbouncer 不能作为池化器工作。这只是1对1的映射。
我哪里错了?
我正在尝试配置最新的 pgbouncer 以与 postgres 9 一起使用。我可以使用psql
正确的密码连接到我的数据库,但是当我使用时,psql -p 6432
我无法连接,错误消息为psql: ERROR: auth failed
这似乎可能是由我的 userlist.txt 文件引起的,但我不确定。我检查过,所有必需的文件均由 Postgres 系统用户完全拥有
pgbouncer.ini
[databases]
postgres = host=localhost port=5433 auth_user=postgres dbname=postgres
[pgbouncer]
pidfile = /usr/local/pgbouncer-1.9.0/pgbouncer.pid
logfile = /usr/local/pgbouncer-1.9.0/log/pgbouncer.log
user = postgres
listen_addr = *
listen_port = 6432
auth_type = md5
auth_file = /usr/local/pgbouncer-1.9.0/etc/userlist.txt
Run Code Online (Sandbox Code Playgroud)
用户列表.txt
"postgres" "md5<MD5 SUM>"
用于启动 pgbouncer 的命令
./bin/pgbouncer -d etc/pgbouncer.ini
日志输出显示失败
2019-08-20 13:46:01.080 16446 LOG C-0x1028ce0: postgres/postgres@127.0.0.1:43286 login attempt: db=postgres user=postgres tls=no
2019-08-20 13:46:01.080 16446 LOG C-0x1028ce0: postgres/postgres@127.0.0.1:43286 closing …
Run Code Online (Sandbox Code Playgroud) 我有 Postgres 9.2 和 PgBouncer('stack builder' 附带的版本)。我有一个通过 Npgsql 2.0.12 版在 win7 机器上连接的 .net 应用程序。
我的应用程序可以直接连接到 postgres 服务器,但总是无法通过 pgbouncer 连接。
我到 npgsql 的连接字符串(经过一些替换)
Sslmode=Prefer;Timeout=40;Server={0};Port={3};User Id={4};Password={1};Database={2};Pooling=False;
Run Code Online (Sandbox Code Playgroud)
(我也尝试过使用 Protocol=3 显式连接到 PgBounce,但没有奏效。)
pgBounce ini 的数据库行是:
[databases]
something = host=localhost port=5433 dbname=somethingelse user=someone password=aaa
Run Code Online (Sandbox Code Playgroud)
在 userlist.txt 中,我根据需要有“某人”“aaa”。
当我的应用程序运行时,npgsql 显示“连接被强制关闭”并且 pgbouncer 错误日志显示:
2013-02-06 20:16:57.594 2444 LOG File descriptor limit: -1 (H:-1), max_client_conn: 1000, max fds possible: 1030
2013-02-06 20:16:57.649 2444 LOG listening on ::/6433
2013-02-06 20:16:57.657 2444 LOG listening on 0.0.0.0:6433
2013-02-06 20:16:57.659 2444 LOG process …
Run Code Online (Sandbox Code Playgroud) 如果我设置了一个包含多个数据库条目的 pgbouncer.ini 配置文件,pgBouncer 是否会为每个条目创建一个单独的池?我会这么认为,但无法证实这一点。
例如,有这样的事情:
[数据库] db1 = ... db2 = ... [pgbouncer] . . . max_client_conn = 480 default_pool_size = 250
每个数据库的默认池为 250 个,最大为 480 个,还是总共250 个默认和最大 480 个连接在两者之间共享?
非常感谢!
所以我有这个 pgbouncer 配置:
[databases]
my_db = host=10.10.10.10
my_db_with_conn_limit = host=10.10.10.10 dbname=my_db pool_size=55
max_client_conn = 300
default_pool_size = 65
reserve_pool_size = 5
reserve_pool_timeout = 1
Run Code Online (Sandbox Code Playgroud)
目标是限制来自特定应用程序的连接数 - 当数据库名称为 database_with_conn_limit 时,只允许 55 个连接。
基本上,这些应用程序是相同的,但我希望其中一个限制连接,另一个获取任意数量的连接。
我有三台服务器,其中两台运行 postgres 9.5.3,第三台运行 pgbouncer 1.7.2。
我可以通过 pgbouncer 访问两个 postgresql 实例之一,一切都很完美。其他 postgresql 服务器,我们称之为 P1 不在我的控制之下,我必须使用 ssl 连接,因此它得到了,因此以下行被添加到该服务器 pga_hba.conf
hostssl all all ###.###.###.###/32 md5
Run Code Online (Sandbox Code Playgroud)
我可以使用 psql 从 pgbouncer 服务器连接到 P1,没有任何问题。但是当我通过 pgbouncer 连接到 P1 时,我收到此错误消息
psql: ERROR: no pg_hba.conf entry for host "XXX.XXX.XXX.XXX", user "myuser", database "mydb", SSL off
Run Code Online (Sandbox Code Playgroud)
这是我的 pgbouncer.ini
[databases]
my_database = host=xxx.xxx.xxx.xxxx port=5432 dbname=mydb user=myuser password=mypassword client_encoding='UTF8'
[pgbouncer]
listen_addr = *
listen_port = 5432
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
logfile = /var/log/postgresql/pgbouncer.log
pidfile = /var/run/postgresql/pgbouncer.pid
admin_users = rms_admin
pool_mode …
Run Code Online (Sandbox Code Playgroud) 我已经在 Windows 7 机器上使用 PostgreSQL 9.6 配置了 PgBouncer。以下是 pgbouncer 配置设置;
[数据库] 测试=主机=127.0.0.1 端口=5432 dbname=master_db 用户=postgres 密码=test123 [保镖] 日志文件 = C:\Program Files (x86)\PgBouncer\log\pgbouncer.log pidfile = C:\Program Files (x86)\PgBouncer\log\pgbouncer.pid 监听地址 = * 监听端口 = 6432 验证类型 = md5 auth_file = C:\Program Files (x86)\PgBouncer\etc\userlist.txt admin_users = postgres stats_users = postgres 最大客户端连接数 = 100 默认池大小 = 20
用户列表文件
“测试用户”“巴查”
当我尝试使用 pgbouncer 连接到数据库时,通过此命令;
psql -h 127.0.0.1 -p 6432 -U test_user master_db
我收到这个错误
psql:错误:client_login_timeout(服务器关闭) psql:错误:pgbouncer 无法连接到服务器
我怎么解决这个问题?
我第一次使用简单的 Python Web 应用程序(Flask + psycopg2)尝试 PgBouncer,我很难通过简单的谷歌搜索来解释其日志消息的含义。我基本上看到了一堆:
2014-06-09 09:25:07.867 20980 LOG C-0x1b1b240: vinum/vinum@unix:6432 login attempt: db=vinum user=vinum
2014-06-09 09:25:07.867 20980 LOG S-0x1b38bf0: vinum/vinum@127.0.0.1:5432 new connection to server
2014-06-09 09:25:07.875 20980 LOG C-0x1b1b240: vinum/vinum@unix:6432 closing because: client close request (age=0)
2014-06-09 09:25:15.626 20980 LOG C-0x1b1b240: vinum/vinum@unix:6432 login attempt: db=vinum user=vinum
2014-06-09 09:25:16.058 20980 LOG C-0x1b1b240: vinum/vinum@unix:6432 closing because: client close request (age=0)
2014-06-09 09:25:16.762 20980 LOG C-0x1b1b240: vinum/vinum@unix:6432 login attempt: db=vinum user=vinum
2014-06-09 09:25:16.796 20980 LOG C-0x1b1b3a8: vinum/vinum@unix:6432 login attempt: db=vinum …
Run Code Online (Sandbox Code Playgroud)