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
を使用します。別のレプリケーション・ユニットへの移行を参照してください。