テナントメモリ(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';アプリケーション側でバッチ処理タスクを降格する。
ユーザーのメモリが満杯になった場合、アプリケーション側で該当するテナントのバッチ処理タスクを降格することを検討できます。