宣言ハイバーネーション

CloudNativePGは、PostgreSQLクラスターを稼働させ、いつでも利用できるように設計されています。

ワークロードがアクティブな場合にのみデータベースを稼働させる必要がある種類のワークロードがあります。バッチ駆動型ソリューションはそのようなケースの1つです。

バッチ駆動型ソリューションでは、データベースはバッチプロセスの実行中にのみ稼働する必要があります。

宣言的ハイバーネーション機能を使用すると、データベースのPVCを維持しながらデータベースのPodを削除することにより、CPUの電力を節約できます。

注釈

宣言的ハイバーネーションは、 imperative hibernation via the `cnpg plugin <CloudNativePGプラグイン>` の既存の実装とは異なります。強制的なハイバーネーションは、高可用性クラスター内のすべてのPostgresインスタンスをシャットダウンし、 PGDATA とWALを含むプライマリのPVCの静的コピーを保持します。プラグインを使用すると、プライマリを再開してからすべてのレプリカを再作成することにより、ハイバーネーションフェーズを終了できます。

ハイバネーション

クラスターを休止状態にするには、 cnpg.io/hibernation=on アノテーションを設定します。

$ kubectl annotate cluster <cluster-name> --overwrite cnpg.io/hibernation=on

休止状態のクラスターには実行中のポッドがありませんが、後でクラスターをリハイドレートできるようにPVCは保持されます。プライマリのPVCに加えて、レプリカPVCが保持されます。

ハイバーネーション手順は、プライマリPod、次にレプリカPodを削除し、スイッチオーバーを回避して、レプリカの同期が維持されるようにします。

cnpg.io/hibernation の状態を探すことで、ハイバーネーション状態を監視できます。

$ kubectl get cluster <cluster-name> -o "jsonpath={.status.conditions[?(.type==\"cnpg.io/hibernation\")]}"

{
        "lastTransitionTime":"2023-03-05T16:43:35Z",
        "message":"Cluster has been hibernated",
        "reason":"Hibernated",
        "status":"True",
        "type":"cnpg.io/hibernation"
}

ハイバーネーション状態は、 kubectl のcnpg プラグインのstatus サブコマンドで読み取ることもできます。

$ kubectl cnpg status <cluster-name>
Cluster Summary
Name:              cluster-example
Namespace:         default
PostgreSQL Image:  ghcr.io/cloudnative-pg/postgresql:15.3
Primary instance:  cluster-example-2
Status:            Cluster in healthy state
Instances:         3
Ready instances:   0

Hibernation
Status   Hibernated
Message  Cluster has been hibernated
Time     2023-03-05 16:43:35 +0000 UTC
[..]

水分補給

クラスターをリハイドレートするには、 cnpg.io/hibernation アノテーションをoff に設定します。

$ kubectl annotate cluster <cluster-name> --overwrite cnpg.io/hibernation=off

または、完全に設定を解除します。

$ kubectl annotate cluster <cluster-name> cnpg.io/hibernation-

Podが再作成され、クラスターがオペレーションを再開します。