Raftレプリケーションの操作および設定

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

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

RU値は、デプロイメント後に変更することはできません。デプロイする前に、-repunitパラメータを指定してMODIFY SHARDSPACEコマンドを使用してRUの数を変更できます。

gdsctl> modify shardspace -shardspace shardspaceora -repunit number

システム管理(自動)データ分散では、shardspaceoraという名前のシャード領域が1つあることに注意してください。

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

高可用性を確保するために、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レプリケーション分散データベースに対してシャードを追加または削除できます。

シャードの追加

Raftレプリケートされた分散データベースをスケール・アップするには、シャードをホストする新しいデータベースを作成して検証し、シャードを分散データベース構成に追加して、更新された構成をデプロイします。

分散データベースにシャードを追加する詳細なステップは、シャードを追加するワーク・フローを参照してください。

分散データベースでは、デフォルトで新しいシャード上のデータが自動的にリバランスされますが、デプロイ時に追加のオプションを使用してデータを手動でリバランスするように選択できます。

通常、新しいシャードが構成にデプロイされると、シャードの追加についてに記載されている動作になります。

Raftレプリケーションの場合、シャードがデプロイされるときに、次の2つのシナリオのうちどちらが発生するかを構成できます:

  • 自動リバランス: デフォルトでは、Raftレプリケーションによってレプリケーション・ユニット(RU)が自動的に分割され、シャードが追加されるたびに2つの新しいRUが作成され、それらのリーダーが新しいシャードに配置されます。他のRUからのチャンクは、データ分散のリバランスのために新しいRUに移動されます。また、DEPLOY操作では、チャンクの再配置およびバランスのための中間/ステージングRUも作成されます。チャンクは、DEPLOYタスクの完了後に削除されます。

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

  • 手動リバランス: 自動リバランスを実行しない場合は、GDSCTL DEPLOY -no_rebalanceオプションを使用して更新された分散データベース構成をデプロイし、必要に応じてRUおよびチャンクを手動で移動できます。

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

シャードの削除

Raftレプリケートされた分散データベースをスケール・ダウンするには、シャード上のRUを残りのシャードに移動し、分散データベース構成からシャードを削除して、更新された構成をデプロイします。

  1. 削除する予定のシャードからRUを移動します。

    分散データベース構成を変更する前に、RUを他のシャードに移動します。

    詳細は、レプリケーション・ユニットのレプリカの移動を参照してください。

    1. すべてのリーダーRUメンバーを、削除するシャードから他のシャードにスイッチオーバーします。

      GDSCTL> switchover ru -ru 4
       -shard target_shard
       [-timeout=n]
    2. すべてのフォロワRUメンバーを、削除するシャードから、移動する特定のRUに対してフォロワが存在しない他のシャード・データベースに移動します。

      GDSCTL> move ru -ru 1
       -source shard_to_be_dropped
       -target target_shard_where_ru_follower_does_not_exist
  2. 分散データベース構成からシャードを削除します。

    1. 削除するシャードにRUがないことを確認します。

      GDSCTL> status ru -shard shard_to_be_dropped 
      
    2. 分散データベース構成からシャードPDBおよびCDBを削除し、VNCRリストからホスト・アドレス情報を削除します。

      GDSCTL> remove shard shard_to_be_dropped
      GDSCTL> remove cdb shard_to_be_dropped_cdb_name
      GDSCTL> remove invitednode node
  3. 次のように選択できる残りのシャードには、追加のRUが残されます:

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

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

たとえば、

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

ノート:

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

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

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

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

-shardオプションは、指定されたシャード(データベース)のレプリケーション・ユニット・メンバーを、指定されたRUの新しいリーダーにします。

gdsctl> switchover ru -ru 1 -shard 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
  • -sourceを指定しないと、レプリケーション・ユニットの既存のフォロワがソース・データベースとして選択されます。

ノート:

このコマンドを実行するには宛先チャンク用の表領域セットが必要なため、このコマンドを実行する前に、少なくとも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でチャンクを手動で分割できます。

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

    GDSCTL> split chunk -chunk 3

    使用方法の詳細は、「split chunk」を参照してください。

  2. その後、必要に応じて、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

レプリケーション・ユニットの開始および停止

レプリケーション・ユニットの停止および起動は、フォロワ・シャードの適用エラーまたはリーダー・リカバリ・エラーからのリカバリなど、Raftレプリケーション固有のメンテナンスを実行する場合を除き、ほとんど必要ありません。

ノート:

データベース、オペレーティング・システムまたはマシンでメンテナンス・タスクを実行できるように、特定のレプリカでRUを停止してレプリケーションを一時的に無効にできます。

メンテナンス操作を実行する前に、RUリーダーをシャード・データベースからスイッチオーバーすることがベスト・プラクティスです。詳細は、「レプリケーション・ユニット・リーダーの変更」を参照してください。

START RUおよびSTOP RUコマンドは、特定のレプリケーション・ユニット(RU)内の特定のレプリカまたはすべてのレプリカに対して実行できます。

START RUコマンドは、以前に停止したRUの操作を再開するために使用します。また、エラーのためにRUがオフラインになっている場合にも使用できます。たとえば、RU内のレプリカのログ・プロデューサ・プロセスが機能しなくなると、RUが停止します。START RUコマンドを使用すると、データベースの完全な再起動なしでRUを再起動できます。

コマンドを使用するには、次の構文に従います。

start ru -ru ru_id [-database db]
stop ru -ru ru_id [-database db]

停止を開始するRU IDを指定し、オプションでRUのメンバーが実行されるデータベース名を指定できます。データベースが指定されていない場合は、指定したレプリケーション・ユニットの使用可能なすべてのレプリカがコマンドの影響を受けます。

レプリケーション・ユニット・メンバーの同期

GDSCTLコマンドSYNC RUを使用して、すべてのシャードの指定したレプリケーション・ユニットのデータを同期します。この操作では、Raftログも消去され、ログ索引および条件がリセットされます。

SYNC RUを使用するには、レプリケーション・ユニット(-ru ru_id)を指定します。

gdsctl> sync ru -ru ru_id [-database db]

オプションで、シャード・データベース名を指定できます。SYNC RUコマンドにデータベースが指定されていない場合、同期対象のレプリカは次の基準に基づいて選択されます:

  1. 最後にリーダーであったレプリカが選択されます。
  2. 使用可能でない場合は、適用索引が最大のレプリカが選択されます。

SYNC RU操作のステータスは、gdsctl config taskを使用して確認できます。

「警告: GSMがタイムアウトしました」と表示される場合、これは同期操作がまだ実行されていないことを意味しません。レプリケーション・ユニットの同期の完了には、デフォルトのGDSCTLタイムアウトより長い時間がかかる場合があります。

「警告: GSMがタイムアウトしました」と表示されないようにする場合は、GDSCTLグローバル・サービス・マネージャ(シャード・ディレクタ)リクエストのタイムアウトを高い値に設定できます。

gdsctl configure -gsm gsm_ID -timeout seconds -save_config

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

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

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

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

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

パラメータ設定の表示

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

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

ORA_SHARD_ID: シャードID

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

NAME: パラメータ名

VALUE: パラメータ値

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

GDSCTLを使用したパラメータの設定

GDSCTLのset ru parameterコマンドを使用して、各シャードのレプリケーション・ユニット・レベルでいくつかのRaft固有のパラメータを設定できます。

構文

set ru parameter parameter_name=value [-shard shard_name] [-ru ru_id]

引数

引数 タイプ
parameter_name=value

パラメータ名と設定する値を指定します。各パラメータ設定の詳細は、次のトピックを参照してください。

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

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

 
-ru ru_id レプリケーション・ユニットID番号を指定します。指定しない場合、コマンドはすべてのRUに適用されます。
-shard shard_name

シャード名を指定します。指定しない場合、コマンドはすべてのシャードに適用されます。

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

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

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

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

たとえば、

gdsctl set ru parameter SHARD_FLOW_CONTROL=value

オプションで、シャード(-shard)またはレプリケーション・ユニットID番号(-ru)を指定できます

value引数は、次のいずれかに設定できます。

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

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

    ハートビート間隔の10倍のTILL_TIMEOUTは、SHARD_FLOW_CONTROLのデフォルト設定です。

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

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

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

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

しきい値距離の構成

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

デフォルト値は10です。

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

gdsctl set ru parameter SHARD_FLOW_CONTROL_NS_DISTANCE_PCT=number

オプションで、シャード(-shard)またはレプリケーション・ユニットID番号(-ru)を指定できます

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

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

タイムアウトはハートビート間隔の倍数で表され、デフォルト値は10です。

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

gdsctl set ru parameter SHARD_FLOW_CONTROL_TIMEOUT_MULTIPLIER=milliseconds

オプションで、シャード(-shard)またはレプリケーション・ユニットID番号(-ru)を指定できます

set ru parameterコマンドの使用方法の詳細は、「GDSCTLを使用したパラメータの設定」を参照してください。

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

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

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

gdsctl set ru parameter SHARD_TXN_ACK_TIMEOUT_SEC=seconds

オプションで、シャード(-shard)またはレプリケーション・ユニットID番号(-ru)を指定できます

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

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

set ru parameterコマンドの使用方法の詳細は、「GDSCTLを使用したパラメータの設定」を参照してください。

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リファレンス』)を参照してください。