微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的一些 kubernetes 节点无法连接到我的 postgres 集群,而另一些却成功了?

如何解决为什么我的一些 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

Postgres 数据库统计信息的屏幕截图

Prometheus stats for Postgres DB

我尝试过的事情:

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

  2. 增加 PgBouncer 连接池

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

解决方法

这最终成为 postgres 没有实际使用我设置的配置映射的问题。映射为 200 个连接,但实际 DB 仍为默认值 100。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。