如何解决为什么我的一些 kubernetes 节点无法连接到我的 postgres 集群,而另一些却成功了?
所以我正在运行一个 k8s 集群,其中包含 3 个 pod postgres 集群,前面是一个 3 pod pgbouncer 集群。连接到它的是具有多个并行工作器的批处理作业,这些工作器通过 pgbouncer 将数据流式传输到数据库中。如果我运行 10 个这些批处理作业 Pod,一切都会顺利进行。如果我增加一个数量级到 100 个作业 Pod,其中很大一部分将无法连接到数据库并显示错误 got error driver: bad connection
。多个 worker 运行在同一个节点上(每个节点 5 个 worker pod)所以 k8s 集群中只有 26 个 pod。
令人抓狂的是我在 Kibana 中没有看到任何 postgres 或 pgbouncer 错误/警告日志,而且它们的 pod 没有失败。 Prometheus 日志也显示它远低于最大连接数。
以下是 postgres 和 pgbouncer 配置以及工作人员的连接代码。
来自工作人员的相关连接代码:
err = backoff.Retry(func() error {
p.connection,err = gorm.Open(postgres.New(postgres.Config{
DSN: p.postgresUrl,}),&gorm.Config{Logger: newLogger})
return err
},backoff.NewExponentialBackOff())
if err != nil {
log.Panic(err)
}
Postgres 配置:
postgresql:
parameters:
max_connections = 200
shared_buffers = 4GB
effective_cache_size = 12GB
maintenance_work_mem = 1GB
checkpoint_completion_target = 0.7
wal_buffers = 16MB
default_statistics_target = 100
random_page_cost = 4
effective_io_concurrency = 2
work_mem = 6990kB
min_wal_size = 1GB
max_wal_size = 4GB
max_worker_processes = 6
max_parallel_workers_per_gather = 3
max_parallel_workers = 6
max_parallel_maintenance_workers = 3
PgBouncer 配置:
[databases]
* = host=loot port=5432 auth_user=***
[pgbouncer]
listen_port = 5432
listen_addr = *
auth_type = md5
auth_file = /pgconf/users.txt
auth_query = SELECT username,password from pgbouncer.get_auth($1)
pidfile = /tmp/pgbouncer.pid
logfile = /dev/stdout
admin_users = ***
stats_users = ***
default_pool_size = 20
max_client_conn = 600
max_db_connections = 190
min_pool_size = 0
pool_mode = session
reserve_pool_size = 0
reserve_pool_timeout = 5
query_timeout = 0
ignore_startup_parameters = extra_float_digits
我尝试过的事情:
-
让作业直接连接到 Pgbouncer 服务的集群 IP 以排除 DNS。
-
增加 PgBouncer 连接池
我不确定这里的问题是什么,因为我没有来自数据库端的任何错误需要修复,也没有来自工作端的基本错误消息。任何帮助将不胜感激,如果缺少关键部分,我可以添加更多上下文。
解决方法
这最终成为 postgres 没有实际使用我设置的配置映射的问题。映射为 200 个连接,但实际 DB 仍为默认值 100。
除了确保检查您设置的配置是否实际传播到实际服务之外,这里没有什么可学的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。