SQLMutations#

SQLMutationは、pgdノードがpgdグループに参加した後、スーパーユーザーロールを介してアプリケーションデータベースで実行されるSQLクエリのリストで構成されています。各SQLMutationには、isApplied クエリーのisApplied リストとexec クエリーのexec リストが含まれます。 isApplied SQLクエリーは、変更が既に適用されているかどうかを確認するために使用されます。 isApplied クエリーのいずれかがfalseを返した場合、 SQLクエリーのexec リストが実行キューに追加されます。

これはSQLミューテーションのサンプルです

apiVersion: pgd.k8s.enterprisedb.io/v1beta1
kind: PGDGroup
[...]
spec:
  pgd:
    mutations:
      - isApplied:
          - |
             WITH node_route_config AS (
               SELECT node_name, route_dsn
               FROM bdr.node_routing_config_summary
             )
            SELECT NOT EXISTS(SELECT * FROM node_route_config WHERE regexp_count(route_dsn, application_name=) >= 1);
        exec:
          - |
            WITH node_route_config AS (
              SELECT node_name,
                     regexp_replace(route_dsn, concat( application_name=,  node_name), ) as route_dsn
              FROM bdr.node_routing_config_summary
            )
            SELECT bdr.alter_node_option(node_name, route_dsn, route_dsn)
            FROM node_route_config;

SQLミューテーションタイプ#

演算子は、 spec.pgd.mutations[].type で指定できる3種類のSQLMutationを提供し、 always がデフォルトオプションです。

  • beforeSubgroupRaft

  • いつも

  • writeLeader

beforeSubgroupRaft およびalways 変異は、すべてのreconcileループで評価されます。 2つのミューテーションの違いは、実行フェーズにあります。

  • always 変異の場合、pgdgroupに制限なしで各reconcileループで実行されます。

  • 一方、beforeSubgroupRaft 変異は、pgdグループにデータノードとpgdプロキシが定義されている場合、特にサブグループraftの準備が整う前にのみ実行されます。

beforeSubgroupRaft およびalways 変異は両方とも、監視ノードを含むpgdグループ内の任意のpgdノードで実行できます。したがって、監視ノードにはアプリケーションデータベースデータが含まれないため、アプリケーションデータベースのデータを変更するために使用しないでください。

writeLeader ミューテーションは、書き込みリーダーが選択された後にトリガーおよび実行されます。 exec 操作は、書き込みリーダーノードで排他的に実行されます。