AlloyDB for PostgreSQL のサーバパラメータの設定方法を確認してみた!コミュニティ版の設定値とも比較!
GCP の AlloyDB for PostgreSQL を使用する際のサーバーパラメータ(GUCパラメータ)の設定値と変更方法を確認しました。
ぬこのたのしいぽすぐれ教室
- 2022年07月26日公開
はじめに
こんにちは、NTTテクノクロス株式会社でPostgreSQLの技術支援をやっています、中村です。
これまで、オンプレミスや AWS、Azureなどのクラウド環境で PostgreSQLサービスを一通り使ってきましたが、どのプラットホームでも抑えておく必要があるのは、サーバパラメータ(GUCパラメータ)の参照、変更方法ですね。
サーバパラメータとは?
サーバパラメータとは、PostgreSQLで使用するメモリサイズを指定する shared_buffers や work_mem、PostgreSQLへの同時接続数の上限を指定する max_connections などの設定項目です。postgresql.conf というファイル内に記述してデータベースに設定します。
サーバパラメータについてはPostgreSQLドキュメントに記載があります。
https://www.postgresql.jp/document/current/html/runtime-config.html
クラウド環境ごとにサーバパラメータの設定方法が異なる
オンプレミスでは直接DBサーバの postgresql.conf ファイルを開いてサーバーパラメータの参照や変更が可能でしたが、AlloyDB for PostgreSQL のようなマネージドサービスではそもそもDBサーバのファイルに直接アクセスすることができません。
同じくマネージドサービスである Amazon RDS for PostgreSQL では、WEBブラウザ上のダッシュボードから設定値を参照、変更します。
※ただし、ダッシュボード上では計算式が記載されているパラメータなどがあるため、すべてのパラメータの設定値が参照できるわけではありません。
Google Cloud の AlloyDB for PostgreSQL についても サーバパラメータの参照、変更方法は理解しておく必要があるため、今回確認してみることにしました。
今回比較・確認に使用するのは、以下の製品です。
・AlloyDB for PostgreSQL (PostgreSQL14ベース)
・コミュニティ版 PostgreSQL 14.0
※なお、AlloyDB for PostgreSQL はプレビュー版であり、将来リリースされるものとは異なる可能性があります。
AlloyDBのサーバパラメータで確認したいこと4つ
前置きが長くなりましたが、今回確認したいことは以下の4つです。
1.WEBブラウザのコンソールからサーバパラメータの設定値を確認できるか?
2.WEBブラウザからサーバパラメータの設定値を変更できるか?
3.AlloyDBオリジナルのサーバパラメータは存在するか?
4.インスタンスサイズに応じて自動で設定値が変わるサーバパラメータが存在するか?
まず、それぞれの結果を先に整理します。
項番 | 確認事項 | 結果 |
1 | コンソールからサーバパラメータの設定値を確認できるか? | 参照できない |
2 | コンソールからサーバパラメータの設定値を変更できるか? | 変更できる |
3 | AlloyDBオリジナルのサーバパラメータは存在するか? | 存在する |
4 | インスタンスサイズに応じて自動で設定値が変わるサーバパラメータが存在するか? | 存在する |
なるほど、1番は意外でしたが、その他は予想通りの結果ですね。
AlloyDB for PostgreSQL はベースが PostgreSQL なので、サーバパラメータも PostgreSQL と類似であると考えています。 そのため、コミュニティ版 PostgreSQLのサーバパラメータとも比較してみたいと思います。
それでは、結果を個別に確認していきましょう!
1.WEBブラウザ上からサーバパラメータの設定値を確認できるか?
答:参照できません。
ブラウザ上では以下のように、設定値を確認できる項目がありません。
このため、サーバパラメータはDB上から直接確認するしかありません。
psql で接続して pg_settings や show all コマンドで以下のように確認する必要があります。
SELECT name, setting FROM pg_setting;
2.WEBブラウザ上からサーバパラメータを変更できるか?
答:変更可能です。
以下のように、変更したいパラメータをプルダウンから選択して、値を入力する方式で設定を変更できました。
- ① 変更する設定値の入力まで完了したサーバパラメータ
- ② 変更するサーバパラメータを選択し、値を入力する画面
- ③ さらに別のサーバパラメータを変更する場合に押下する箇所
もちろん、設定の反映に再起動を伴うようなパラメータについては、再起動に伴う利用不可のタイミングが生じますので、マルチAZでどのような制約、動作となるかは確認しておく必要がありそうです。
(例えば、スタンバイに適用してマスタとスイッチオーバすることでダウンタイムを極小化するなど)
※AlloyDBで使用されるサーバパラメータ一覧はWEBサイトに記載されていますので、
サーバパラメータごとに、変更時の再起動が必要かどうかが確認できます。
Supported database flags(AlloyDB for PostgreSQL パラメータ一覧)
3.AlloyDB固有のサーバパラメータは存在するか?
答:存在します。
コミュニティ版とAlloyDBのパラメータ数は以下の通り異なります。
製品名 | パラメータ数 |
コミュニティ版PostgreSQL | 349 |
AlloyDB for PostgreSQL | 396 |
コミュニティ版にしか存在しないサーバパラメータは存在しませんでした。
※AlloyDBではデフォルトで pg_stat_statementsが有効になっている状態だったので、その条件を合わせて数えています。
コミュニティ版PostgreSQL に存在しないサーバパラメータは以下になります。これらは以下の(1)~(3)のいずれかに分類できます。
(1)拡張機能の利用可否の設定(AlloyDBの公式ドキュメントのサーバパラメータ一覧に記載があり、説明もあるもの)
これらは、PostgreSQLの拡張機能や周辺ツールなどを使用するためのパラメータになります。必要に応じて利用する拡張機能を有効にすることができます。
- alloydb.enable_auto_explain
- alloydb.enable_pg_bigm
- alloydb.enable_pg_cron
- alloydb.enable_pg_hint_plan
- alloydb.enable_pg_wait_sampling
- alloydb.enable_pgaudit
- alloydb.logical_decoding
- alloydb.pg_shadow_select_role
コミュニティ版では、使いたい拡張機能をその都度インストールして追加していきますが、AlloyDBでは本体に拡張機能をあらかじめ組み込んでおき、設定で有効/無効を選択できるようにしているようです。
(2)Google Cloud固有のサーバパラメータ(AlloyDBの公式ドキュメントの一覧には記載されているが、設定項目の説明がないもの)
AlloyDBの公式ドキュメントに項目名と設定値の変更可否は記載されていますが、どのような制御を行うものか説明のないパラメータです。
設定値をどのように変更するべきかの方針が決められないため、現時点ではデフォルト設定を使用するのが良いと考えます。
- google_columnar_cache.columnar_cache_size_in_mb
- google_columnar_cache.columnar_hash_joins_cost_factor
- google_columnar_cache.enabled
- google_columnar_cache.force_group_columnar_hash_joins
- google_columnar_engine.columnar_hash_joins_cost_factor
- google_columnar_engine.enabled
- google_columnar_engine.force_group_columnar_hash_joins
- google_columnar_engine.memory_size_in_mb
- google_db_advisor.enabled
- google_insights.allocate_memory
- google_insights.enabled
- google_insights.max_aggregated_stats_entry
- google_insights.max_query_length
- google_insights.max_query_stats_entry
- google_insights.max_tag_stats_entry
- google_insights.num_query_plans_per_minute
- google_insights.num_trace_context_query_plans_per_minute
- google_insights.skip_acquired_sample_lock
- google_insights.trace_buffer_size_in_kb
- google_insights.track
- google_insights.track_client_address
- google_insights.track_comment
- google_insights.track_internal_metrics
- google_storage.replay_prefetcher_enabled
- google_storage.replay_prefetcher_log_min_messages
- google_storage.replay_prefetcher_max_block_reader_processes
- google_storage.replay_prefetcher_min_log_to_prefetch
- google_storage.replay_prefetcher_min_readahead_distance
- google_storage.replay_prefetcher_prefetch_interval
- google_storage.replay_prefetcher_tune_buffer_sizes
(3)Google Cloud固有のサーバパラメータ(AlloyDBの公式ドキュメントの一覧にも記載されていないもの)
こちらもGoogle Cloud固有のパラメータですが、AlloyDBの公式ドキュメントにパラメータ名自体の記載がないため、設定を変更するための基準がありません。
したがって、こちらも現時点ではデフォルト設定を利用するのが良いと考えます。
- alloydb.extension_maintenance
- add_partial_paths_with_sort_node
- alloydb.supported_extensions
- consider_partial_path_startup_cost
- log_wait_event_on_shutdown
- track_lockwait_timing
- track_misc_time
- track_wait_histogram
- track_wait_time
4.インスタンスサイズに応じて自動で設定値が変わるサーバパラメータが存在するか?
答:存在します。
高可用化構成の 4vCPU,32GBメモリのマシンタイプと、8vCPU,64GBメモリのマシンタイプで比較してみた結果、以下の4つのパラメータに差分が生じていました。
サーバパラメータ名 | AlloyDB(4vCPU 32GBメモリ) | AlloyDB(8vCPU 64GBメモリ) |
effective_cache_size | 1644180(12.5GB) | 3293178(25.1GB) |
google_storage.replay_prefetcher_max_block_reader_processes | 1 | 2 |
max_connections | 600 | 800 |
shared_buffers | 3288320(25GB) | 6586112(50.2GB) |
これらは、メモリサイズに依存して値が変わっているものと思われます。
※shared_buffers はオンプレでは物理搭載メモリの20%~25%程度を割り当てるのが定石ですが、
AlloyDBでは搭載メモリサイズの75%程度と、かなり大きめのメモリを確保しています。
コミュニティ版PostgreSQLのサーバパラメータとの差分
次に、コミュニティ版PostgreSQLのサーバパラメータのデフォルト値と比較してみましょう。
なお、コミュニティ版PostgreSQLは、バージョン14.0 のRPMをインストールして、$ initdb --no-locale -E UTF8
でDBクラスタを作成しています。
PostgreSQLとAlloyDBのサーバパラメータの設定値に差分があったもののうち、いくつか気になるところだけ抜粋します。
設定値からAlloyDBの運用方針やストレージ性能を生かそうとする使い方が少し見えてきますね。
サーバパラメータ名 | コミュニティ版 | AlloyDB | 備考 |
archive_timeout | 0 | 300 | 5分おきに強制アーカイブ |
effective_io_concurrency | 1 | 128 | 同時ディスクI/O操作数を増加 |
full_page_writes | on | off | 信頼性向上のため、オンプレではon推奨 |
huge_pages | try | on | 大きいDBを扱う場合、性能面で有利 |
lc_collate | C | en_US.UTF8 | コミュニティ版は initdb時に --no-locale指定 |
lc_ctype | C | en_US.UTF8 | コミュニティ版は initdb時に --no-locale指定 |
log_timezone | Asia/Tokyo | UTC | ログの時刻に注意 |
max_replication_slots | 10 | 60 | 少し多め |
max_wal_senders | 10 | 50 | 少し多め |
max_wal_size | 1024 | 1504 | - |
restart_after_crash | on | off | 障害時は自動リスタートしない |
server_encoding | UTF8 | SQL_ASCII | SQL_ASCIIだと日本語が格納できない |
ssl | off | on | - |
TimeZone | Asia/Tokyo | UTC | - |
track_io_timing | off | on | pg_stat_statements で収集する |
なお、AlloyDBのサーバパラメータ一覧には、タイムゾーン関連のパラメータなど、一部の記載がありませんでしたので、設定の変更が可能かどうかは実際に確認する必要があります。
Supported database flags(AlloyDB for PostgreSQL パラメータ一覧)
まとめ
AlloyDBのサーバパラメータは、設定値の変更はWEBブラウザ上から実施できますが、変更後は pg_settings や show all の値を取得して、設定が反映されていることを確認する必要があることがわかりました。
また、コミュニティ版の PostgreSQLに存在するサーバパラメータに加え、いくつかの固有のサーバパラメータが存在していることがわかりました。
ただし、固有のサーバパラメータについては変更方針が提示されていませんので、現時点で意識するのはPostgreSQLのサーバパラメータのみでよさそうです。
留意するべき点としては、デフォルトで作成されるデータベースのサーバエンコーディングが SQL_ASCIIのため、エンコーディングが SQL_ASCIIのままで問題ないかを確認する点です。
たとえば、日本語データを使用する場合は適切なサーバエンコーディングとロケールを指定してデータベースを作成する必要があります。
AlloyDBのサーバパラメータについて理解が深まったでしょうか?
本記事は以上となります!
PostgreSQLのことならNTTテクノクロスにおまかせください!
NTTテクノクロス株式会社ではPostgreSQLに関する各種のお問い合わせを受け付けています。
システムの導入、開発、維持管理の際にご活用ください。
Oracle、PostgreSQL 両方のデータベースを熟知。特にOracle→PostgreSQLへのデータベース移行が得意。 初めて触ったデータベースはOracle8i。のちにOracle10g RACを使ったシステムを構築し、 オラクルマスター10g GOLDを取得するも、いつの間にかPostgreSQLひとすじに。 当然のようにネコ好き。