AutoPartition

AutoPartitionを使用すると、自動パーティション管理によってテーブルを簡単に大きなサイズに増やすことができます。この機能は、パーティションの作成と削除の低競合ロックなどのBDRの機能を使用します。

新しいパーティションを定期的に作成し、データ保持期間が終了したときに削除できます。

BDR管理は、主にSQLで呼び出すことができる関数によって実現されます。 BDRのすべての機能はbdr スキーマで公開されています。 search_pathに入れない限り、各ファンクションの名前をスキーマ修飾する必要があります。

パーティションの自動作成

bdr.autopartition() は、テーブルの自動レンジ分割の定義を作成または変更します。定義が存在しない場合は作成されます。そうしないと、後の実行で定義が変更されます。

bdr.autopartition() は実際のテーブルをロックしません。新しいパーティションのメンテナンスアクションをいつどのように行うかの定義を変更します。

bdr.autopartition() は、テーブルの残りの部分をロックせずにパーティションをアタッチまたはデタッチ/ドロップできる機能を活用します(基になるPostgresバージョンがサポートしている場合)。

テーブルが RANGE パーティション分割されていない場合、またはマルチカラムパーティションキーが使用されている場合、ERRORが発生します。

partition_increment の値の範囲ごとに新しいパーティションが追加され、下限と上限がpartition_increment 離れています。 timestamp またはdate 型のパーティションキーを持つテーブルの場合、 partition_increment はinterval 型の有効な定数でなければなりません。たとえば、 1 Day を指定すると、1日おきのパーティション境界で新しいパーティションが毎日追加されます。

パーティション列がsnowflakeid 、timeshard 、またはksuuid シーケンスに接続されている場合、partition_increment をinterval 型として指定しなければなりません。それ以外の場合、パーティションキーが整数または数値の場合、 partition_increment は同じデータ型の有効な定数でなければなりません。たとえば、 1000000 を指定すると、100万個の値ごとに新しいパーティションが追加されます。

テーブルに既存のパーティションがない場合、指定された partition_initial_lowerbound が最初のパーティションの下限として使用されます。 partition_initial_lowerbound を指定しない場合、システムはパーティション列タイプと指定されたpartition_increment から値を導き出そうとします。たとえば、 partition_increment が1 Day として指定された場合、 partition_initial_lowerbound はCURRENT DATEに設定されます。 partition_increment が1 Hour として指定された場合、 partition_initial_lowerbound は現在の日付の現在の時間に設定されます。後続のパーティションの境界は、 partition_increment 値を使用して設定されます。

システムは常に、特定の最小数のアドバンスパーティションを作成しようとします。新しいパーティションを作成するかどうかを決定するために、指定されたpartition_autocreate_expression を使用します。これは、チェックが実行されるたびに評価されるSQLで評価できる式にすることができます。たとえば、列型date のパーティションテーブルの場合、 partition_autocreate_expression がDATE_TRUNC('day',CURRENT_DATE) として指定され、 partition_increment が1 Day として指定され、 minimum_advance_partitions が2として指定されている場合、最後のパーティションの上限がDATE_TRUNC('day', CURRENT_DATE) + '2 Days'::interval 未満になるまで新しいパーティションが作成されます。

この式は、システムが新しいパーティションをチェックするたびに評価されます。

列型integer の分割テーブルの場合、partition_autocreate_expression をSELECT max(partcol) FROM schema.partitioned_table として指定できます。システムは、パーティション分割された列の最大値が最後のパーティションの上限の minimum_advance_partitions * partition_increment の距離内にあるかどうかを定期的にチェックします。クエリが効率的に実行されるように、 partcol にインデックスを作成します。列型integer 、smallint 、またはbigint のパーティションテーブルにpartition_autocreate_expression が指定されていない場合、システムはそれをmax(partcol) に設定します。

data_retention_period が設定されている場合、この期間の後にパーティションが削除されます。ロックを最小限に抑えるために、新しいパーティションが追加されると同時にパーティションが削除されます。この値が設定されていない場合、パーティションを手動で削除する必要があります。

data_retention_period パラメーターは、タイムスタンプ(および関連する)ベースのパーティションでのみサポートされています。期間は、パーティションの上限を考慮して計算されます。パーティションは、セカンダリ表領域に移行されるか、上限に対して指定された期間が経過すると削除されます。

デフォルトでは、AutoPartitionはパーティションをグローバルに管理します。つまり、1つのノードでパーティションが作成されると、クラスター内の他のすべてのノードにも同じパーティションが作成されます。したがって、すべてのパーティションは一貫しており、使用できることが保証されています。このために、AutoPartitionはRaftを利用します。 managed_locally をtrue として渡すことで、この動作を変更できます。その場合、すべてのパーティションは各ノードでローカルに管理されます。これは、パーティションテーブルがレプリケートテーブルではないため、すべてのノードにすべてのパーティションを持つ必要がない場合、または望ましくない場合に役立ちます。たとえば、組み込みのbdr.conflict_history テーブルはレプリケートテーブルではなく、ローカルのAutoPartitionによって管理されます。各ノードはこのテーブルのパーティションをローカルに作成し、十分に古くなると削除します。

managed_locally としてマークされたテーブルをグローバルに管理するように変更することはできません。その逆も同様です。

アクティビティは、エントリがenabled = on とマークされている場合にのみ実行されます。

AutoPartitionで管理されるテーブルのパーティションを手動で作成または削除する必要はありません。これを行うと、AutoPartitionメタデータに一貫性がなくなり、失敗する可能性があります。

自動パーティションを構成する

bdr.autopartition ファンクションは、テーブルの自動パーティション化を構成します。

概要

bdr.autopartition(relation regclass,
        partition_increment text,
        partition_initial_lowerbound text DEFAULT NULL,
        partition_autocreate_expression text DEFAULT NULL,
        minimum_advance_partitions integer DEFAULT 2,
        maximum_advance_partitions integer DEFAULT 5,
        data_retention_period interval DEFAULT NULL,
        managed_locally boolean DEFAULT false,
        enabled boolean DEFAULT on);

パラメーター

  • relation —テーブルの名前またはOid。

  • partition_increment —次のパーティション作成の間隔またはインクリメント。

  • partition_initial_lowerbound —テーブルにパーティションがない場合、この下限と partition_increment 離れた上限を持つ最初のパーティションが作成されます。

  • partition_autocreate_expression —新しいパーティションを作成するかどうかを検出するために使用されます。

  • minimum_advance_partitions —システムは、常に少なくとも minimum_advance_partitions パーティションを持つように試みます。

  • maximum_advance_partitions —アドバンスパーティションの数がminimum_advance_partitions を下回ると、一度に作成されるパーティションの数。

  • data_retention_period —古いパーティションが削除されるまでの間隔(定義されている場合)。この値は migrate_after_period よりも大きくなければなりません。

  • managed_locally — trueの場合、パーティションはローカルで管理されます。

  • enabled —アクティビティを無効または一時停止し、後で再開または再度有効にできます。

例

日単位のパーティション、1か月間データを保持:

CREATE TABLE measurement (
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);

bdr.autopartition(measurement, 1 day, data_retention_period := 30 days);

残りのパーティションが2つだけになったら、5つのアドバンスパーティションを作成します(各パーティションは10億のオーダーを保持できます)。

bdr.autopartition(Orders, 1000000000,
        partition_initial_lowerbound := 0,
        minimum_advance_partitions := 2,
        maximum_advance_partitions := 5
     );

1つのAutoPartitionを作成する

bdr.autopartition_create_partition() を使用して、親テーブルにスタンドアロンのAutoPartitionを作成します。

概要

bdr.autopartition_create_partition(relname regclass,
                               partname name,
                                   lowerb text,
                                   upperb text,
                                   nodes oid[]);

パラメーター

  • relname —アタッチする親テーブルの名前またはOid。

  • partname —新しいAutoPartitionの名前。

  • lowerb —パーティションの下限。

  • upperb —パーティションの上限。

  • nodes —新しいパーティションが存在するノードのリスト。

パーティションの自動作成の停止

bdr.drop_autopartition() を使用して、指定されたリレーションの自動パーティションルールを削除します。リレーションの保留中の作業項目がすべて削除され、新しい作業項目は作成されません。

bdr.drop_autopartition(relation regclass);

パラメーター

  • relation —テーブルの名前またはOid。

AutoPartitionを1つ削除する

この機能は削除する単一のパーティションを指定できるため、 BDR AutoPartitionテーブルが作成されたら、 bdr.autopartition_drop_partition を使用します。パーティションテーブルが正常に削除された場合、ファンクションはtrue を返します。

概要

bdr.autopartition_drop_partition(relname regclass)

パラメーター

  • relname —削除するパーティションテーブルの名前。

ノート

これにより、選択したパーティションテーブルで DROP TABLE を使用する前に、親テーブルにDDLロックが設定されます。

パーティションの作成を待ちます

bdr.autopartition_wait_for_partitions() を使用して、ローカルノードでパーティションが作成されるのを待ちます。この関数は、パーティションテーブル名とパーティションキー列の値を受け取り、その値を保持するパーティションが作成されるまで待機します。

この関数は、パーティションがローカルに作成されるのを待機するだけです。パーティションがリモートノードにも存在することは保証しません。

すべてのBDRノードでパーティションが作成されるまで待機するには、 bdr.autopartition_wait_for_partitions_on_all_nodes() ファンクションを使用します。この関数は、ローカルとすべてのリモートノードを内部的にチェックし、パーティションがどこにでも作成されるまで待機します。

概要

bdr.autopartition_wait_for_partitions(relation regclass, text bound);

パラメーター

  • relation —テーブルの名前またはOid。

  • bound —パーティションキー列の値。

概要

bdr.autopartition_wait_for_partitions_on_all_nodes(relation regclass, text bound);

パラメーター

  • relation —テーブルの名前またはOid。

  • bound —パーティションキー列の値。

パーティションを見つける

bdr.autopartition_find_partition() ファンクションを使用して、指定されたパーティションキー値のパーティションを見つけます。その値を保持するパーティションが存在しない場合、関数はNULLを返します。それ以外の場合は、パーティションのOidが返されます。

概要

bdr.autopartition_find_partition(relname regclass, searchkey text);

パラメーター

  • relname —パーティションテーブルの名前。

  • searchkey —検索するパーティションキーの値。

自動パーティショニングを有効または無効にする

bdr.autopartition_enable() を使用して、指定されたテーブルでAutoPartitioningを有効にします。自動パーティショニングが既に有効になっている場合、アクションは発生しません。同様に、 bdr.autopartition_disable() を使用して、指定されたテーブルのAutoPartitioningを無効にします。

概要

bdr.autopartition_enable(relname regclass);

パラメーター

  • relname —自動パーティショニングを有効にするリレーションの名前。

概要

bdr.autopartition_disable(relname regclass);

パラメーター

  • relname — AutoPartitioningを無効にするリレーションの名前。

概要

bdr.autopartition_get_last_completed_workitem();

クラスター内のすべてのノードで正常に完了した最後の作業項目の id を返します。

AutoPartitionワーカーを確認する

bdr.autopartition_work_queue_check_status 関数を使用すると、AutoPartitionsを維持するために仕事をしているバックグラウンドワーカーのステータスを確認できます。

ワーカーは次のビューで見ることができます。autopartition_work_queue_local_status autopartition_work_queue_global_status

概要

bdr.autopartition_work_queue_check_status(workid bigint
                           local boolean DEFAULT false);

パラメーター

  • workid — AutoPartitionワーカーのキー。

  • local —ローカルステータスのみを確認します。

注意事項

AutoPartitionワーカーは、 bdr.autopartition 関数が初めて呼び出される前でも、常にバックグラウンドで実行されています。無効なワーカーIDが使用された場合、関数はunknown を返します。 In-progress が代表的なステータスです。