PostgreSQL ストリーミングレプリケーション

PostgreSQLPostgreSQLBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験(Lab)では、PostgreSQL のストリーミングレプリケーションの設定方法を学びます。このメカニズムは、プライマリサーバからレプリカサーバへ Write-Ahead Logging (WAL) レコードを継続的に送信および適用し、ほぼリアルタイムのデータ同期を保証します。

ストリーミングレプリカを設定し、レプリケーションラグとステータスを確認し、レプリカからデータをクエリし、レプリケーションを安全にシャットダウンします。これには、レプリカからの接続を許可するようにpostgresql.confを変更してプライマリサーバを準備し、wal_levelreplicaに設定し、max_wal_sendersを調整することが含まれます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL postgresql(("PostgreSQL")) -.-> postgresql/PostgreSQLGroup(["PostgreSQL"]) postgresql/PostgreSQLGroup -.-> postgresql/db_setup("Create New Database") postgresql/PostgreSQLGroup -.-> postgresql/db_access("Connect To Database") postgresql/PostgreSQLGroup -.-> postgresql/data_all("Select All Data") postgresql/PostgreSQLGroup -.-> postgresql/db_status("Check Database Status") postgresql/PostgreSQLGroup -.-> postgresql/db_drop("Drop Entire Database") subgraph Lab Skills postgresql/db_setup -.-> lab-550962{{"PostgreSQL ストリーミングレプリケーション"}} postgresql/db_access -.-> lab-550962{{"PostgreSQL ストリーミングレプリケーション"}} postgresql/data_all -.-> lab-550962{{"PostgreSQL ストリーミングレプリケーション"}} postgresql/db_status -.-> lab-550962{{"PostgreSQL ストリーミングレプリケーション"}} postgresql/db_drop -.-> lab-550962{{"PostgreSQL ストリーミングレプリケーション"}} end

プライマリサーバの設定

このステップでは、ストリーミングレプリケーションを許可するようにプライマリ PostgreSQL サーバを設定します。これには、postgresql.confファイルとpg_hba.confファイルの変更が含まれます。

  1. PostgreSQL サーバへの接続:

    ターミナルを開き、postgresユーザとして PostgreSQL サーバに接続します。

    sudo -u postgres psql
  2. postgresql.confの変更:

    \qと入力して Enter キーを押して、psqlシェルを終了します。

    次に、nanoを使用してpostgresql.confファイルを開きます。

    sudo nano /etc/postgresql/14/main/postgresql.conf

    次のパラメータを見つけて、次のように変更します。

    • listen_addresses: すべてのアドレスからの接続を許可するように'*'に変更します。本番環境では、これをレプリカの IP アドレスに制限することをお勧めします。

      listen_addresses = '*'
    • wal_level: replicaに設定します。これにより、レプリケーションに必要な情報が WAL に確実に書き込まれます。

      wal_level = replica
    • max_wal_senders: 10に設定します。これは、スタンバイサーバからの同時接続の最大数を指定します。

      max_wal_senders = 10

    変更を保存してnanoを終了します。

  3. pg_hba.confの変更:

    pg_hba.confファイルを開きます。

    sudo nano /etc/postgresql/14/main/pg_hba.conf

    レプリカサーバがレプリケーションのために接続できるように、次の行をファイルの末尾に追加します。これはシングルマシン構成であるため、127.0.0.1を使用します。

    host    replication     all             127.0.0.1/32            trust

    変更を保存してnanoを終了します。

  4. プライマリサーバの再起動:

    PostgreSQL サーバを再起動して、変更を適用します。

    sudo pg_ctlcluster 14 main restart

    次のような出力が表示されるはずです。

    Waiting for server to shut down.... done
    server stopped
    server starting

レプリカサーバの設定

このステップでは、プライマリサーバから WAL レコードをストリームするようにレプリカサーバを設定します。

  1. プライマリサーバの停止:

    プライマリ PostgreSQL サーバを停止します。

    sudo pg_ctlcluster 14 main stop
  2. ベースバックアップの取得:

    pg_basebackupを使用して、プライマリサーバのデータディレクトリのベースバックアップを取得します。これにより、データファイルがレプリカのデータディレクトリ(~/project/replica_data)にコピーされます。

    sudo pg_basebackup -h localhost -p 5432 -U postgres -D ~/project/replica_data -X stream -P -v

    postgresユーザのパスワードを求められます。labexと入力します。

  3. standby.signalファイルの作成:

    レプリカのデータディレクトリにstandby.signalファイルを作成します。このファイルは、このインスタンスをホットスタンバイとして起動する必要があることを PostgreSQL に通知します。

    touch ~/project/replica_data/standby.signal
  4. レプリカサーバの起動:

    レプリカサーバを起動し、~/project/replica_dataディレクトリを指定します。

    sudo pg_ctlcluster 14 main start -D ~/project/replica_data

レプリケーションステータスの確認とテストテーブルの作成

このステップでは、レプリケーションステータスを確認し、レプリケーションを検証するためにプライマリサーバにテストテーブルを作成します。

  1. プライマリサーバへの接続:

    プライマリ PostgreSQL サーバに接続します。

    sudo -u postgres psql
  2. レプリケーションステータスの確認:

    次の SQL クエリを実行して、レプリケーションステータスを表示します。

    SELECT
        pid,
        client_addr,
        state,
        sync_state,
        pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn) AS write_lag,
        pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_lag
    FROM pg_stat_replication;

    このクエリは、レプリケーション接続に関する情報を示します。write_lagreplay_lagが 0 に近い場合、レプリカが同期されていることを示します。

  3. テストテーブルの作成:

    test_tableという名前のテーブルを作成します。

    CREATE TABLE test_table (
        id SERIAL PRIMARY KEY,
        name VARCHAR(255)
    );

    テーブルにデータを挿入します。

    INSERT INTO test_table (name) VALUES ('Replica Test Data 1');
    INSERT INTO test_table (name) VALUES ('Replica Test Data 2');

    プライマリサーバでpsqlを終了します。

    \q

レプリカサーバからのデータクエリ

このステップでは、レプリカサーバに接続し、test_tableをクエリして、データがレプリケートされていることを確認します。

  1. レプリカサーバへの接続:

    レプリカ PostgreSQL サーバに接続します。

    sudo -u postgres psql -h localhost -p 5432 -d postgres -W

    postgresユーザのパスワードを求められます。labexと入力します。

  2. test_tableのクエリ:

    次のクエリを実行して、test_tableからすべてのデータを選択します。

    SELECT * FROM test_table;

    プライマリサーバに挿入したデータが表示されるはずです。

     id |       name
    ----+-----------------------
      1 | Replica Test Data 1
      2 | Replica Test Data 2
    (2 rows)

    データが表示されれば、レプリケーションは正しく機能しています。

  3. プライマリサーバへのデータの追加挿入:

    プライマリサーバに接続されているターミナルに戻り、新しい行を挿入します。

    sudo -u postgres psql -c "INSERT INTO test_table (name) VALUES ('Replica Test Data 3');"
  4. レプリカサーバの再クエリ:

    レプリカサーバに接続されているターミナルに戻り、再度 select クエリを実行します。

    SELECT * FROM test_table;

    新しいデータが表示されるはずです。

     id |       name
    ----+-----------------------
      1 | Replica Test Data 1
      2 | Replica Test Data 2
      3 | Replica Test Data 3
    (3 rows)
  5. レプリカサーバの終了:

    レプリカサーバでpsqlを終了します。

    \q

レプリケーションの安全なシャットダウン

このステップでは、レプリケーション設定を安全にシャットダウンします。

  1. レプリカサーバのシャットダウン:

    レプリカサーバをシャットダウンします。

    sudo pg_ctlcluster 14 main stop -D ~/project/replica_data
  2. プライマリサーバのシャットダウン:

    プライマリサーバをシャットダウンします。

    sudo pg_ctlcluster 14 main stop
  3. クリーンアップ (オプション):

    レプリケーション設定を削除する場合は、レプリカデータディレクトリを削除できます。 これを行う際は、レプリカ上のすべてのデータが削除されるため、十分に注意してください。

    sudo rm -rf ~/project/replica_data

    また、レプリケーションが不要になった場合は、プライマリサーバのpostgresql.confおよびpg_hba.confに対する変更を元に戻します。

    • postgresql.confの復元:

      sudo nano /etc/postgresql/14/main/postgresql.conf

      wal_levelminimalに戻します。

      wal_level = minimal

      max_wal_senders0に戻します。

      max_wal_senders = 0

      listen_addresseslocalhostに戻します。

      listen_addresses = 'localhost'

      変更を保存してエディタを終了します。

    • pg_hba.confの復元:

      sudo nano /etc/postgresql/14/main/pg_hba.conf

      レプリケーション用に追記した行を削除します。

      変更を保存してエディタを終了します。

    • プライマリサーバの再起動:

      プライマリサーバを再起動して、構成の変更を適用します。

      sudo pg_ctlcluster 14 main restart

まとめ

この実験(Lab)では、PostgreSQL データベースのストリーミングレプリカを構成しました。これには、プライマリサーバ上のpostgresql.confファイルとpg_hba.confファイルの変更、ベースバックアップの取得、レプリカサーバの構成、およびレプリケーションが正しく機能していることの確認が含まれます。また、レプリケーション設定を安全にシャットダウンする方法も学びました。