PostgreSQL レプリケーションで実現する分散システム!ピアツーピアとマスタースレーブ徹底比較

2024-05-27

PostgreSQLにおけるストリーミングレプリケーションと論理レプリケーションの違い

ストリーミングレプリケーション(物理レプリケーション)

ストリーミングレプリケーションは、物理的なWAL(Write-Ahead Logging)レコードをマスターサーバーからレプリケーションサーバーへ送信することで、データベース全体をリアルタイムに複製します。マスターサーバーで行われたすべての変更が、レプリケーションサーバーに同期されます。

特徴:

  • リアルタイムに近い同期: 変更がマスターサーバーにコミットされるとすぐに、レプリケーションサーバーに反映されます。
  • 高可用性: マスターサーバーが障害発生した場合、レプリケーションサーバーが直ちに引き継ぎ、ダウンタイムを最小限に抑えることができます。
  • シンプルな設定: セットアップと構成が比較的簡単です。

制約事項:

  • マスターとレプリケーションサーバーのバージョン互換性: マスターサーバーとレプリケーションサーバーは、メジャーバージョンが一致する必要があります。
  • OSとハードウェアアーキテクチャの互換性: マスターサーバーとレプリケーションサーバーは、OSハードウェアアーキテクチャが同じである必要があります。
  • すべての変更をレプリケート: データベース全体が複製されるため、レプリケーションサーバーに大きな負荷がかかる可能性があります。

論理レプリケーション

論理レプリケーションは、論理的な操作(INSERT、UPDATE、DELETEなど)をレプリケーションサーバーに送信することで、データベースの一部または全体を複製します。WALレコードではなく、変更内容を記述した論理形式のメッセージが送信されます。

  • 柔軟なレプリケーション: 特定のテーブル、スキーマ、またはデータベースのみをレプリケートすることができます。
  • 異機種レプリケーション: 異なるメジャーバージョンのPostgreSQLサーバー間でレプリケーションを行うことができます。
  • カスタマイズ可能なレプリケーション: レプリケートする操作をフィルタリングしたり、変換したりすることができます。
  • 複雑な設定: ストリーミングレプリケーションよりも設定と構成が複雑です。
  • 遅延の可能性: 論理操作を理解して変換する必要があるため、ストリーミングレプリケーションよりも遅延が発生する可能性があります。
  • すべての機能がレプリケートされない: トリガーやストアドプロシージャなどのすべてのデータベース機能はレプリケートされない場合があります。

ストリーミングレプリケーションと論理レプリケーションは、それぞれ異なる長所と短所を持っています。

  • リアルタイムの同期と高可用性が重要な場合は、ストリーミングレプリケーションが適しています。
  • 柔軟性とカスタマイズ可能性が重要な場合は、論理レプリケーションが適しています。

最適なレプリケーション方法は、個々の要件によって異なります。




    PostgreSQLにおけるストリーミングレプリケーションと論理レプリケーションのサンプルコード

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

    以下のコマンドは、master という名前のサーバーをプライマリサーバーとして設定し、replica という名前のサーバーをスタンバイサーバーとして設定するストリーミングレプリケーションを構成します。

    # マスターサーバー側
    ALTER SYSTEM SET replication_mode = 'stream';
    CREATE USER repuser WITH PASSWORD 'mypassword';
    GRANT REPLICATION TO repuser;
    
    # スタンバイサーバー側
    ALTER SYSTEM SET replication_mode = 'stream';
    RECOVER PUBLICATION pglogical FROM 'master' USER repuser PASSWORD 'mypassword';
    

    以下のコマンドは、mydatabase という名前のデータベースの論理レプリケーションを構成します。mytable という名前のテーブルの変更のみがレプリケートされます。

    # パブリッシャー側
    CREATE PUBLICATION mypublication FOR TABLE mytable;
    GRANT PUBLICATION mypublication TO repuser;
    
    # サブスクライバー側
    CREATE SUBSCRIPTION mysubscription
        CONNECTION 'dbname=mydatabase user=repuser password=mypassword';
    

    説明:

    • 上記の例は基本的な構成のみを示しており、本番環境で使用するにはさらなる設定が必要な場合があります。
    • 詳細については、PostgreSQLの公式ドキュメントを参照してください。



      トリガーベースレプリケーションは、データベースの変更を検出して、それを別のデータベースに複製するトリガーを使用して実現します。これは、特定の操作のみをレプリケートする必要がある場合に役立ちます。

      マスタースレーブレプリケーションは、複数のスレーブサーバーにマスターサーバーのデータを複製する古い方法です。これは、ストリーミングレプリケーションよりも古く、非推奨の方法です。

      ウォームスタンバイは、スタンバイサーバーをできるだけ同期状態に保ち、障害発生時に迅速に引き継げるようにするものです。これは、高可用性のための一般的な手法です。

      ピアツーピアレプリケーションは、複数のサーバー間でデータを複製する方法です。これは、分散システムで役立ちます。


        database postgresql database-replication


        画像をファイルシステムに保存するその他の方法:クラウドストレージ、オブジェクトストレージ、分散ファイルシステム

        最も単純な方法は、画像ファイルを直接ファイルシステムに保存することです。この方法は、ファイルの数やサイズが少ない場合に適しています。メリット:実装が簡単高速なアクセスファイル管理が複雑になる拡張性が低い画像ファイルをデータベースに保存する方法もあります。データベースは、画像ファイルの管理と検索を容易にするための強力なツールです。...


        【超解説】 Rails で多態性アソシエーションを使いこなす:外部キー制約、STI、その他の方法

        外部キー制約は、データベースで関連レコード間の整合性を維持するために使用される制約です。多態性アソシエーションでは、関連レコードがどのモデルに属しているのかを明確に特定できないため、外部キー制約を設定することができません。例:Comment モデルと Post モデル、Article モデルを想定します。Comment モデルは、Post または Article のいずれかに関連付けられます。...


        【決定版】PostgreSQLでタイムスタンプ差を計算する3つの方法を徹底比較

        EXTRACT() 関数を使用する最もシンプルで分かりやすい方法が、EXTRACT() 関数を使用する方法です。この関数は、タイムスタンプから指定された時間単位の値を抽出することができます。このクエリは、your_table テーブルの timestamp_end と timestamp_start カラムの差を時間単位で抽出し、time_diff_hours という名前の別名で返します。...


        新しい行が挿入された時にタイムスタンプフィールドを自動的に挿入する

        デフォルト値を使用するテーブル定義時にtimestamp型フィールドにデフォルト値をCURRENT_TIMESTAMPと設定することで、新しい行が挿入された際に自動的に現在時刻が挿入されます。トリガーを使用するトリガーは、特定のデータベース操作が発生した際に実行される手続きです。新しい行が挿入されたときにトリガーを実行し、そのトリガー内でCURRENT_TIMESTAMPを使用してタイムスタンプフィールドを更新することができます。...


        PostgreSQL INSERT文にUUIDを生成する3つの方法(uuidgenコマンド、uuid_generate_v4()関数、DEFAULT制約)

        gen_random_uuid()関数を使うPostgreSQL 8.4以降では、pgcryptoモジュールに含まれるgen_random_uuid()関数を用いて、バージョン4のUUIDを生成できます。この関数は、ランダムに生成されたUUIDを返します。...