PostgreSQL の設定¶
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 のいずれかを適切に構成することは、ユーザーの義務です。
または、唯一のストリーミングレプリケーションクライアントが高可用性クラスターで実行されているレプリカ
インスタンスである場合は、クラスター レベルでのレプリケーション
スロットのサポートを追加するレプリケーション
スロット機能を利用できます。 replicationSlots.highAvailability
オプションを使用してこの機能を有効にすることができます (詳細については、
複製ユーザーについて を参照してください)。
レプリケーション
スロットも継続的なバックアップも配置されていない場合、wal_keep_size
または wal_keep_segments
を構成することが、スタンバイが同期から外れるのを防ぐ唯一の方法です。スタンバイが同期から外れると、"could not receive data from WAL stream: ERROR: requested WAL segment **** **** **** **** **** **** has already been removed"
のようなエラー
メッセージが生成されます。これには、ストリーミングレプリケーションの目的で古い
WAL セグメントを保持するために、PGDATA の一部、または WAL
ファイルの保存専用のボリュームを専用にする必要があります。
次のパラメータは 固定 であり、オペレーターによって排他的に制御されます。
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 = /controller/run
wal_level = logical
wal_log_hints = on
固定パラメーターは最後に追加されるため、YAML 構成を介してユーザーがオーバーライドすることはできません。これらのパラメータは、WAL のアーカイブと複製を正しく行うために必要です。
レプリケーション設定¶
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
オプションは、サーバーの起動時に事前に読み込まれる 1
つ以上の共有ライブラリをコンマ区切りリストの形式で指定するために存在します。通常、システム全体のほとんどのデータベース
セッションで利用可能にする必要がある拡張機能をロードするために
PostgreSQL で使用されます (例: pg_stat_statements )。
CloudNativePG では、shared_preload_libraries
オプションはデフォルトで空です。 shared_preload_libraries
の内容を上書きすることはできますが、このオプションは Postgres
のエキスパート ユーザーのみが利用することをお勧めします。
重要
指定されたライブラリが見つからない場合、サーバーは起動に失敗し、CloudNativePG の自己修復の試みが妨げられ、手動の介入が必要になります。 shared_preload_libraries のコンテンツを直接管理する予定がある場合は、必ず拡張機能と shared_preload_libraries の設定の両方をテストしてください。
CloudNativePG は、最もよく使用される一部の PostgreSQL 拡張機能の
shared_preload_libraries オプションの内容を自動的に管理できます
(詳細については、以下の マネージド拡張機能 セクションを参照してください)。
具体的には、オペレーターは、構成パラメーターが管理ライブラリーの 1 つを必要とすることに気付くとすぐに、必要なライブラリーを自動的に追加します。オペレーターは、実際のパラメーターがそれを必要としなくなるとすぐに、ライブラリーも削除します。
重要
shared_preload_libraries からライブラリを削除するには、クラスタ内のすべてのインスタンスを再起動する必要があることに注意してください。
文字列のリストとして .spec.postgresql.shared_preload_libraries
を介して追加の shared_preload_libraries
を提供できます。オペレーターはそれらを自動的に管理するものとマージします。
マネージド拡張機能¶
前のセクションで予想したように、CloudNativePG
は、一部の既知のサポートされている拡張機能について、shared_preload_libraries
のコンテンツを自動的に管理します。現在のリストには次のものが含まれます。
auto_explainpg_stat_statementspgaudit
これらのライブラリのいくつかは、それらを使用する前にデータベースに追加のオブジェクトを必要とし、通常は
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 IF NOT EXISTS pg_stat_statements
を実行して、pg_stat_statements
ビューに対してクエリを実行できるようにします。
pgaudit の有効化¶
pgaudit 拡張機能は、標準の PostgreSQL
ロギング機能を介して、詳細なセッションおよび/またはオブジェクトの監査ロギングを提供します。
CloudNativePG は、PostgreSQL クラスターで :ref:``pgaudit` の有効化<pgaudit の有効化>` を透過的かつネイティブにサポートします。詳細については、 :ref:``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
つのセクションで構成されていることがわかります。
決まったルール
ユーザー定義のルール
オプションの LDAP セクション
デフォルトのルール
固定ルール:
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 データベース
パラメータのデフォルト値は 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 のドキュメントを参照してください。
次の抜粋のように、クラスター マニフェスト内で、pg_hba 行が
spec.postgresql.pg_hba のリスト アイテムとして追加されます。
postgresql:
pg_hba:
- hostssl app app 10.244.0.0/16 md5
上記の例では、安全なチャネル (hostssl ) 経由で MD5 パスワード認証
(必要に応じて scram-sha-256 を使用できます) を使用して、app
ユーザーが app データベースにアクセスできるようにしています。
LDAP 設定¶
クラスター仕様の postgres セクションの下には、pg_hba.conf
ファイルに追加されるルールに変換される LDAP
構成を定義するために使用できるオプションの ldap
セクションがあります。
これは、LDAP セクションで server 、prefix 、suffix
を指定する必要がある simple bind モードと、server
、baseDN 、binDN 、および LDAP
パスワードを含むシークレットである bindPassword を指定する必要がある
search+bind モードの 2
つのモードをサポートします。さらに、search+bind
モードでは、searchFilter または searchAttribute
を指定するオプションがあります。 searchAttribute
が指定されていない場合、デフォルトの uid が使用されます。
さらに、どちらのモードでも、ldapscheme の scheme と port
を指定できます。ただし、スキームもポートも必要ありません。
search+bind 用に入力されたこのセクションは、次のようになります。
postgresql:
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
のデフォルト設定で十分です。これは、オペレーターが /dev/shm の下に
shm という メモリ バウンド ``EmptyDir`` ボリューム
を自動的にマウントすることを考慮した場合です。実行中の Postgres
コンテナー内のそのようなボリュームのサイズは、次の方法で確認できます。
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_modsarchive_cleanup_commandarchive_commandarchive_modebonjourbonjour_namecluster_nameconfig_filedata_directorydata_sync_retryevent_sourceexternal_pid_filefull_page_writeshba_filehot_standbyident_filejit_providerlisten_addresseslog_destinationlog_directorylog_file_modelog_filenamelog_rotation_agelog_rotation_sizelog_truncate_on_rotationlogging_collectorportprimary_conninfoprimary_slot_namepromote_trigger_filerecovery_end_commandrecovery_min_apply_delayrecovery_targetrecovery_target_actionrecovery_target_inclusiverecovery_target_lsnrecovery_target_namerecovery_target_timerecovery_target_timelinerecovery_target_xidrestart_after_crashrestore_commandshared_preload_librariessslssl_ca_filessl_cert_filessl_ciphersssl_crl_filessl_dh_params_filessl_ecdh_curvessl_key_filessl_max_protocol_versionssl_min_protocol_versionssl_passphrase_commandssl_passphrase_command_supports_reloadssl_prefer_server_ciphersstats_temp_directorysynchronous_standby_namessyslog_facilitysyslog_identsyslog_sequence_numberssyslog_split_messagesunix_socket_directoriesunix_socket_groupunix_socket_permissionswal_levelwal_log_hints