テナントメモリ(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などのその他のI/Oパラメータは、現在のところ無効で、デフォルトのままで問題ありません。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';アプリケーション側でバッチ処理タスクを降格します。
ユーザーのメモリが満杯になった場合、アプリケーション側で該当するテナントのバッチ処理タスクを降格することを検討できます。