11 Raftレプリケーションの構成および管理

Oracle Globally Distributed Databaseは、GDSCTL CLIにコマンドおよびオプションを提供し、システム管理のシャード・データベースでRaftレプリケーションを有効化および管理します。

RaftレプリケーションがOracle Globally Distributed Databaseで実装される方法の詳細と図は、Oracle Globally Distributed DatabaseでのRaftレプリケーションの使用に関する項(Oracle Globally Distributed Databaseのアーキテクチャと概念)を参照してください。

ノート:

Raftレプリケーションは、Oracle Globally Distributed Databaseシャーディングのユーザー定義およびコンポジット・データ分散方法ではサポートされません。

Raftレプリケーションの有効化

シャード・カタログを構成するときに、Raftレプリケーションを有効にします。

Raftレプリケーションを有効にするには、シャード・カタログの作成時にネイティブ・レプリケーション・オプションを指定します。

たとえば、

gdsctl> create shardcatalog ... -repl native

シャード・カタログの作成後、構成にシャードを追加し、DEPLOYコマンドを実行できます。

ノート:

Raftレプリケーションを使用するには、シャード・データベースに少なくとも3つのシャードが必要です。

レプリケーション・ユニット属性の指定

デフォルトでは、Oracle Globally Distributed Databaseは、シャード領域内のレプリケーション・ユニット(RU)の数とRU内のチャンクの数を決定します。

シャード・カタログの作成時に、-repunitオプションを使用してプライマリRUの数を指定できます。ゼロ(0)より大きい値を指定します。

gdsctl> create shardcatalog ... -repunit number

シャード・データベース構成で最初のDEPLOYコマンドが実行された後、RU値は変更できません。DEPLOYを実行する前に、MODIFY SHARDSPACEコマンドを使用してRUの数を変更できます。

gdsctl> modify shardspace -shardspace shardspaceora -repunit number

システム管理のシャーディングでは、shardspaceoraという名前のシャード領域が1つあることに注意してください。

-repunitパラメータが指定されていない場合、最初のDEPLOYコマンドの実行時にデフォルトのRU数が決定されます。

レプリカが同じラックに配置されていないことの確認

高可用性を確保するために、Raftレプリケーション・グループ・メンバーを同じラックに配置しないでください。

ADD SHARDコマンド-rack rack_idオプションを使用して指定した場合、シャード・カタログでは、レプリケートされたデータを含むシャードが同じラックに配置されないことが強制されます。これが不可能な場合、エラーが発生します。

gdsctl> add shard -connect connect_identifier … -rack rack_id

レプリケーション・ユニットのランタイム情報の取得

GDSCTL STATUS REPLICATIONを使用して、リーダーとそのフォロワなどのレプリケーション・ユニットの実行時統計を取得します。

GDSCTL STATUS REPLICATIONは、STATUS RUまたはRUとして入力することもできます。

オプション-ruを指定すると、特定のレプリケーション・ユニットに関する特定の情報を取得できます。

たとえば、レプリケーション・ユニットru1に関する情報を取得するには:

GDSCTL> status ru -ru 1

Replication units
------------------------
Database RU# Role Term Log Index Status
-------- --- ---- ---- --------- ------
cdbsh1_sh1 1 Leader 2 21977067 Ok
cdbsh2_sh2 1 Follower 2 21977067 Ok
cdbsh3_sh3 1 Follower 2 21977067 Ok
cdbsh1_sh1 2 Follower 1 32937130 Ok
cdbsh2_sh2 2 Leader 1 32937130 Ok
cdbsh3_sh3 2 Follower 1 32937130 Ok
cdbsh1_sh1 3 Follower 2 16506205 Ok
cdbsh2_sh2 3 Follower 2 16506205 Ok
cdbsh3_sh3 3 Leader 2 16506205 Ok 

コマンドの構文、オプション、および例の詳細は、status ru (RU, status replication)(グローバル・データ・サービスの概念と管理ガイド)を参照してください。

Raftレプリケーションによるスケーリング

次の手順で、Raftレプリケーション・シャード・データベースに対してシャードを追加または削除できます。

シャードの追加

シャード・データベースをスケール・アップするには、GDSCTL ADD SHARDを実行します。

シャードがデプロイされると、Raftレプリケーションによってレプリケーション・ユニット(RU)が自動的に分割され、シャードが追加されるたびに2つの新しいRUが作成され、それらのリーダーが新しいシャードに配置されます。他のRUからのチャンクは、データ分散のリバランスのために新しいRUに移動されます。

シャードを追加した後、CONFIG TASKを実行して、進行中のリバランス・タスクを表示できます。

自動リバランスを実行しない場合は、GDSCTL DEPLOY -no_rebalanceを使用して新しいシャードをデプロイし、必要に応じてRUおよびチャンクを手動で移動できます。

シャードの削除

GDSCTL REMOVE SHARDを使用してシャードを削除しますが、まず、すべてのRUをシャードから移動する必要があります。

その後、MOVE RUおよびRELOCATE CHUNKを使用して、残りのシャードでRUを手動でリバランスできます。

詳細は、レプリケーション・ユニットのレプリカの移動および別のレプリケーション・ユニットへのチャンクの移動を参照してください。

レプリケーション・ユニットのレプリカの移動

MOVE RUを使用して、レプリケーション・ユニットのフォロワ・レプリカをあるシャード・データベースから別のシャード・データベースに移動します。

たとえば、

gdsctl> move ru -ru 1 -source dba -target dbb

ノート:

  • ソース・データベースにレプリカ・リーダーを含めることはできません
  • ターゲット・データベースにレプリケーション・ユニットの別のレプリカを含めることはできません

ノート:

このコマンドを実行するには宛先チャンク用の表領域セットが必要なため、このコマンドを実行する前に、少なくとも1つの表領域セットを作成してください。

構文およびオプションの詳細は、move Ru (replication_unit)(グローバル・データ・サービスの概念と管理ガイド)を参照してください。

レプリケーション・ユニット・リーダーの変更

SWITCHOVER RUを使用すると、指定されたレプリケーション・ユニットのリーダーであるレプリカを変更できます。

-dbオプションを指定すると、指定されたデータベースが指定されたRUの新しいリーダーになります。

gdsctl> switchover ru -ru 1 -database dba

その後、リーダーを自動的にリバランスするには、SWITCHOVER RU -rebalanceを使用します。

構文およびオプションの詳細は、switchover ru (replication_unit)(グローバル・データ・サービスの概念と管理ガイド)を参照してください。

レプリケーション・ユニットのコピー

COPY RUを使用して、シャード・データベース間でレプリケーション・ユニットをコピーできます。これにより、ターゲット・シャード・データベース上のレプリケーション・ユニットのレプリカをインスタンス化または修復できます。

たとえば、レプリケーション・ユニット1をdbaからdbbにコピーするには、次のようにします。

gdsctl> copy ru -ru 1 -source dba -target dbb

ノート:

  • ソース・データベースもターゲット・データベースも、指定されたレプリケーション・ユニットのレプリカ・リーダーにしないでください。
  • ターゲット・データベースにこのレプリケーション・ユニットがすでに含まれている場合、ソース・データベースのレプリケーション・ユニットの完全なレプリカで置き換えられます。
  • -replaceを指定すると、レプリケーション・ユニットがターゲット・データベースから削除されます。
  • ターゲット・データベースに指定されたレプリケーション・ユニットが含まれていない場合は、-replaceが指定されていないかぎり、指定されたレプリケーション・ユニットのメンバーの合計数がレプリケーション・ファクタ(3)を下回る必要があります。
    gdsctl> copy ru -ru 1 -source dba -target dbc -replace dbb

ノート:

このコマンドを実行するには宛先チャンク用の表領域セットが必要なため、このコマンドを実行する前に、少なくとも1つの表領域セットを作成してください。

構文およびオプションの詳細は、copy ru (replication_unit)(グローバル・データ・サービスの概念と管理ガイド)を参照してください。

別のレプリケーション・ユニットへのチャンクの移動

チャンクをRaftレプリケーション・ユニット間で移動するには、GDSCTL RELOCATE CHUNKコマンドを使用します。

RELOCATE CHUNKを使用するには、ソース・レプリケーション・ユニット・リーダーとターゲット・レプリケーション・ユニット・リーダーが同じシャードに配置され、フォロワも同じシャードに配置されている必要があります。同じシャードにない場合は、SWITCHOVER RUを使用してリーダーを移動し、MOVE RUを使用してフォロワを同じ場所に配置されたシャードに移動します。

チャンクを移動する場合は、ここに示すように、チャンクID番号、移動元のソースRU ID、および移動先のターゲットRU IDを指定します。

GDSCTL> relocate chunk -chunk 3, 4 -sourceru 1, -targetru 2

指定したチャンクは、同じソース・レプリケーション・ユニットに存在する必要があります。-targetruが指定されていない場合は、新しい空のターゲット・レプリケーション・ユニットが作成されます。

Raftレプリケーションが有効になっているシャード・データベースでのチャンクの移動では、GDSCTL MOVE CHUNKはサポートされていません。

ノート:

このコマンドを実行するには宛先チャンク用の表領域セットが必要なため、このコマンドを実行する前に、少なくとも1つの表領域セットを作成してください。

relocate chunk(グローバル・データ・サービスの概念と管理ガイド)も参照してください。

Raftレプリケーションでのチャンクの分割

Raftレプリケーションが有効なシャード・データベースでは、GDSCTL SPLIT CHUNKでチャンクを手動で分割できます。

チャンク内のデータを新しいRUに移動する場合は、GDSCTL SPLIT CHUNKを使用してチャンクを手動で分割できます。

その後、必要に応じて、RELOCATE CHUNKを使用して新しいチャンクを別のRUに移動できます。別のレプリケーション・ユニットへの移行を参照してください。

ノート:

このコマンドを実行するには宛先チャンク用の表領域セットが必要なため、このコマンドを実行する前に、少なくとも1つの表領域セットを作成してください。

レプリケーション・タイプの取得

シャード・データベースがRaftレプリケーションを使用しているかどうかを確認するには、CONFIG SDBを実行して、コマンド出力でレプリケーション・タイプを確認します。

コマンド出力では、Raftレプリケーションが有効になっている場合、レプリケーション・タイプはNativeと表示されます。

たとえば、

GDSCTL> config sdb

GDS Pool administrators
------------------------

Replication Type
------------------------
Native

Shard type
------------------------
System-managed

Shard spaces
------------------------
shardspaceora

Services
------------------------
oltp_ro_srvc
oltp_rw_srvc

フォロワ・レプリケーション・ユニットからの読取りの有効化または無効化

データベース初期化パラメータSHARD_ENABLE_RAFT_FOLLOWER_READを使用して、シャード内のフォロワ・レプリケーション・ユニットからの読取りを有効または無効にします。

読取りを有効にするにはこのパラメータをTRUE、読取りを無効にするにはFALSEに設定します。

このパラメータは、シャードごとに異なる値を保持できます。

関連項目: SHARD_ENABLE_RAFT_FOLLOWER_READ(『Oracle Databaseリファレンス』)。

フォロワ・ラグを軽減するためのチューニング・フロー制御

Raftレプリケーションのフロー制御は、Raftグループ・フォロワを調整して、パフォーマンスを最適化し、メモリーを効率的に利用し、可変ネットワーク・レイテンシなどのレプリケーション・パイプラインのハイクアップをスムーズにします。

フォロワは同じ速度を維持しない場合があります。場合によって、やや速いときとやや遅いときがあることがあります。

フロー制御を調整するには、フォロワが遅れているシャードでRAFT_FLOW_CONTROLパラメータを設定します。

たとえば、

exec gsmadmin_internal.dbms_gsm_dbadmin.setParameter(ru_id, RAFT_FLOW_CONTROL, param_value);

説明:

ru_idはRU ID番号です。すべてのRUを指定するには、NULLを使用します。

param_valueは、次のいずれかのフロー制御設定です。

  • AT_DISTANCE: 低速フォロワがしきい値距離内にあるかぎり(次の「しきい値距離の構成」を参照)、LCRの観点からは、高速フォロワがスロットルされます。

    これはRAFT_FLOW_CONTROLのデフォルト設定です。

    ただし、低速フォロワがしきい値距離より遅れている場合は切断され、その時点で、2つのフォロワ間にラグがある理由に応じてキャッチアップできる場合とできない場合があります。たとえば、低速フォロワへのネットワーク接続が長時間不良であったために遅れている場合、そのフォロワは切断されます。これは、低速フォロワが実際には停止したフォロワである場合にも当てはまります。

  • TILL_TIMEOUT: 低速フォロワがしきい値時間内にLCRを受信しているかぎり(次の「しきい値タイムアウトの構成」を参照)、高速フォロワはスロットルされます。

    ただし、低速フォロワがしきい値時間より遅れている場合は切断され、その時点で、2つのフォロワ間にラグがある理由に応じてキャッチアップできる場合とできない場合があります。たとえば、低速フォロワへのネットワーク接続が長時間不良であったために遅れている場合、そのフォロワは切断されます。これは、低速フォロワが実際には停止したフォロワである場合にも当てはまります。

  • AT_LOGLIMIT: フロー制御は通常の操作中に開始されませんが、ログ・ファイルがリーダーによって上書きされようとしている場合にのみ開始されますが、低速フォロワには上書きされるファイルのLCRが必要です。この状況が発生すると、リーダーは、低速フォロワがファイルからのLCRを上書きするまで待機します。

    低速フォロワが実際には停止したフォロワである場合、このオプションを使用すると、リーダーは、RUのRaftログ制限に達したときに低速フォロワが再びオンラインになるのを待機します。

しきい値距離の構成

しきい値距離は、LCRのインメモリー・キュー・サイズのパーセンテージで表され、フロー制御のAT_DISTANCEオプションで使用されます。

デフォルト値は10です。

しきい値の距離を別の値に設定するには、次を実行します。

exec gsmadmin_internal.dbms_gsm_dbadmin.setParameter(ru_id, RAFT_FLOW_CONTROL_NS_DISTANCE_PCT, number);

しきい値タイムアウトの構成

しきい値タイムアウト(ミリ秒)は、フロー制御のTILL_TIMEOUTオプションで使用されます。

デフォルト値は0(ゼロ)です。

しきい値タイムアウトを設定するには、次を実行します。

exec gsmadmin_internal.dbms_gsm_dbadmin.setParameter(ru_id, RAFT_FLOW_CONTROL_TIMEOUT_MS, milliseconds);

トランザクション・コンセンサス・タイムアウトの設定

トランザクションのタイムアウト値を変更して、Raftレプリケーションでコンセンサスを取得できます。

トランザクション・コンセンサス・タイムアウトを構成するには、TXN_ACK_TIMEOUT_SECパラメータを設定します。このパラメータでは、ORA-05086が表示される前に、ユーザー・トランザクションがコミットのコンセンサスを待機する最大時間を指定します。

exec gsmadmin_internal.dbms_gsm_dbadmin.setParameter(ru_id, TXN_ACK_TIMEOUT_SEC, seconds);

説明

ru_idはRU ID番号です。すべてのRUを指定するには、NULLを使用します。

デフォルトでは、Raftレプリケーションはトランザクションがコンセンサスを取得するまで90秒待機します。ただし、リーダーが他のレプリカから切断されると、そのコミットに対するコンセンサスを取得できない場合があります。レプリケーション・パイプラインにメモリーが少ない場合、LCRのレプリケーションが遅くなり、確認応答の配信が遅延します。このような場合、90秒が長すぎて待機できないことが多いため、アプリケーション要件に応じて、トランザクションを短時間でエラーにする必要がある場合があります。

有効な最小値は1秒です。

パラメータ設定の表示

SHARD_RAFT_PARAMETERS静的データ・ディクショナリ・ビューを使用して、各シャードのRUレベルで設定されたパラメータを表示します。

これらのパラメータの値が設定されている場合は、このビューで確認できます。ビューの列は次のとおりです。

ORA_SHARD_ID: シャードID

RU_ID: レプリケーション・ユニットID

NAME: パラメータ名

VALUE: パラメータ値

このビューの詳細は、SHARD_RAFT_PARAMETERS(『Oracle Databaseリファレンス』)を参照してください。

Raftレプリケーションの動的パフォーマンス・ビュー

Raftレプリケーションには、いくつかの動的パフォーマンス(V$)ビューを使用できます。

  • V$SHARD_ACK_SENDER
  • V$SHARD_ACK_RECEIVER
  • V$SHARD_APPLY_COORDINATOR
  • V$SHARD_APPLY_LCR_READER
  • V$SHARD_APPLY_READER
  • V$SHARD_APPLY_SERVER
  • V$SHARD_LCR_LOGS
  • V$SHARD_LCR_PERSISTER
  • V$SHARD_LCR_PRODUCER
  • V$SHARD_NETWORK_SENDER
  • V$SHARD_MESSAGE_TRACKING
  • V$SHARD_REPLICATION_UNIT
  • V$SHARD_TRANSACTION

これらのビューの説明および列の詳細は、動的パフォーマンス・ビュー(『Oracle Databaseリファレンス』)を参照してください。

Raftレプリケーションの制限

Oracle Globally Distributed DatabaseでのRaftレプリケーションには、次の制限が適用されます。

GDSCTL MOVE CHUNKは、Raftレプリケーションではサポートされていません。チャンクを別のレプリケーション・ユニット間で移動するには、RELOCATE CHUNKを使用します。別のレプリケーション・ユニットへの移行を参照してください。