为什么我的一些 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 数据库统计信息的屏幕截图

我尝试过的事情:

  1. 让作业直接连接到 Pgbouncer 服务的集群 IP 以排除 DNS。

  2. 增加PgBouncer连接池

我不确定这里的问题是什么,因为我没有来自数据库端的任何错误需要修复,也没有来自作业端的基本错误消息。任何帮助将不胜感激,如果缺少关键部分,我可以添加更多上下文。

这最终成为 postgres 的一个问题,它实际上没有使用我设置的配置映射。该映射适用于 200 个连接,但实际数据库仍处于默认值 100。

除了确保检查您设置的配置是否实际传播到实际服务之外,这里没什么可学的。