pg論理レプリケーションシリーズで論理レプリケーションの該当するシナリオと原則を紹介します(1)

著者:ハンハイPGラボ(Highgo PGラボ)-Xiao Yu

この記事は、pg論理レプリケーションに関する一連の記事の最初の部分に属しています。著者は、論理レプリケーションの原理、構築、および保守を紹介するために、3つの部分に分割する予定です。興味のある友人は引き続き関連する原則と、操作レコードの基になるpgバージョン。pg12.4の場合。

1.論理レプリケーションのアプリケーションシナリオ

postgresqlデータベースを本番データベースとして使用する場合、ストリーミングレプリケーションを使用してデータベースのホットバックアップを実装することがよくあります。元のプライマリデータベースに障害が発生した場合、スタンバイデータベースはプライマリデータベースにすばやく切り替えて、ビジネスのダウンタイムを削減できます。ストリーミングレプリケーションは、データベースの物理レベルでのデータ同期です。実際の使用シナリオでは、いくつかの満たされていない要件があります。たとえば、州の企業の特定のビジネステーブルでは、すべての都道府県や都市のビジネスデータを収集する必要があります。本社のテーブルが更新されます。会社はこの基本テーブルをリアルタイムで同期する必要があります。上記のシナリオでは、物理レプリケーションを満たせません。現時点では、論理レプリケーションを使用してこれらの要件を満たすことができます。
論理レプリケーションの使用シナリオ:

  • ライブラリまたはテーブルの一部のレプリケーション要件を指定します
  • 複数のデータベースインスタンスからのデータを同じターゲットデータベースに集約します
  • 1つのライブラリから複数の異なるライブラリにデータを配布する
  • 異なるバージョン間でコピーする
  • 異なるライブラリ名間のテーブル同期

第二に、論理レプリケーションの原則

論理レプリケーションは、WALログの論理分析に基づいています。WALログは、ORACLEのREDOログとして理解できます。論理レプリケーションの原則は、パブリッシング側のメインライブラリがパブリケーション内のテーブルのWALログを特定の形式に解析し、スタンバイライブラリのサブスクリプションに送信することです。サブスクリプションは解析されたWALログを受信した後、再生します。アプリケーション、それによってテーブルデータの同期を実現します。

ここに画像の説明を挿入します
論理分析に関連する2つの重要な部分は、パブリケーションとサブスクリプションであることがわかります。

パブリケーション(パブリッシング)は、読み取りおよび書き込み可能なビジネスデータベースインスタンス上に作成され、パブリケーションが作成されたデータベースはパブリッシングノードと呼ばれます。パブリッシングノードの機能と制限については、パート3を参照してください。公開ノードは、WALログの論理分析を担当します。この点は、明確に区別する必要があります。
サブスクリプション(サブスクリプション)は論理レプリケーションデータベースに作成されます。サブスクリプションを作成したデータベースはサブスクリプションノードになります。サブスクリプションが作成されると、解析されたWALログを送信するための論理レプリケーションスロットがデフォルトで公開ノードに作成されます。サブスクリプションノードが合格論理レプリケーションスロットは、発行ノードによって送信されたWALデータの変更を取得します。したがって、ネットワーク上の理由で論理レプリケーションが中断された場合、発行ノードは常に、サブスクライブノードによって適用されていないWALログを保存します。ビジネスがビジー状態であるため、発行ノードのディスクがいっぱいになる可能性があります。誰もが問題に注意を払う必要があります。

3つの論理コピー構築ステップ

ここに画像の説明を挿入します
1.公開ノードで論理レプリケーションユーザー
作成する例:ユーザーlogicalrepレプリケーションログイン暗号化パスワード「logicalrep」を作成します。ストリーミングレプリケーション権限が必要です。

2.リリースノードの作成リリース
リリースノードの構文の作成

Command:     CREATE PUBLICATION  
Description: define a new publication  
Syntax:  
CREATE PUBLICATION name    [ FOR TABLE [ ONLY ] table_name [ * ] [, ...]
      | FOR ALL TABLES ]
    [ WITH ( publication_parameter [= value] [, ... ] ) ] where option can be:  
      PUBLISH INSERT | NOPUBLISH INSERT  
    | PUBLISH UPDATE | NOPUBLISH UPDATE  
    | PUBLISH DELETE | NOPUBLISH DELETE  
默认发布insert,update,delete。

举例:create publication pub1 for table t1

修改发布节点语法

Command:     ALTER PUBLICATION  
Description: change the definition of a publication  
Syntax:  
ALTER PUBLICATION name WITH ( option [, ... ] )  where option can be:  
      PUBLISH INSERT | NOPUBLISH INSERT  
    | PUBLISH UPDATE | NOPUBLISH UPDATE  
    | PUBLISH DELETE | NOPUBLISH DELETE  
ALTER PUBLICATION name ADD TABLE [ ONLY ] table_name [ * ] [, ...]ALTER PUBLICATION name SET TABLE [ ONLY ] table_name [ * ] [, ...]ALTER PUBLICATION name DROP TABLE [ ONLY ] table_name [ * ] [, ...]ALTER PUBLICATION name SET ( publication_parameter [= value] [, ... ] )ALTER PUBLICATION name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }ALTER PUBLICATION name RENAME TO new_name

发布者小结
①目前仅仅支持发布表,不允许发布其他对象。
②同一张表,可以发布多次。
③在同一个数据库中,可以创建多个publication,但是不能重名,通过系统表查看已创建的publication
④允许使用all tables发布所有表。
⑤一个publication允许有多个订阅者。
⑥目前publication仅支持insert, update, delete。允许发布时,选择发布insert、update、delete,比如只发布insert,而不发布update, delete。当发布了表的update, delete时,表必须设置replica identity,即如何标示OLD TUPLE,通过pk或者uk或者full。如果设置了nothing,则执行update,delete时会报错。
⑦create publication或者alter publication,发布或者修改发布内容中添加或者删除表时,都是事务级别,不会出现复制了部分事务的情况。⑧发布者需要设置wal_level=logical,同时开启足够的worker,设置足够大的replication slot,设置足够多的sender。
⑨发布者的pg_hba.conf需要设置replication条目,允许订阅者连接。
⑩发布者的数据库中,必须有replication角色的用户,或者超级用户,并且订阅者要使用它通过流复制协议连接到发布者。

3、订阅端创建订阅表
创建表结构同发布端表结构相同的空表 注意主键约束,没有的话发布端的update delete等操作会报错
例:create table t1 (id int primary key,name text)

4、订阅端创建订阅

创建订阅语法

Command:     CREATE SUBSCRIPTION  
Description: define a new subscription  
Syntax:  
CREATE SUBSCRIPTION subscription_name CONNECTION 'conninfo' PUBLICATION { publication_name [, ...] } [ WITH ( subscription_parameter [= value] [, ... ] ) ]

举例:create subscription sub1 connection ‘host=192.168.230.81 port=5866 dbname=postgres user=logicalrep password=logicalrep’ publication pub1;

修改订阅语法

Command:     ALTER SUBSCRIPTION  
Description: change the definition of a subscription  
Syntax:  
ALTER SUBSCRIPTION name WITH ( option [, ... ] ) ]  where option can be:  
  SLOT NAME = slot_name  
ALTER SUBSCRIPTION name CONNECTION 'conninfo'ALTER SUBSCRIPTION name SET PUBLICATION publication_name [, ...] [ WITH ( set_publication_option [= value] [, ... ] ) ]ALTER SUBSCRIPTION name REFRESH PUBLICATION [ WITH ( refresh_option [= value] [, ... ] ) ]ALTER SUBSCRIPTION name ENABLE
ALTER SUBSCRIPTION name DISABLE
ALTER SUBSCRIPTION name SET ( subscription_parameter [= value] [, ... ] )ALTER SUBSCRIPTION name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }ALTER SUBSCRIPTION name RENAME TO new_name

サブスクライバーの概要
①サブスクリプションを作成するには、スーパーユーザーを使用する
必要があります②サブスクライバーは、ストリーミングレプリケーションプロトコルを介してパブリッシャーに接続する必要があります。同時に、パブリッシャーにレプリケーションスロットを作成する必要があります。
③同じデータベース内に複数のサブスクリプションを作成でき、これらのサブスクリプションは1つ以上のパブリッシャーから接続できます。
④同じ購読者テーブルは、同じソースからの複数の出版物を受け入れることはできません。
⑤サブスクリプションごとに、発行側にスロットを作成する必要があります。スロット名= ?、またはデフォルトのサブスクリプション名を使用して指定できます。
⑥サブスクリプションを作成またはサブスクリプションを変更する場合、enableを使用してサブスクリプションを有効にするか、disableを使用してサブスクリプションを一時停止できます。
ʻサブスクリプションを完全に削除したい場合は、ドロップサブスクリプションを使用してください。サブスクリプションを削除した後、ローカルテーブルは削除されず、データはクリアされず、サブスクリプションのアップストリーム情報を受信しないだけです。
⑧サブスクリプションを作成する場合、発行側のテーブルは自動的に作成されないため、最初にサブスクリプション側でテーブルを作成する必要があります。


おすすめ

転載: blog.51cto.com/13646489/2664464