ODPはブラックリストメカニズムを使用して、OBServerノードのピークシフトコンパクション、アップグレード、リーダー切り替え、ダウン、起動および停止などのプロセスにおけるOBServerノードへのアクセス制御を適応的に処理します。
背景
ODPには、ステータスブラックリスト、ディテクションブラックリスト、およびアクティブながら利用不可能なブラックリストの3種類があり、パラメータ設定によってこれらのブラックリストを管理できます。
ブラックリストを使用することで、主に以下のシナリオでのアクセス制御を実現できます:
ピークタイム以外のメジャーコンパクション時に、コンパクション中のゾーンにトラフィックがない場合。
クラスタアップグレード時に、アップグレード中のOBServerノードまたはゾーンへのアクセスを禁止する場合。
OBServerノードがダウンした後、そのOBServerノードへのアクセスを禁止する場合。
パーティション移行後、移行前のOBServerノードへのアクセスを禁止する場合。
アクセス対象のOBServerノードにテナントリソースが存在しない場合、リトライを行う場合。
OBServerノードがアクティブながら利用不可能(メモリ上限超過、タイムアウト、OBServerノードの初期化および終了)の場合、リトライを行う場合。
ステータスブラックリスト
ステータスブラックリストは、OBServerノードの状態変更に依存します。歴史的な理由により、ステータスブラックリストに関連するステータスにはDETECT_ALIVEとDETECT_deadの2つのステータスが含まれておらず、残りのステータス変更はすべてOBServerノードのビューから取得できます。
周期的なタスクを通じてOBServerノードの最新ステータスを取得した後、ODPはOBServerノードのステータスに応じて以下の操作をそれぞれ実行します。
ACTIVE:OBServerノードをステータスブラックリストから削除し、OBServerノードを「白」にします。INACTIVE/REPLAY:OBServerノードをステータスブラックリストに追加します。DELETED/DELETINGステータス:メモリ内のOBServerノードのマシンリストを更新し、そのノードにSQLを転送しません。UPGRADEステータス:ステータスブラックリストに追加されませんが、そのノードにSQLを転送もしません。効果はブラックリストと同様です。
ディテクションブラックリスト
ステータスブラックリストはOceanBaseの総合サービスノード(Root Service)から情報を取得しますが、この情報はODPとOBServerノード間の状況を必ずしも反映しているわけではありません。以下の図のように、ODPはRSからOBServer1ノードのステータスをACTIVEとして取得しますが、ODPとOBServer1ノード間のネットワークは不通です。

そのため、ODPは既存のステータスブラックリストに加えてディテクションブラックリストも実装し、OBServerノードにディテクションSQLを送信することでOBServerノードのステータスを判断します。ODPはOceanBaseデータベースのsysテナントにディテクションSQL select 'detect server alive' from dual を送信し、5秒のタイムアウト時間を設定します。タイムアウト時間内に結果が返されない場合、ディテクション失敗回数が1増加し、連続失敗回数が3回を超えた場合、ディテクション失敗とみなし、OBServerノードのステータスをDETECT_DEADに設定します。結果が返された場合、ディテクション失敗回数をリセットし、OBServerノードのステータスをDETECT_ALIVEに設定します。ディテクションステータスの変更が発生すると、ODPの動作は以下のようにトリガーされます。
DETECT_ALIVEステータス:OBServerノードをディテクションブラックリストから「白」にします。DETECT_DEADステータス:OBServerノードをディテクションブラックリストに追加し、そのOBServerノードとのすべての接続を閉じます。
説明
OBServerノードをディテクションブラックリストに追加した後、そのOBServerノードとの接続を切断しない場合、接続は常に占有されたままとなり、新しいSQLを送信できなくなります。パフォーマンスデータでは、この期間のこのOBServerノードのTPSが0として表示されます。切断後、後続のリクエストについて、ODPはブラックリストに基づいてルーティングを行い、このOBServerノードに転送されることはなく、TPSは回復します。
アクティブアベイラブルブラックリスト
アクティブアベイラブルブラックリストの仕組みの核心は、業務SQLの実行結果に基づいてOBServerノードの状態を定義し、ブロックおよび解除操作をトリガーすることです。状態ブラックリストや検出ブラックリストと比較して、アクティブアベイラブルブラックリストにおけるブロックおよび解除ははるかに慎重であり、主に一度のSQL実行結果による誤判断を防ぐためです。具体的な操作は以下の通りです。
失敗:時間点ごとに次回の失敗イベントを記録します。
ODPがOBServerノードにSQLを送信した後、ob_query_timeout時間を超えても応答がない場合。
OBServerノードがエラーコードOB_SERVER_IS_INIT、OB_SERVER_IS_STOPPING、OB_PACKET_CHECKSUM_ERROR、OB_ALLOCATE_MEMORY_FAILEDを返す場合。
ODPとOBServerノード間の接続確立に失敗した場合、またはメッセージ解析に失敗した場合、データ転送に失敗した場合。
ブロック:デフォルトでは、OBServerノードが120秒以内に5回のアクティブアベイラブル失敗レコードがある場合、そのOBServerノードをブロックします。これは構成パラメータcongestion_fail_window(エラー統計サイクル)とcongestion_failure_threshold(エラー回数)によって制御されます。
再試行:デフォルトでは、アクティブアベイラブルブラックリストに追加されてから20秒以上経過した場合、再度そのOBServerノードにSQLを送信します。再試行時間間隔は
congestion_retry_interval構成パラメータによって制御されます。解除:試行したSQLの実行が成功した場合、解除を行います。デフォルトでは、OBServerノードは20秒以内に解除されることは許可されず、この値は構成パラメータ
min_keep_congestion_intervalによって制御されます。
上記の3種類のブラックリスト間に優先順位はなく、OBServerノードがいずれかのブラックリストに含まれている限り、そのマシンはリクエストを受け取ることができません。言い換えれば、OBServerノードがどのブラックリストにも含まれていない場合にのみ、リクエストを受け取ることができます。
選択可能なすべてのOBServerノードがブラックリストに含まれている場合、ブラックリスト内のOBServerノードに対して強制的に再試行が行われます。
ブラックリストの構成パラメータ
クライアント上でrootユーザーを使用し、ODPプロキシ経由でクラスタの
sysテナントにログインします。obclient> obclient -h10.10.10.1 -uroot@sys#obdemo -P2883 -p -cここでは、ODPマシンのIPアドレスを
10.10.10.1、クラスタ名をobdemoとした例で、OBClientを使用してクラスタに接続します。OceanBaseテナントへの接続手順の詳細については、接続方法の概要(MySQLモード)および接続方法の概要(Oracleモード)を参照してください。以下のコマンドを実行して、ODPの構成パラメータを確認します。
obclient> SHOW PROXYCONFIG;ALTER proxyconfig SET key=valueコマンドを実行して、ODPの指定された構成パラメータを更新します。構成パラメータの更新は即時に反映されます。ブラックリストに関連する構成パラメータの説明は、以下の表に示されています。
構成パラメータ 説明 enable_congestion ブロックリストメカニズムを有効にするかどうかを指定します。デフォルトは有効です。ブロックリストメカニズムの実行に問題が発生した場合、このオプションを一時的に無効にしてODPが正常に動作できるようにすることができます。 congestion_failure_threshold OBServerノードをブロックリストに追加するかどうかを制御します。 congestion_fail_windowと組み合わせて使用します。congestion_fail_window時間内にOBServerノードのエラー回数がこの値を超えた場合、ODPはそのOBServerノードをブロックリストに追加します。このパラメータの値が0未満の場合、ブロックリスト内のすべてのサーバーがブロックリストから解除されます。congestion_fail_window エラー統計周期の時間(秒)を設定します。デフォルト値は120秒です。エラー統計周期内にエラー回数が congestion_failure_thresholdの値を超えた場合、そのサーバーをブロックリストに追加します。このパラメータの値は動的に調整することもできます。このパラメータを変更すると、現在のエラー統計カウントがクリアされ、新しい設定値に基づいてエラー回数の統計が再開されます。congestion_retry_interval アクティブな利用不可能なブロックリストに追加されたOBServerノードの再試行周期を設定します。デフォルト値は20秒です。 min_keep_congestion_interval ブロックリストに追加されたOBServerノードが、いつブロックリストから解除されることを許可されるかを設定します。 min_congested_connect_timeout クライアント接続タイムアウト値を設定します。接続タイムアウト時には、OBServerノードをアクティブな利用不可能なブロックリストに追加します。デフォルト値は100msです。
ブラックリストの確認
クライアント上でrootユーザーを使用し、ODPプロキシ経由でクラスタの
sysテナントにログインします。obclient> obclient -h10.10.10.1 -uroot@sys#obdemo -P2883 -p -cここでは、ODPマシンのIPアドレスを
10.10.10.1、クラスタ名をobdemoとして、OBClientを使用してクラスタに接続する例を示します。OceanBaseテナントへの接続手順の詳細については、接続方法の概要(MySQLモード)および接続方法の概要(Oracleモード)を参照してください。以下のコマンドを実行して、ブラックリスト情報を確認します。
ステートメントは次のとおりです:
SHOW PROXYCONGESTION [all] [clustername];関連パラメータの説明は以下のとおりです:
オプションを指定しない場合、すべてのクラスタのブラックリスト情報を照会できます。
allのみを指定した場合、すべてのクラスタのOBServerノード情報(ブラックリスト内および外のOBServerノード情報を含む)が表示されます。clusternameのみを指定した場合、指定されたクラスタのブラックリスト情報が表示されます。allとclusternameの両方を指定した場合、指定されたクラスタのOBServerノード情報が表示されます。
例
ここでは、単一ノードクラスタobclusterのブラックリスト情報を確認する例を示します。
obclient> show proxycongestion 'obcluster'\G
出力は次のとおりです:
*************************** 1. row ***************************
cluster_name: obcluster
zone_name: zone1
region_name: sys_region
zone_state: ACTIVE
server_ip: xxx.xxx.xxx.xxx:2881
cr_version: 5
server_state: ACTIVE
alive_congested: 0
last_alive_congested: 0
dead_congested: 0
last_dead_congested: 0
stat_alive_failures: 0
stat_conn_failures: 0
conn_last_fail_time: 0
conn_failure_events: 0
alive_last_fail_time: 0
alive_failure_events: 0
ref_count: 2
detect_congested: 0
last_detect_congested: 0
説明
dead_congestedまたはalive_congestedのいずれかの状態が1の場合、そのOBServerノードはブラックリストに追加されたことを意味します。ODP V1.1.2以前では、
clusternameにはシングルクォートまたはダブルクォートを付ける必要はありませんでしたが、V1.1.2以降では、シングルクォートまたはダブルクォートを付ける必要があります。