Managing EDB Postgres Distributed (PGD) databases#

architecture document で説明しているように、 EDB Postgres Distributed for Kubernetesは、PGDデータベースを展開するために作成されたオペレーターです。 Kubernetesエコシステムを活用することで、自己修復と宣言的制御を提供できます。オペレーターは、バックアップおよび復元操作も担当します。 バックアップとリストア を参照してください。

ただし、 PGDクラスターの操作と制御の多くは、オペレーターによって管理されていません。 EDB Postgres Distributed for Kubernetesによって作成されたポッドには、 PGD CLI がインストールされた状態で提供されます。このツールを使用して、スイッチオーバーを実行できます。

PGD CLI#

警告

PGD CLIを使用してリソースを作成および削除しないでください。たとえば、 create-proxy および`delete-proxy` コマンドは避けてください。リソースのプロビジョニングはオペレーターの制御下にあり、手動での作成と削除はサポートされていません。

例として、switchoverコマンドを実行します。

プロキシポッドからPGD CLIを使用することをお勧めします。それらを見つけるには、クラスターのポッドリストを取得します。

kubectl get pods -n my-namespace

NAME                   READY   STATUS    RESTARTS      AGE
location-a-1-1         1/1     Running   0             2h
location-a-2-1         1/1     Running   0             2h
location-a-3-1         1/1     Running   0             2h
location-a-proxy-0     1/1     Running   0             2h
location-a-proxy-1     1/1     Running   0             2h

プロキシノードの名前にはproxy が含まれます。 1つを選択して、コマンドプロンプトを取得します。

kubectl exec -n my-namespace -ti location-a-proxy-0 -- bash

これで、プロキシポッドとのbashセッションが開きました。 pgd コマンドは使用できます。

pgd

Available Commands:
  check-health       Checks the health of the EDB Postgres Distributed cluster.
  <- snipped ->
  switchover         Switches over to new write leader.
  <- snipped ->

スイッチオーバーに必要な情報を取得して、簡単に移動できます。

pgd switchover --help

  $ pgd switchover --group-name group_a --node-name bdr-a1
  switchover is complete
pgd show-groups -f $PGD_CONFIG_FILE

Group      Group ID   Type   Parent Group Location Raft Routing Write Leader
- ----      --------   ----   ------------ -------- ---- ------- ------------
world      3239291720 global                       true true    location-a-2
location-a 2135079751 data   world                 true true    location-a-1
pgd show-nodes -f $PGD_CONFIG_FILE
Node         Node ID    Group      Type Current State Target State Status Seq ID
- ---         -------    -----      ---- ------------- ------------ ------ ------
location-a-1 3165289849 location-a data ACTIVE        ACTIVE       Up     1
location-a-2 3266498453 location-a data ACTIVE        ACTIVE       Up     2
location-a-3 1403922770 location-a data ACTIVE        ACTIVE       Up     3

データベースへのアクセス#

Use cases は、Kubernetesクラスター内でのデータベースの使用と外部からのデータベースの使用に関するディスカッションです。 Connectivity では、アプリケーションからデータベースへのアクセスに関連するサービスに関するディスカッションを見つけることができます。

システムを実装する方法にかかわらず、アプリケーションはプロキシサービスを使用して接続し、PGDとEDB Postgres Distributed for Kubernetesオペレーターによって追加された自己修復機能の強化のメリットを享受する必要があります。

重要

EDB Postgres EDB Postgres Distributedドキュメントで説明されている`bdrdb` データベースとは対照的に、 KubernetesのデフォルトのEDB Postgresに従って、データノードは`app` と呼ばれるデータベースで作成され、app という名前のユーザーが所有します。これらの値は、マニフェストの`cnp` セクションで構成できます。参考については、 EDB Postgres for Kubernetesドキュメントの Bootstrap を参照してください。

ただし、管理タスクのために psql CLIを使用してPGDデータノードにアクセスすることが必要になる場合があります。

PGDクラスターとkubectl exec のポッドリストを取得して、データノードに入れることができます。

kubectl exec -n my-namespace -ti location-a-1-1 -- psql

psqlのよく知られた領域では、デフォルトで作成されるデータベースの名前がapp であることに注意してください。前述の警告を参照してください。

postgres=# \c app
You are now connected to database "app" as user "postgres".
app=# \x
Expanded display is on.
app=# select * from bdr.node_summary;
- [ RECORD 1 ]---------------------------------------
node_name              | location-a-1
node_group_name        | location-a
interface_connstr      | host=location-a-1-node user=streaming_replica sslmode=verify-ca port=5432 sslkey=/controller/certificates/streaming_replica.key sslcert=/controller/certificates/streaming_replica.crt sslrootcert=/controller/certificates/server-ca.crt application_name=location-a-1 dbname=app
peer_state_name        | ACTIVE
peer_target_state_name | ACTIVE

<- snipped ->

アプリケーションには、非特権ロールデフォルトでapp を使用します。

ユーザーの資格情報が必要です。これはKubernetesシークレットに保存されています。

kubectl get secrets

NAME                     TYPE                       DATA   AGE
<- snipped ->
location-a-app           kubernetes.io/basic-auth   2      2h

このシークレットには、Postgres DSNに必要なbase64でエンコードされたユーザー名とパスワードが含まれています。

kubectl get secrets location-a-app -o yaml

apiVersion: v1
data:
  password: <base64-encoded-password>
  username: <base64-encoded-username>
kind: Secret
metadata:
  creationTimestamp: <timestamp>
  labels:

<- snipped ->