OceanBaseはマルチテナントデータベースクラスタであり、テナント間ではスレッドとコルーチンによってCPUリソースが割り当てられ、スケジューリングされます。クラスタ内のテナントのリクエスト量が増加したり、複雑なクエリ処理やCPUリソース不足が発生すると、キュー上のリクエストが積み上がる現象が見られます。主な症状として、SQLの応答時間が長くなったり、処理速度が遅くなったりします。本記事では、このような状況に対処するための緊急対応方法について説明します。
緊急対応方法
現在のクラスタ内のテナントでキュー上のリクエストが積み上がっている場合、以下のポイントから対処を開始できます:
テナントのCPUリソースを拡張するか、負荷の少ないマシンにプライマリを切り替えます。
テナント内のCPU拡張は、
UNIT_CONFIGやUNIT_NUMを変更することで実現できます。OCPを使用して操作を実行することを推奨します。コマンドラインでの操作手順は以下のとおりです:i. 以下の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;ii. 生成されたSQLステートメントを実行します。
注意
OceanBase V3.2バージョンまで、
resource unit設定の変更では、CPUとメモリの設定のみが実際に有効になります。その他のI/Oパラメータ(ディスク、IOPSなど)は一時的に無効となり、デフォルト設定で問題ありません。ALTER RESOURCE UNIT unit_config_name min_cpu=2,max_cpu=2,memory_size ='2G',max_iops=10000,min_iops=10000;ユニット数の多いテナントについては、クラスタレベルでの拡張は、ゾーン内にOBServerノードを追加し、
unit_numを増やすことで実現できます。実行回数に異常な急増が見られるSQLを特定し、業務部門と確認のうえで実行制限をかけます。
実行回数に急増が見られるSQLを特定します。
OCPのSQL診断機能を参考に、SQLの履歴実行傾向を確認し、実行回数オプションを選択すると、指定された期間内の特定のSQLの実行回数の傾向を確認できます。
SQLの実行を制限します。
SQLの実行計画にhint max_concurrentを追加することで、SQLの並列実行を制限し、SQLの実行を制限します。例:
CREATE OUTLINE outline_name ON sql_id USING HINT /*+max_concurrent(1)*/;