为什么我的一些 kubernetes 节点无法连接到我的 postgres 集群而其他节点成功?
Why do some of my kubernetes nodes fail to connect to my postgres cluster while others succeed?
所以我运行正在使用一个 k8s 集群,其中有 3 个 pod postgres 集群,前面是一个 3 pod pgbouncer 集群。连接到它的是一个批处理作业,具有多个并行工作程序,这些工作程序通过 pgbouncer 将数据流式传输到数据库中。如果我 运行 10 个这些批处理作业 pods 一切都会顺利进行。如果我增加一个数量级到 100 个作业 pods,其中很大一部分无法连接到数据库并出现错误 got error driver: bad connection
。同一个节点上有多个worker运行(每个节点5个workerpods)所以k8s集群中只有~26pods[=15] =]
令人抓狂的是,我在 Kibana 中没有看到任何 postgres 或 pgbouncer error/warning 日志,而且它们的 pods 没有失败。 Prometheus 日志记录也显示它低于最大连接数。
以下是 postgres 和 pgbouncer 配置以及 worker 的连接代码。
来自工作人员的相关连接代码:
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()
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
Postgres 数据库统计信息的屏幕截图
我尝试过的事情:
让作业直接连接到 Pgbouncer 服务的集群 IP 以排除 DNS。
增加PgBouncer连接池
我不确定这里的问题是什么,因为我没有来自数据库端的任何错误需要修复,也没有来自作业端的基本错误消息。任何帮助将不胜感激,如果缺少关键部分,我可以添加更多上下文。
这最终成为 postgres 的一个问题,它实际上没有使用我设置的配置映射。该映射适用于 200 个连接,但实际数据库仍处于默认值 100。
除了确保检查您设置的配置是否实际传播到实际服务之外,这里没什么可学的。
所以我运行正在使用一个 k8s 集群,其中有 3 个 pod postgres 集群,前面是一个 3 pod pgbouncer 集群。连接到它的是一个批处理作业,具有多个并行工作程序,这些工作程序通过 pgbouncer 将数据流式传输到数据库中。如果我 运行 10 个这些批处理作业 pods 一切都会顺利进行。如果我增加一个数量级到 100 个作业 pods,其中很大一部分无法连接到数据库并出现错误 got error driver: bad connection
。同一个节点上有多个worker运行(每个节点5个workerpods)所以k8s集群中只有~26pods[=15] =]
令人抓狂的是,我在 Kibana 中没有看到任何 postgres 或 pgbouncer error/warning 日志,而且它们的 pods 没有失败。 Prometheus 日志记录也显示它低于最大连接数。
以下是 postgres 和 pgbouncer 配置以及 worker 的连接代码。
来自工作人员的相关连接代码:
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()
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
Postgres 数据库统计信息的屏幕截图
我尝试过的事情:
让作业直接连接到 Pgbouncer 服务的集群 IP 以排除 DNS。
增加PgBouncer连接池
我不确定这里的问题是什么,因为我没有来自数据库端的任何错误需要修复,也没有来自作业端的基本错误消息。任何帮助将不胜感激,如果缺少关键部分,我可以添加更多上下文。
这最终成为 postgres 的一个问题,它实际上没有使用我设置的配置映射。该映射适用于 200 个连接,但实际数据库仍处于默认值 100。
除了确保检查您设置的配置是否实际传播到实际服务之外,这里没什么可学的。