StackGres 1.6 数据库平台工程集群配置管理(K8S Pods/PostgreSQL/PgBouncer)

发布时间 2023-12-04 10:16:39作者: 为少

image

Postgres 配置

PostgreSQL 的配置在 SGPostgresConfig CRD 中指定。如果在创建集群时没有指定自定义配置,StackGres 将创建一个默认配置,您可以在 这里 看到。

默认情况下,StackGres 已经附带了一个经过专业调优的 Postgres 配置(即 postgresql.conf )。但是,完全可以指定您自己的配置。如果您需要有关配置的指导,请考虑使用 postgresqlCONF 服务,它为您提供多种语言的详细参数信息、建议、调优指南,甚至还提供在线存储和管理 Postgres 配置的工具。

SGPostgresConfig CRD 允许你指定和管理你的 Postgres 配置。Postgres 配置既可以在每个集群中创建(和/或修改),也可以在多个集群中重用。不需要在每个集群中重复配置。

SGPostgresConfig 从一个或多个 Postgres 集群中引用。

这是一个配置定义示例:

apiVersion: stackgres.io/v1
kind: SGPostgresConfig
metadata:
  namespace: demo
  name: pgconfig1
spec:
  postgresVersion: "14"
  postgresql.conf:
    work_mem: '16MB'
    shared_buffers: '2GB'
    random_page_cost: '1.5'
    password_encryption: 'scram-sha-256'
    log_checkpoints: 'on'
    jit: 'off'

这个定义是在 Kubernetes 中创建的(例如使用 kubectl apply),并且可以像检查任何其他 Kubernetes 资源一样检查(kubectl describe sgpgconfig pgconfig1)。

StackGres 集群可以通过以下方式引用该配置:

apiVersion: stackgres.io/v1
kind: SGCluster
metadata:
  namespace: demo
  name: cluster
spec:
# [...]
  configurations:
    sgPostgresConfig: 'pgconfig1'

实例配置文件

实例概要文件是对实例的资源特征的抽象(基本上,到目前为止,是 CPU "cores" 和 RAM)。StackGres 用 CRD SGInstanceProfile 表示这样一个概要文件。您可以将实例配置文件想象成 "t-shirt sizes",这是一种创建命名 t 恤大小(如 S、M、L )的方法,您将在创建集群时引用它们。这是一种通过使用标准化实例大小来实施最佳实践的方法。

SGInstanceProfile 从一个或多个 Postgres 集群中被引用。

这是一个配置定义示例:

apiVersion: stackgres.io/v1
kind: SGInstanceProfile
metadata:
  namespace: demo
  name: size-small
spec:
  cpu: "4"
  memory: "8Gi"

这个定义是在 Kubernetes 中创建的(例如使用 kubectl apply ),并且可以像其他 Kubernetes 资源一样检查(kubectl describe sginstanceprofile size-small)。

如果愿意,您可以创建其他大小的实例配置文件。

实例配置文件强制容器的资源请求和限制,其中 Patroni 和 Postgres 将使用 requests 和 limits 的 cpumemory 值来设置 Pod 资源。
它还对 .spec.containers.spec.initContainers 下的所有其他容器强制执行资源请求。
这些部分包含由 cpumemory 指定的默认值,并且可以在以后根据您的特定用例的需求进行调整。

StackGres 集群可以通过以下方式引用该配置:

apiVersion: stackgres.io/v1
kind: SGCluster
metadata:
  namespace: demo
  name: cluster
spec:
# [...]
  sgInstanceProfile: 'size-small'

连接池配置

默认情况下,StackGres 将 Postgres 集群部署在一个包含连接池的 sidecar 上。StackGres 目前使用 PgBouncer。连接池位于数据库前面,并控制传入的连接(fan-in)。
这使得 Postgres 能够以更少的并发连接运行,同时允许更多的外部连接(从应用程序到池处理器)。如果在创建集群时没有指定自定义池配置,StackGres将创建一个默认配置,您可以在这里 看到。

StackGres 提供了一个生产级的默认配置。您可以通过创建 SGPoolingConfig CRD 的实例来提供自己的池配置。SGPoolingConfig 从一个或多个 Postgres 集群中引用。

这是一个 PgBouncer 配置定义的例子:

apiVersion: stackgres.io/v1
kind: SGPoolingConfig
metadata:
  namespace: demo
  name: poolconfig1
spec:
  pgBouncer:
    pgbouncer.ini:
      pgbouncer:
        max_client_conn: '200'
        default_pool_size: '200'
        pool_mode: transaction

这个定义是在 Kubernetes 中创建的(例如使用 kubectl apply),并且可以像检查其他 Kubernetes 资源一样检查(kubectl describe sgpoolconfig poolconfig1)。

StackGres 集群可以通过以下方式引用该配置:

apiVersion: stackgres.io/v1
kind: SGCluster
metadata:
  namespace: demo
  name: cluster
spec:
# [...]
  configurations:
    sgPoolingConfig: 'poolconfig1'

重新加载配置

SGPoolingConfig 自定义连接池部分 一节解释了正确扩展连接的不同选项。

每个配置一旦应用,就需要 reloaded。这可以通过获取相应的主节点 pod 名称并发出与大多数环境相同的信号来完成:

PRIMARY=$(kubectl get pod -l role=master -n cluster -o name)
kubectl exec -n cluster -it ${PRIMARY} -c postgres-util -- pkill --signal HUP pgbouncer

禁用连接池

某些应用程序,特别是那些用于报告或 OLAP 的应用程序,可能不需要池中间件来发出大型查询和少量连接。可以通过在 Cluster 配置中将 disableConnectionPooling 设置为 true 来禁用池化(有关更多信息,请参阅 CRD Cluster Pods configuration)。

apiVersion: stackgres.io/v1
kind: SGCluster
metadata:
  namespace: demo
  name: cluster
spec:
  pods:
    disableConnectionPooling: false
...

不管怎样,如果您的应用程序使用了内部池,或者它已经有了池中间件,那么您可以考虑禁用内部池机制。但是,我们鼓励用户在内部启用池,因为它可以作为可能发生的意外连接峰值的争用屏障,为集群带来更多的稳定性。

池管理和内部统计

Transaction 模式

建议使用这种配置来实现最有效的池分配:

cat << EOF | kubectl apply -f -
apiVersion: stackgres.io/v1
kind: SGPoolingConfig
metadata:
  namespace: my-cluster
  name: poolconfig1
spec:
  pgBouncer:
    pgbouncer.ini:
      pgbouncer:
        pool_mode: transaction
        max_client_conn: '1000'
        default_pool_size: '80'
EOF

通过超时释放连接的 Session 模式

此配置需要从所使用的应用程序了解更多的见解和规范针对集群。这里的目的是释放连接在 idle in transaction

您会注意到下面的代码是从影响客户端到服务器端的变量排序的,
增量。如果您的应用程序在连接空闲时设置了客户端超时,则可能不需要
要做到这一点,虽然几个生产集群可能不仅是一个,而是许多
不同连接处理中的应用程序。

cat << EOF | kubectl apply -f -
apiVersion: stackgres.io/v1
kind: SGPoolingConfig
metadata:
  namespace: my-cluster
  name: poolconfig-session-prod
spec:
  pgBouncer:
    pgbouncer.ini:
      pgboucner:
        pool_mode: session
        max_client_conn: '1000'
        default_pool_size: '80'
        client_idle_timeout: '30s'
        idle_transaction_timeout: '60s'
        server_idle_timeout: '120s'
        server_lifetime: '240s'
        server_fast_close: '300s'
EOF

当 server pool 被满足时,传入的客户端连接建立请求将被排队设置
wait 状态由 PgBouncer。这就是为什么确保服务器连接是安全的非常重要
适当地释放,特别是如果它们被长时间保存。

访问池管理控制台

PgBouncer 包括一个管理数据库风格的连接,用于获取有关池统计的有价值的信息,如计数器、聚合、客户端和服务器连接等。对于类似生产的环境来说,理解这些值是至关重要的。

通过 container socket 和 pgbouncer(这不是数据库用户)用户访问控制台:

kubectl exec -it  -c postgres-util test-0 -- psql  -p 6432 -d pgbouncer pgbouncer
psql (12.4 OnGres Inc., server 1.13.0/bouncer)
Type "help" for help.

pgbouncer=# \x
Expanded display is on.

获取有价值的池信息

pgbouncer=# show stats;
-[ RECORD 1 ]-----+----------
database          | pgbouncer
total_xact_count  | 1
total_query_count | 1
total_received    | 0
total_sent        | 0
total_xact_time   | 0
total_query_time  | 0
total_wait_time   | 0
avg_xact_count    | 0
avg_query_count   | 0
avg_recv          | 0
avg_sent          | 0
avg_xact_time     | 0
avg_query_time    | 0
avg_wait_time     | 0
pgbouncer=# show pools;
-[ RECORD 1 ]---------
database   | pgbouncer
user       | pgbouncer
cl_active  | 1
cl_waiting | 0
sv_active  | 0
sv_idle    | 0
sv_used    | 0
sv_tested  | 0
sv_login   | 0
maxwait    | 0
maxwait_us | 0
pool_mode  | statement
pgbouncer=# show clients;
-[ RECORD 1 ]+------------------------
type         | C
user         | pgbouncer
database     | pgbouncer
state        | active
addr         | unix
port         | 6432
local_addr   | unix
local_port   | 6432
connect_time | 2020-10-23 13:19:54 UTC
request_time | 2020-10-23 14:18:23 UTC
wait         | 3445
wait_us      | 617385
close_needed | 0
ptr          | 0x1a5c350
link         | 
remote_pid   | 28349
tls          | 

其他有用的命令:

  • show servers
  • show fds
  • show mem
  • show stats_totals
  • show stat_averages

Reference

可用命令:

        SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|USERS|VERSION
        SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
        SHOW DNS_HOSTS|DNS_ZONES
        SHOW STATS|STATS_TOTALS|STATS_AVERAGES|TOTALS
        SET key = arg
        RELOAD
        PAUSE [<db>]
        RESUME [<db>]
        DISABLE <db>
        ENABLE <db>
        RECONNECT [<db>]
        KILL <db>
        SUSPEND
        SHUTDOWN

更多