PostgreSQL Configuration

PostgreSQLに精通しているユーザーは、インスタンスを設定するための次の2つのファイルの存在を認識しています。

  • postgresql.conf : PostgreSQLのメインの実行時設定ファイル

  • pg_hba.conf :クライアント認証ファイル

宣言的な設定とPostgreSQLコンテナの不変性の概念により、ユーザーはこれらのファイルに直接触れることはできません。 parameters および pg_hba キーを介してカスタム postgresql.conf および pg_hba.conf 設定を定義することにより、 Cluster リソース定義の postgresql セクションで構成が可能です。

これらの設定は、すべてのインスタンスで同じです。

警告

ALTER SYSTEM クエリーを使用して、 PostgreSQLインスタンスの設定を強制的に変更しないでください。演算子によって通常制御されるオプションの一部を変更すると、実際にクラスターの予測不能/回復不能な状態になる可能性があります。さらに、 ALTER SYSTEM の変更はクラスター全体に複製されません。

サンプルには、カスタム設定の使用リファレンスが含まれています。 cluster-example-custom.yaml を参照してください。

postgresql セクション

ポッドのPostgreSQLインスタンスは、これらの設定が自動的に追加されるデフォルトの postgresql.conf ファイルで始まります:

listen_addresses = *
include custom.conf

custom.conf ファイルには、次の例のように、 postgresql セクションにユーザー定義の設定が含まれます。

# ...
postgresql:
  parameters:
    shared_buffers: "1GB"
# ...

custom.conf のコンテンツは、次のセクションをこのオーダーで適用することにより、オペレーターによって自動的に生成および維持されます。

  • グローバルデフォルトパラメータ PostgreSQLメジャーバージョンに依存するデフォルトのパラメーター

  • ユーザー提供のパラメーター

  • 固定パラメーター

グローバルデフォルトパラメータ は次のとおりです。

dynamic_shared_memory_type = posix
logging_collector = on
log_destination = csvlog
log_directory = /controller/log
log_filename = postgres
log_rotation_age = 0
log_rotation_size = 0
log_truncate_on_rotation = false
max_parallel_workers = 32
max_replication_slots = 32
max_worker_processes = 32
shared_memory_type = mmap # for PostgreSQL >= 12 only
wal_keep_size = 512MB # for PostgreSQL >= 13 only
wal_keep_segments = 32 # for PostgreSQL <= 12 only
wal_sender_timeout = 5s
wal_receiver_timeout = 5s

警告

PostgreSQLクラスターでのWALセグメントの保持を計画し、予想および観測されたワークロードに基づいて、サーババージョンに応じて wal_keep_size または wal_keep_segments を適切に構成することがあなたの義務です。 CloudNativePGがレプリケーションスロットをサポートするまで、および継続的なバックアップを用意していない場合、これがスタンバイが同期から外れて "could not receive data from WAL stream: ERROR: requested WAL segment ************************ has already been removed" のようなエラーメッセージを返す場合を防ぐ唯一の方法です。これには、ストリーミングレプリケーションのために古いWALセグメントを保持するために、 PGDATA のパートを専用にする必要があります。

以下のパラメーターは 固定 であり、演算子によって排他的に制御されます:

archive_command = /controller/manager wal-archive %p
archive_mode = on
full_page_writes = on
hot_standby = true
listen_addresses = *
port = 5432
restart_after_crash = false
ssl = on
ssl_ca_file = /controller/certificates/client-ca.crt
ssl_cert_file = /controller/certificates/server.crt
ssl_key_file = /controller/certificates/server.key
unix_socket_directories = /var/run/postgresql
wal_level = logical
wal_log_hints = on

固定パラメータは最後に追加されるため、YAML設定を介してユーザーが上書きすることはできません。これらのパラメーターは、正しいWALarchivingとレプリケーションに必要です。

レプリケーション設定

primary_conninfo 、 restore_command 、および recovery_target_timeline パラメーターは、クラスター内のインスタンスの状態に応じて演算子によって自動的に管理されます。

primary_conninfo = host=cluster-example-rw user=postgres dbname=postgres
recovery_target_timeline = latest

ログ制御設定

演算子はPostgreSQLにログをCSVフォーマットで出力するよう要求し、インスタンスマネージャは自動的に解析してJSONフォーマットで出力します。このため、 PostgreSQLのすべてのログ設定は固定されており、変更できません。

詳細については、 ロギング を参照してください。

共有プリロードライブラリ

PostgreSQLの shared_preload_libraries オプションは、acomma-separated リストのフォームで、サーバースタートにプリロードされる1つ以上の共有ライブラリを指定するために存在します。通常、 PostgreSQLでは、システム全体のほとんどのデータベースセッション( pg_stat_statements など)で使用できる必要がある拡張機能をロードために使用されます。

CloudNativePGでは、デフォルトで shared_preload_libraries オプションは空です。 shared_preload_libraries のコンテンツをオーバーライドできますが、このオプションを利用できるのはエキスパートのPostgresユーザーのみにすることをお勧めします。

重要

指定されたライブラリが見つからない場合、サーバーはスタートに失敗し、CloudNativePGが自己修復を試みなくなり、マニュアル介入が必要になります。そのコンテンツを直接管理する場合は、 shared_preload_libraries の拡張子と設定の両方を常にテストmakeてください。

CloudNativePGは、最もよく使用されるいくつかのPostgreSQL拡張機能の shared_preload_libraries オプションのコンテンツを自動的に管理できます(詳細については、以下の マネージ拡張 セクションを参照してください)。

具体的には、構成パラメーターが管理対象ライブラリの1つを必要とすることに演算子が気づくとすぐに、必要なライブラリが自動的に追加されます。演算子は、実際のパラメータが必要としないライブラリをすぐに削除します。

重要

shared_preload_libraries からライブラリを削除するには、クラスター内のすべてのインスタンスをリスタートして有効にオーダー必要があることに常に留意してください。

.spec.postgresql.shared_preload_libraries を介して追加の shared_preload_libraries を文字列のリストとして提供できます。オペレータは、それらを自動的に管理する文字列とマージします。

マネージ拡張

前のセクションで予想したように、CloudNativePGは、よく知られているサポートされている拡張機能の shared_preload_libraries のコンテンツを自動的に管理します。現在のリストには次のものが含まれます。

  • auto_explain

  • pg_stat_statements

  • pgaudit

これらのライブラリの中には、使用する前にデータベースに追加のオブジェクトを必要とするものもあります。通常は、 CREATE EXTENSION コマンドで管理されるビューや関数をデータベースで実行します( DROP EXTENSION コマンドは通常これらのオブジェクトを削除します)。

このようなライブラリの場合、CloudNativePGは、次のクエリーで識別される、クラスター内の接続を受け入れるすべてのデータベースで拡張機能の作成と削除を自動的に処理します。

SELECT datname FROM pg_database WHERE datallowconn

注釈

上記のクエリーには、 template1 などのテンプレートデータベースも含まれます。

auto_explain を有効にする

:ref:auto_explain` を有効にする<`auto_explain` を有効にする>` 拡張機能は、 ``EXPLAIN

を手動で実行することなく、遅いステートメントの実行計画を自動的にロギングする手段を提供します(最適化されていないクエリの追跡に役立ちます)。

次の抜粋の例のように、 auto_explain. で始まるパラメーターを構成に追加することにより、 auto_explain を有効にできます(完了まで10秒以上かかるクエリの実行プランを自動的に記録します)。

# ...
postgresql:
  parameters:
    auto_explain.log_min_duration: "10s"
# ...

注釈

auto_explainを有効にすると、パフォーマンスの問題が発生する可能性があります。 the auto explain documentation を参照してください

pg_stat_statements を有効にする

:ref:``pg_stat_statements` を有効にする<pg_stat_statements を有効にする>` 拡張は、クエリのリアルタイムモニタリングのためにPostgreSQLで利用できる最も重要な機能の1つです。

次の例の抜粋のように、 pg_stat_statements. で始まるパラメーターを構成に追加することにより、 pg_stat_statements を有効にできます。

# ...
postgresql:
  parameters:
    pg_stat_statements.max: "10000"
    pg_stat_statements.track: all
# ...

前に説明したように、演算子は自動的に pg_stat_statements を shared_preload_libraries に追加し、各データベースで CREATE EXTENSION IFNOT EXISTS pg_stat_statements を実行し、 pg_stat_statements ビューに対してクエリを実行できるようにします。

pgaudit を有効にする

pgaudit 拡張機能は、標準のPostgreSQLロギング機能を介して、詳細なセッションおよび/またはオブジェクト監査ロギングを提供します。

CloudNativePGは、 PostgreSQLクラスターで PGAuditログ を透過的かつネイティブサポートしています。詳細については、 PGAuditログ を参照してください。

次の例の抜粋のように、 pgaudit. で始まるパラメーターを構成に追加することにより、 pgaudit を有効にできます。

#
postgresql:
  parameters:
    pgaudit.log: "all, -misc"
    pgaudit.log_catalog: "off"
    pgaudit.log_parameter: "on"
    pgaudit.log_relation: "on"
#

pg_hba セクション

pg_hba は、ポッドで使用される pg_hba.conf を作成するために使用されるPostgreSQLホストベース認証ルールのリストです。

最初のマッチングルールが認証に使用されるため、演算子によって生成された pg_hba.conf ファイルは、4つのセクションで構成されていると見なすことができます。

1.ルール2を修正しました。ユーザー定義のルール3。オプションのLDAPセクション4。デフォルトのルール

固定ルール:

local all all peer

hostssl postgres streaming_replica all cert
hostssl replication streaming_replica all cert

デフォルトのルール:

host all all all <default-authentication-method>

PostgreSQL 14以降、 password_encryption databaseパラメータのデフォルト値は scram-sha-256 に設定されています。そのため、デフォルトの認証メソッドはこのPostgreSQLバージョンの scram-sha-256 です。

PostgreSQL 13以前では、デフォルトの認証方法として md5 が使用されます。

結果の pg_hba.conf は次のようになります。

  local all all peer

  hostssl postgres streaming_replica all cert
  hostssl replication streaming_replica all cert

  <user defined rules>
  <user defined LDAP>

  host all all all scram-sha-256 # (or md5 for PostgreSQL version <= 13)

`more information on `pg_hba.conf` <https://www.postgresql.org/docs/current/auth-pg-hba-conf.html>`__ については、 PostgreSQLの文書を参照してください。

LDAP設定

クラスター仕様の postgres セクションの下には、 pg_hba.conf ファイルに追加されたルールに変換されるLDAP構成を定義するためのオプショナルの ldap セクションがあります。

これは、LDAPセクションで server 、 prefix 、 suffix を指定する必要がある simple bind モードと、 server 、 baseDN 、 binDN 、およびldapを含むパスワードである bindPassword を指定する search+bind モードをサポートします。さらに、 search+bind モードでは、a searchFilter または searchAttribute を指定するオプションがあります。 searchAttribute が指定されていない場合、デフォルトの uid が使用されます。

さらに、どちらのモードでも、ldapschemeの scheme と port を指定できます。ただし、スキームもポートも必要ありません。

検索用に記入されたこのセクションは、次のようになります。

postgresql:
  parameters:
    ldap:
      server: openldap.default.svc.cluster.local
      bindSearchAuth:
        baseDN: ou=org,dc=example,dc=com
        bindDN: cn=admin,dc=example,dc=com
        bindPassword:
          name: ldapBindPassword
          key: data
        searchAttribute: uid

設定の変更

Cluster リソースの postgresql セクションを編集して、構成の変更を適用できます。

変更後、クラスターインスタンスはすぐに構成をリロードして変更を適用します。変更にリスタートが必要なパラメータが含まれる場合、演算子はローリングアップグレードを実行します。

動的共有メモリ設定

PostgreSQLは、 dynamic_shared_memory_type 構成オプションを使用した動的共有メモリ管理の実装をいくつかサポートしています。 CloudNativePGでは、次の2つの値のいずれかに制限することをお勧めします。

  • posix : shm_open を使用して割り当てられたPOSIX共有メモリに依存します(デフォルト設定)

  • sysv : shmget を介して割り当てられたSystem V共有メモリに基づいています

PostgreSQLでは、この設定は並列クエリでのメモリアロケーションにとって特に重要です。詳細については、この thread from the `pgsql-general mailing list <https://www.postgresql.org/message-id/CA%2BhUKGJOj7qzDLxeFPVvto8YEWop6FSQoTYPO9Z6Ee%3Di-nPS_Q%40mail.gmail.com>`__ を参照してください。

POSIX共有メモリ

ほとんどの場合、 posix のデフォルト設定で十分です。これは、演算子が shm under /dev/shm と呼ばれる* memory-bound EmptyDir ボリューム*を自動的にマウントすることを考慮しています。 runningPostgresコンテナ内のそのようなボリュームのサイズは、次の方法で確認できます。

mount | grep shm

次のような出力が得られるはずです。

shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size= **** **)

System V共有メモリ

Kubernetesクラスターの SHMMAX および SHMALL パラメーターに十分な値がある場合は、以下を設定することもできます。

dynamic_shared_memory_type: "sysv"

以下を実行することにより、 PostgreSQLコンテナ内から SHMMAX / SHMALL を確認できます。

ipcs -lm

例:

- ----- Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 18014398509465599
max total shared memory (kbytes) = 18014398509481980
min seg size (bytes) = 1

ご覧のとおり、 max total shared memory の数が非常に多いため、 dynamic_shared_memory_type を sysv に設定することをお勧めします。

別のメソッドは次を実行することです:

cat /proc/sys/kernel/shmall
cat /proc/sys/kernel/shmmax

固定パラメーター

一部のPostgreSQL構成パラメーターは、オペレーターのみが管理する必要があります。演算子は、ユーザがwebhookを使用して設定できないようにします。

ユーザーは、 postgresql セクションで次の構成パラメーターを設定することはできません。

  • allow_system_table_mods

  • archive_cleanup_command

  • archive_command

  • archive_mode

  • bonjour

  • bonjour_name

  • cluster_name

  • config_file

  • data_directory

  • data_sync_retry

  • event_source

  • external_pid_file

  • full_page_writes

  • hba_file

  • hot_standby

  • huge_pages

  • ident_file

  • jit_provider

  • listen_addresses

  • log_destination

  • log_directory

  • log_file_mode

  • log_filename

  • log_rotation_age

  • log_rotation_size

  • log_truncate_on_rotation

  • logging_collector

  • port

  • primary_conninfo

  • primary_slot_name

  • promote_trigger_file

  • recovery_end_command

  • recovery_min_apply_delay

  • recovery_target

  • recovery_target_action

  • recovery_target_inclusive

  • recovery_target_lsn

  • recovery_target_name

  • recovery_target_time

  • recovery_target_timeline

  • recovery_target_xid

  • restart_after_crash

  • restore_command

  • shared_preload_libraries

  • ssl

  • ssl_ca_file

  • ssl_cert_file

  • ssl_ciphers

  • ssl_crl_file

  • ssl_dh_params_file

  • ssl_ecdh_curve

  • ssl_key_file

  • ssl_max_protocol_version

  • ssl_min_protocol_version

  • ssl_passphrase_command

  • ssl_passphrase_command_supports_reload

  • ssl_prefer_server_ciphers

  • stats_temp_directory

  • synchronous_standby_names

  • syslog_facility

  • syslog_ident

  • syslog_sequence_numbers

  • syslog_split_messages

  • unix_socket_directories

  • unix_socket_group

  • unix_socket_permissions

  • wal_level

  • wal_log_hints