本番環境用の Cloud SQL for PostgreSQL の設定

このドキュメントでは、本番環境用に Cloud SQL for PostgreSQL を設定する方法について説明します。Cloud SQL for PostgreSQL は、Google Cloud エコシステムと統合されているフルマネージド RDBMS サービスです。Cloud SQL for PostgreSQL には、次のような特長と機能があります。

  • VPC、保存データと転送中のデータの自動暗号化など、Google Cloud のマネージド セキュリティ機能を使用して、複数のアプリケーションとユーザーに対してグローバルにサービスを提供しています。
  • プライマリ インスタンスとスタンバイ インスタンスを使用する高可用性アーキテクチャと、インスタンス間の自動フェイルオーバーをサポートします。
  • 同じデータベース クラスタにあるマスターノードとリードレプリカとの間の読み取りと書き込みの分離を有効にすることによる、分散化されたデータベース ワークロードをサポートします。
  • Cloud Storage と自動化されたデータベース メンテナンスに統合されている自動バックアップをサポートします。
  • さまざまなオンライン トランザクション処理(OLTP)ワークロードをサポートします。

Cloud SQL for PostgreSQL インスタンスのデプロイ

Cloud SQL for PostgreSQL インスタンスは、Google Cloud Console または gcloud コマンドライン ツールを使用して簡単に設定できます。ここでは、両方の方法について説明します。

Console

  1. Cloud Console で、[SQL] > [インスタンス] ページに移動します。

    [インスタンス] に移動

  2. [インスタンスを作成] をクリックしてから、[PostgreSQL を選択] をクリックします。

  3. [PostgreSQL インスタンスの作成] ページで、次の詳細情報を入力します。

    • インスタンス ID: インスタンスの名前を入力します。インスタンス名は永続的であり、後から変更することはできません。
    • デフォルトのユーザー パスワード: デフォルトの管理者アカウントとして postgres ユーザーのパスワードを選択します(PostgreSQL インスタンスのデプロイ後に、追加のユーザーを作成できます)。
    • リージョンゾーン: リージョンとゾーンを選択します。関連する Google Cloud サービス(アプリケーションなど)と同じリージョンか、地理的にユーザーに近い場所に PostgreSQL インスタンスをデプロイし、データ処理のレイテンシを短縮することをおすすめします。選択したリージョンを後で変更することはできません。
    • データベースのバージョン: 最新バージョンを選択します。または、必要に応じて使用可能な最新バージョンを選択することもできます。
  4. [作成] をクリックして、PostgreSQL インスタンスをデプロイします。または、[設定オプションを表示] をクリックして、追加構成を設定します。

    PostgreSQL インスタンスの作成

    • 追加の構成オプション

      • 接続: 一般に、PostgreSQL インスタンスはパブリック IP アドレス、プライベート IP アドレス、承認済みネットワークを経由してネットワークに接続します。承認済みネットワークは、リモートからの接続を確立するために設定できる、許可される接続です。たとえば、クライアントの特定の IP アドレスからの接続を許可します。

        ネットワーク接続の設定。

      • マシンタイプとストレージ: 割り当てられているリソース(vCPU、RAM)、ストレージ タイプ(SSD または HDD)、ストレージの種類(SSD または HDD)、ストレージの容量に基づいてマシンタイプを選択します。ストレージ容量を増やすと、データベースでサポートされるディスク スループット(MB/秒)と読み取りと書き込みの IOP も増加します。予想されるディスク スループットと IOP の要件に基づいて、ストレージ容量を調整します。

        10 GB のストレージ容量。100 GB のストレージ容量。

      • 自動バックアップと高可用性: デフォルトで有効になっている自動バックアップ機能を使用して、自動バックアップを実行する時間枠を定義します。さらに、リードレプリカの作成には、ログ先行書き込みを使用するポイントインタイム リカバリ オプションも必要です。これらのログは定期的に更新され、保存容量を使用します。予期しないストレージの問題を回避するには、ポイントインタイム リカバリの使用時にストレージの自動増量を有効にすることをおすすめします。高可用性はデフォルトで無効になっています(マルチゾーン)。自動フェイルオーバーを有効にするには、[高可用性(リージョン)] オプションを選択します。

      • フラグ: この設定は、インスタンスの設定とパラメータを制御する Cloud SQL メソッドを指定します。これは、非マネージド PostgreSQL インスタンスの postgresql.conf ファイルと同等です。完全なリストについては、プロダクトのドキュメントをご覧ください。フラグの値を変更するか、新しいフラグを設定すると、インスタンスの再起動が必要になる場合があります。

      • メンテナンス: このセクションでは、バグの修正やマイナー バージョンのアップグレードなど、メンテナンス タスクを実行する優先時間枠を指定します。通常、メンテナンス オペレーションではインスタンスの再起動が必要になるため、サービスが一時的に中断する可能性があります。今後のメンテナンス イベントの通知をメールで受け取るように登録できます。

      • ラベル: このセクションでは、Key-Value ペアを定義して PostgreSQL インスタンスを分類します。次に例を示します。

        PostgreSQL インスタンスを分類する Key-Value ペアの定義。

gcloud

  1. PostgreSQL インスタンスを作成します。

    gcloud sql instances create postgresql01 \
        --cpu=2 \
        --memory=7680MB \
        --region=us-central1 --zone=us-central1-a
    
  2. PostgreSQL のデフォルト ユーザーにパスワードを割り当てます(構文の例)。

    gcloud sql users set-password postgres \
        --instance INSTANCE_NAME \
        --password PASSWORD
    

    以下の追加オプションを指定できます。

    • データベースのバージョン: サポートされている PostgreSQL のバージョンのいずれか。
    • ストレージ タイプ: SSD または HDD のいずれかのストレージ タイプ。
    • ストレージ容量: インスタンスの初期のストレージ設定です。
    • ストレージの自動増量: 空き容量が少なくなった場合にストレージを追加する Cloud SQL の自動化機能。
    • 高可用性: Cloud SQL の高可用性。
    • 自動バックアップ: バックアップの開始時間枠。
    • ポイントインタイム リカバリ: ポイントインタイム リカバリとログ先行書き込み。
    • メンテナンスの時間枠: Cloud SQL で中断を伴うメンテナンスを実行できる 1 時間の時間枠。
    • メンテナンスのタイミング: PostgreSQL インスタンスで更新を実行する場合に優先されるタイミング。以前の更新についてはプレビューを指定し、後で更新する場合は本番環境を指定します。
    • データベース フラグ: 設定とパラメータを制御する PostgreSQL データベース フラグ。

    次の gcloud コマンドは、追加のオプションを指定して Cloud SQL for PostgreSQL インスタンスを作成します。

    gcloud sql instances create postgresql01 \
        --cpu=2 \
        --memory=7680MB \
        --region=us-central1 \
        --zone=us-central1-a \
        --database-version=POSTGRES_12 \
        --storage-type=SSD \
        --storage-size=100 \
        --storage-auto-increase \
        --availability-type=regional \
        --backup-start-time=23:30 \
        --enable-point-in-time-recovery \
        --maintenance-window-day=sun \
        --maintenance-window-hour=11 \
        --maintenance-release-channel=production \
        --database-flags max_connections=100
    

    詳細については、インスタンスの作成をご覧ください。

インスタンスの選択

インスタンスの選択またはサイズ設定には、Cloud SQL for PostgreSQL の Oracle® ワークロードをサポートするマシンタイプを選択します。インスタンス タイプは、次の 2 つのメイングループに分かれています。

  • 共有コアマシン - 費用対効果に優れています。
  • 専用コア インスタンス: 複数の vCPU とメモリ比率をサポートします。

インスタンス タイプの詳細については、Cloud SQL の料金をご覧ください。

インスタンスのサイズを調整するには、まずソース データベースに割り当てられて使用されているリソースを分析します。Oracle データベース リソースの設定は、V$OSSTAT システムビューまたは Oracle AWR レポートから取得できます(次の例を参照)。

物理メモリ(データベース サーバーの物理メモリの総バイト数):

SQL> SELECT ROUND(MAX(VALUE)/1024/1024/1024) AS MEM_SIZE_GB
     FROM V$OSSTAT
     WHERE STAT_NAME = 'PHYSICAL_MEMORY_BYTES';

割り当てられたメモリ:

SQL> SELECT NAME, VALUE, DISPLAY_VALUE FROM V$PARAMETER
     WHERE NAME LIKE '%sga%' OR NAME LIKE '%memory%';

CPU コア(利用可能な CPU コア数)

SQL> SELECT VALUE FROM V$OSSTAT
     WHERE STAT_NAME = 'NUM_CPU_CORES';

CPU コアV$LICENSE ビューを使用する Oracle インスタンスが識別):

SQL> SELECT CPU_CORE_COUNT_CURRENT FROM V$LICENSE;

Oracle AWR レポート リソースの例(Oracle AWR レポートは、特定の Oracle インスタンスのワークロード特性に関する追加の分析情報を表示できます)。

Oracle AWR レポートに表示されるリソース情報の例。

ソース データベースのリソース情報がある場合、最も近い Cloud SQL インスタンス タイプを選択し、いくつかのベンチマークを実行することをおすすめします。ベンチマークの結果は、インスタンスの選択を確定する際に有用です。

高可用性の構成

Oracle の Data Guard と同様に、障害復旧ソリューションを実装することを目的として、Cloud SQL for PostgreSQL は、クラスタのプライマリ インスタンスからスタンバイ インスタンスへの自動フェイルオーバーを実現する高可用性機能を備えています。スタンバイ インスタンスは、プライマリ インスタンスと同じリージョン内の別のゾーンに配置されています。プライマリ インスタンスとスタンバイ インスタンスの永続ディスク間の同期レプリケーションによって、スタンバイ インスタンスは同期された状態で維持されます。この方法では、プライマリへのデータ変更もすべてスタンバイに適用されます。

応答しないインスタンスやゾーンレベルの障害などのプライマリでの障害が発生した場合、Cloud SQL は自動フェイルオーバーを実行します。プライマリ インスタンスは(1 秒間隔の)ハートビートでモニタリングされています。プライマリ インスタンスからハートビートが受信されなくなってから約 60 秒が経過すると、フェイルオーバーがアクティブになります。この時点でプライマリ インスタンスはスタンバイ インスタンスにフェイルオーバーされ、アプリケーションとクライアントは透過的にデータにアクセスできる一方、既存のリードレプリカはそのまま動作し続けます。Active Data Guard とは異なり、スタンバイ インスタンスはスタンバイとして動作する間、読み取り用に開かれていません。Cloud SQL では、リードレプリカはプライマリからの読み込みをオフロードするためにのみ使用できます。

Cloud SQL for PostgreSQL 高可用性(HA)機能は、インスタンスの作成時か、または既存の PostgreSQL インスタンスで有効にできます。手順は次のとおりです。

Console

  1. インスタンスの作成ページで、[設定オプションを表示] > [自動バックアップと高可用性] > [可用性] をクリックしてから、[高可用性(リージョン)] オプションを選択します。
  2. 既存の PostgreSQL インスタンスの場合は、前述の手順に沿って PostgreSQL インスタンスを編集します。この場合は、データベースを再起動する必要があります。
  3. テストのフェイルオーバーを開始するには、[Cloud SQL] ページに移動し、[フェイルオーバー] をクリックします。

    テスト用のフェイルオーバーの開始。

    フェイルバックも同じ方法で有効にできます。

gcloud

  1. availability-type パラメータを regional に設定して HA を有効にします。

    gcloud sql instances create postgresql01 \
        --cpu=2 \
        --memory=7680MB \
        --region=us-central1 \
        --zone=us-central1-a \
        --availability-type=regional
    
  2. 既存の PostgreSQL インスタンスに HA が構成されているかどうかを確認します。

    gcloud sql instances describe INSTANCE_NAME
    

    このコマンドの出力に availabilityType: REGIONAL が含まれている場合、HA はすでに有効になっています。出力に availabilityType: ZONAL が含まれている場合、HA は構成されておらず、patch コマンドを使用して有効にできます。

    gcloud sql instances patch INSTANCE_NAME --availability-type REGIONAL
    
  3. プライマリからスタンバイへのフェイルオーバー テストを開始します。

    gcloud sql instances failover PRIMARY_INSTANCE_NAME
    

    フェイルバックするには、新しいプライマリで同じフェイルオーバー コマンドを実行します。

管理ユーザーとアカウント

2 つのデフォルトの PostgreSQL ユーザー アカウントには、初期状態ですべての Cloud SQL for PostgreSQL がインストールされています。これらのアカウントは postgrescloudsqlimportexport です。

postgres アカウント

postgres アカウントは管理者アカウントであり、Cloud PaaS の Oracle の SYS ユーザーまたは SYSTEM ユーザーと同等です。Cloud SQL for PostgreSQL はマネージド サービスであるため、postgres のユーザーは Oracle の SYS ユーザーや SYSTEM ユーザーとは異なり、高度な権限を必要とする特定のシステム プロシージャとテーブルへのアクセスを制限します。

postgres ユーザーは cloudsqlsuperuser ロールに含まれ、CREATEROLECREATEDBLOGIN 属性(特権)を持っています。SUPERUSER または REPLICATION 属性は持っていません。

cloudsqlimportexport アカウント

CSV のインポート / エクスポート オペレーションに必要な最小限の権限セットを使用して、cloudsqlimportexport アカウントが作成されます。これらのオペレーションを実行する独自のユーザーを作成することもできますが、作成しない場合はデフォルトの cloudsqlimportexport ユーザーが使用されます。cloudsqlimportexport ユーザーはシステム ユーザーであり、ユーザーが直接使用することはできません。

アカウントの管理(パスワードの追加、削除、変更)

アカウント管理では、新しいユーザー アカウントの作成、既存アカウントのパスワードの変更、不要になったアカウントの削除を行います。これらのアカウントの操作は、Cloud Console、gcloud ツール、PostgreSQL クライアントから実行できます。

Console

  1. Cloud Console から既存のアカウントの一覧を表示します。[Cloud SQL Console] > [PostgreSQL インスタンスを選択] > [ユーザー] の順に移動します。

    既存のアカウントの一覧表示。

  2. アカウントのパスワードを変更するか、アカウントの横にある 3 つの点(その他)アイコンをクリックしてアカウントを完全に削除します。

    この画面で、[ユーザー アカウントを作成] をクリックして、新しい PostgreSQL ユーザーを作成できます。

    パスワードの変更とアカウントの削除。

gcloud

  1. 既存のユーザー アカウントの一覧を表示します。

    gcloud sql users list --instance=postgresql01
    

    出力は次のようになります。

    NAME       HOST
    Postgres
    
  2. appuser ユーザー アカウントを作成し、パスワードを設定して、appuser を削除します。

    gcloud sql users create appuser \
        --instance=postgresql01 --password=PASSWORD
    
    gcloud sql users set-password appuser \
        --host=% --instance=postgresql01 --prompt-for-password
    
    gcloud sql users delete appuser --instance=postgresql01
    

PostgreSQL

  • 同じ操作を標準の PostgreSQL クライアントから直接実行します。次に例を示します。

    postgres=> create user appuser with login password 'my_password';
    
    postgres=> alter user appuser password 'my_password';
    
    postgres=> drop user appuser;
    

    PostgreSQL データベース レベルの権限(特定のテーブルまたはビューからの読み取りなど)を構成するには、PostgreSQL クライアントから GRANT / REVOKE コマンドを使用します。

モニタリングとアラート

Cloud Logging は、Google Cloud におけるメインのロギングツールです。このツールは、Cloud SQL for PostgreSQL などのリソースのモニタリング ログの収集と表示に使用されます。

Cloud Logging では、次のスクリーンショットのように、イベントレベル(重大、エラー、警告など)、イベントの期間、およびフリーテキスト検索でフィルタリングされた Cloud SQL for PostgreSQL のログを確認できます。

Cloud Logging でログを表示する

PostgreSQL データベース インスタンスのモニタリング

Oracle の主なモニタリング ツールは、Enterprise Manager と Grid / Cloud Control です。これらのツールを使用すると、データベース セッションと SQL ステートメント レベルで、データベース インスタンスをリアルタイムでモニタリングできます。

Cloud SQL for PostgreSQL は、Cloud Console を介した同等のモニタリング機能を備えています。この画面で、CPU 使用率、ストレージ使用量、メモリ使用量、読み取り / 書き込みオペレーション、アクティブな接続、1 秒あたりのトランザクション数、上り(内向き) / 下り(外向き)バイト数など、データベース インスタンスの要約ビューを確認できます。Google Cloud のオペレーション スイートは、プライマリ レプリカとリードレプリカ間の自動フェイルオーバー リクエストやレプリケーション ラグなど、Cloud SQL for PostgreSQL を対象とする追加のモニタリング指標を備えています。

次のサンプルグラフは、過去 6 時間の 1 秒あたりのトランザクション数のグラフを示しています。

過去 6 時間の 1 秒あたりのトランザクション数を表すグラフ。

リードレプリカのモニタリング

プライマリ インスタンスのモニタリングと同じ方法で Cloud Console からリードレプリカをモニタリングできます。プライマリ インスタンスとリードレプリカ インスタンス間のレプリケーション ステータスを確認する特定の指標があります。これらの指標は、Cloud Console のリードレプリカ インスタンスの概要ページに入力するために使用されます。

また、コマンドラインからレプリケーションのステータスを確認することもできます。

gcloud sql instances describe REPLICA_NAME

3 つ目の方法は、PostgreSQL クライアントを介してレプリケーションのステータスを確認することです。次の PostgreSQL コマンドでは、リードレプリカのステータスを確認します。

postgres=> \x on
Expanded display is on.
postgres=> select * from pg_stat_replication;
-[ RECORD 1 ]----+-------------------------------------------
pid              | 74733
usesysid         | 16388
usename          | cloudsqlreplica
application_name | PROJECT_ID:REPLICA_NAME
client_addr      | REPLICA_IP
client_hostname  |
client_port      | 41660
backend_start    | 2020-09-28 06:59:38.783981+00
backend_xmin     |
state            | streaming
sent_lsn         | 0/2939FFA8
write_lsn        | 0/2939FFA8
flush_lsn        | 0/2939FFA8
replay_lsn       | 0/2939FFA8
write_lag        |
flush_lag        |
replay_lag       |
sync_priority    | 0
sync_state       | async
reply_time       | 2020-09-28 07:17:52.714969+00
postgres=>

PostgreSQL データベースのモニタリング

このセクションでは、PostgreSQL DBA のルーティンとみなされる追加モニタリング タスクについて説明します。

セッション モニタリング

Oracle セッションは、V$ ビューと呼ばれる動的パフォーマンス ビューに対してクエリを実行することでモニタリングされます。SQL ステートメントによる現在のデータベース アクティビティに関する分析情報をリアルタイムで確認するには、一般に V$SESSIONV$PROCESS のビューを使用します。PostgreSQL コマンドと SQL ステートメントの両方を使用して、同様の方法で PostgreSQL のセッション アクティビティをモニタリングできます。

PostgreSQL の pg_stat_activity 動的ビューは、現在のデータベース セッション アクティビティに関する詳細情報を表示します。

postgres=> \x on
postgres=> select * from pg_stat_activity where backend_type = 'client backend' and usename != 'cloudsqladmin';
-[ RECORD 1 ]----+-----------------------------------------------------------------------------------------------------
datid            | 14052
datname          | postgres
pid              | 74750
usesysid         | 16389
usename          | postgres
application_name | psql
client_addr      | CLIENT_IP
client_hostname  |
client_port      | 51904
backend_start    | 2020-09-28 07:01:30.214099+00
xact_start       | 2020-09-28 07:28:48.982115+00
query_start      | 2020-09-28 07:28:48.982115+00
state_change     | 2020-09-28 07:28:48.982117+00
wait_event_type  |
wait_event       |
state            | active
backend_xid      |
backend_xmin     | 88513
query            | select * from pg_stat_activity where backend_type = 'client backend' and usename != 'cloudsqladmin';
backend_type     | client backend
postgres=>

長時間トランザクションのモニタリング

パフォーマンスの問題につながる可能性がある長時間実行トランザクションを特定するには、pg_stat_activity 動的ビューに対してクエリを実行します。長時間実行クエリを識別するには、列に query_startstate などの適切なフィルタを適用します。

ロックのモニタリング

pg_locks 動的ビューを使用してデータベース ロックをモニタリングできます。このビューで、パフォーマンスの問題につながる可能性のあるロック競合に関するリアルタイムの情報を確認できます。

アラート

モニタリングとロギングに加えて、アラートを使用できます。条件に対するアラートを作成することもできます。

スケーリング

Cloud SQL for PostgreSQL は、垂直方向と水平方向の両方のスケーリング オプションをサポートしています。

インスタンスに割り当てられる CPU とメモリの数を増やすなど、Cloud SQL インスタンスにリソースを追加して、垂直方向にスケーリングします。インスタンスのネットワーク スループットは、CPU とメモリに選択した値によって異なります。

Cloud SQL は最大 30 TB のストレージ容量をサポートしています。一般的に、ストレージ容量を追加すると、インスタンスのスループットとディスク IOP が増加します。Cloud SQL インスタンスのネットワーク スループットには、データの読み取り / 書き込み(ディスク スループット)、クエリの内容、計算、データベースに格納されないその他のデータも含まれます。Cloud SQL インスタンスを垂直方向にスケーリングするときは、これらの要因を考慮することが重要です。

リードレプリカを作成して、水平方向にスケーリングします。リードレプリカを使用すると、プライマリ インスタンスのパフォーマンスと可用性に影響を与えることなく、読み取りワークロードを別の Cloud SQL インスタンスにスケーリングできます。

バックアップとリカバリ

Cloud SQL for PostgreSQL には、オンデマンドと自動の 2 つのデータベースのバックアップ方法があります。オンデマンド バックアップはいつでも実行でき、削除するまで保持されます。自動バックアップでは 4 時間のバックアップ期間が使用され、7 日間保持されます。

Cloud SQL for PostgreSQL データベースのバックアップは、同じインスタンスに復元、既存データの上書きによって復元、または新しいインスタンスに復元できます。また、Cloud SQL for PostgreSQL では、ポイントインタイム リカバリが有効になっており、自動バックアップ オプションが有効になっている限り、特定の時点に PostgreSQL データベースを復元できます。

Cloud SQL for PostgreSQL は、データベースのクローン作成機能を備えています。クローンは、プライマリ インスタンスから作成する必要があります(つまり、レプリカから作成することはできません)。データベースのバックアップ、復元、クローン作成は Cloud Console または gcloud ツールから実行できます。

自動化

Cloud SQL Admin API を使用すると、Cloud SQL for PostgreSQL インスタンスの管理を完全に自動化できます。Cloud SQL Admin API は、インスタンス、データベース、ユーザー、フラグ、オペレーション、SslCerts、Tiers、BackupRuns などのさまざまな種類のリソースを制御する REST API です。詳細については、API ドキュメントをご覧ください。

次のステップ