StackGres 1.6 資料庫平臺工程叢集配置管理(K8S Pods/PostgreSQL/PgBouncer)

為少發表於2023-12-04

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

更多

相關文章