テナントメモリ(MemStore)の書き込みが上限になるのは、ほとんどの場合、突然の一括インポート操作によって引き起こされます。緊急時の対応としては、主に書き込み制限の設定やダンプしきい値の調整などの手段が取られます。
緊急時の対応プロセス
テナントのメモリがいっぱいになると、通常は書き込み失敗として現れ、エラー No memory or reach tenant memory limit(エラーコード4013)または Over tenant memory limits(エラーコード4030)が報告されます。緊急時の対応策の優先順位は一般的に高いものから低いものへと以下のようになります:
テナントのメモリ設定を増やします。OCPで直接テナントのメモリ拡張操作を実行することを推奨します。詳細については、OCP公式ドキュメントを参照してください。コマンドラインでの変更方法は以下の手順を参照してください:
以下のSQLステートメントを実行して、現在のテナントが使用している
unit_configを確認します。注意
複数のレプリカが異なる
resource_poolを使用している可能性があるため、それぞれ調整する必要があります。SELECT a.tenant_name,a.tenant_id,b.name unit_config,c.name pool_name,b.max_cpu,b.min_cpu FROM OCEANBASE.DBA_OB_TENANTS a, OCEANBASE.DBA_OB_UNIT_CONFIGS b, OCEANBASE.DBA_OB_RESOURCE_POOLS c WHERE a.tenant_id=c.tenant_id AND b.unit_config_id = c.unit_config_id ORDER BY a.tenant_id desc;以下のSQLステートメントを実行します。
注意
OceanBase V3.2以降では、
resource unitの設定変更はCPUとメモリのみが実際に有効であり、ディスクやIOPSなどの他のIOパラメータは一時的に無効で、デフォルトで十分です。ALTER resource unit unit_config_name min_cpu = 2,max_cpu = 2,MEMORY_SIZE = '2G',max_iops = 10000,min_iops = 10000;
ダンプスレッド数を増やし、ダンプを高速化してメモリを早期に解放します。
ダンプ前には大量のデータがメモリを占有します。迅速なダンプ完了により、占有されたメモリを解放できます。
compaction_high_thread_scoreは並列ダンプスレッド数を制御するパラメータであり、このパラメータ値を上げることでメモリの迅速な解放を実現できます。このパラメータのデフォルト値は0であり、これはスレッド数が1つであることを意味します。このパラメータの変更はOBServerの再起動なしで即時に反映されます。注意
このパラメータを大きくするとCPU利用率が上昇するため、状況に応じて有効にするかどうかを決定してください。
具体的な方法は以下のとおりです:
rootユーザーでクラスタのsysテナントにログインします。ALTER SYSTEM SET compaction_high_thread_score=x;変更が成功した後、
SHOW PARAMETERSステートメントを使用して変更が成功したかどうかを確認できます。SHOW PARAMETERS LIKE 'compaction_high_thread_score';クラスタでテナントの総メモリを拡張できなくなった場合、テナントのMemStore比率を上げて書き込み可能なメモリを一時的に拡大し、ダンプのしきい値を下げてダンプをより早く発生させることができます。
OceanBaseデータベースでは、テナントのActive MemStoreメモリ使用量が
freeze_trigger_percentage * memstore_limit(ここで、memstore_limit = テナントメモリ * memstore_limit_percentage)に達すると、システムは自動的にフリーズ(ダンプの前段階のアクション)をトリガーし、その後ダンプをスケジュールします。ダンプ後、システムは占有されたMemStoreメモリを解放します。もう一つの関連パラメータは
memstore_limit_percentageであり、これはテナントメモリ内でMemStore書き込みに使用可能な割合を表します。デフォルトは0であり、これはテナントがMemStoreに使用するメモリがその総利用可能メモリに占める割合をシステムが適応的に調整することを意味します。このパラメータの値の範囲は [0, 100) であり、このパラメータの変更はOBServerの再起動なしで即時に反映されます。緊急時のシナリオでは、
memstore_limit_percentageを大きくすると同時にfreeze_trigger_percentageを下げることで、一時的な拡張と早期のダンプ解放を実現できます。具体的な方法は以下のとおりです:
rootユーザーでクラスタのsysテナントにログインします。ALTER SYSTEM SET freeze_trigger_percentage=40; ALTER SYSTEM SET memstore_limit_percentage=70;書き込み制限を有効にし、メモリ書き込みが一定のしきい値に達すると、OBはクライアントのインポート速度を自動的に制限します。
writing_throttling_trigger_percentageはテナントレベルのパラメータであり、書き込み速度のしきい値を調整するパラメータです。MemStoreの使用済みメモリがこのしきい値に達すると、書き込み制限がトリガーされます。このパラメータのデフォルト値は100であり、これは書き込み制限メカニズムが無効であることを意味します。このパラメータの値の範囲は[0, 100]であり、このパラメータの変更はOBServerの再起動なしで即時に反映されます。もう一つのパラメータwriting_throttling_maximum_durationは、制限がトリガーされた後、残りのメモリが最大でどの程度の時間書き込みをサポートできるかを表します。デフォルトは2時間であり、この項目は通常変更しません。ALTER SYSTEM SET writing_throttling_trigger_percentage = 80; ALTER SYSTEM SET writing_throttling_maximum_duration = '2h';アプリケーション側でバッチ処理タスクをダウングレードします。
ユーザーのメモリがいっぱいになった場合、アプリケーション側で該当するテナントのバッチ処理タスクをダウングレードすることを検討できます。