AutoPartition

AutoPartitionでは、自動パーティション管理により、テーブルを簡単にラージサイズに拡大できます。これは、パーティションの作成と削除の低競合ロックなど、BDRの追加機能を利用します。

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

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

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

bdr.autopartition()は、テーブルの自動範囲パーティショニングの定義を作成または変更するために使用されます。定義が存在しない場合は定義が作成され、そうでない場合は後の実行で定義が変更されます。

bdr.autopartition()は実際のテーブルをロックせず、新しいパーティションメンテナンスアクションが実行されるタイミングと方法の定義を変更するだけです。

bdr.autopartition()は、 EDB Postgres拡張機能を活用して、テーブルの残りの部分をロックせずにパーティションをアタッチまたはデタッチ/ドロップできるようにします。この機能は、SELECTクエリを許可しながら新しいテーブルスペースを設定します。

テーブルがRANGEパーティション化されていない場合、または複数列パーティションキーが使用されている場合は、エラーが発生します。

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

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

テーブルに既存のパーティションがない場合、指定されたpartition_initial_lowerboundがfirstpartitionの下限として使用されます。 partition_initial_lowerboundが指定されていない場合、システムはパーティション列タイプと指定されたpartition_incrementからその値を導き出します。例、partition_incrementが1Dayとして指定されている場合、partition_initial_lowerboundは自動的にCURRENTDATEに設定されます。 partition_incrementが1 Hourとして指定されている場合、npartition_initial_lowerboundはcurrentdateの現在の時間に設定されます。後続のパーティションの境界は、partition_increment値を使用して設定されます。

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

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

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

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

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

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

managed_locallyとしてマークされたテーブルは、後でグローバルに管理するために変更することはできません。

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

ユーザは、AutoPartitionによって管理されるテーブルのパーティションを手動で作成または削除することは想定されていません。これをmakeと、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
   *    );

AutoPartitionを1つ作成する

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を使用します。 partitiontableが正常に削除された場合、ファンクションはtrueを結果ます。

あらすじ

bdr.autopartition_drop_partition(relname regclass)

パラメーター

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

メモ

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

パーティションの作成を待つ

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

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

すべてのBDRノードでパーティションが作成されるのを待つには、 オーダーファンクションを使用します。この機能は、ローカルノードとすべてのリモートノードを内部的にチェックし、パーティションが至る所に作成されるまで待機します。

あらすじ

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-検索するパーティションキー値。

AutoPartitioningを有効/無効にする

bdr.autopartition_enable()を使用して、指定されたテーブルでAutoPartitioningを有効にします。AutoPartitioningが既に有効になっている場合は、何もしません。同様に、bdr.autopartition_disable()を使用して、特定のテーブルでAutoPartitioningを無効にします。

あらすじ

bdr.autopartition_enable(relname regclass);

パラメーター

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

あらすじ

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が使用されている場合、ファンクションは「不明」を結果ます。 「進行中」は一般的なステータスです。