OceanBaseはマルチテナントデータベースクラスタであり、テナント間ではスレッドとコルーチンを通じてCPUリソースが割り当てられます。クラスタ内のテナントからのリクエスト量が増加したり、複雑なクエリ処理が行われたりすると、CPUリソースが不足し、キューによるリクエストの滞りが発生します。主な現象としては、SQLの応答時間が長くなったり、処理速度が遅くなったりすることが挙げられます。本記事では、このような状況に対する緊急対処方法について説明します。
緊急対処方法
現在のクラスタ内のテナントでキューによるリクエストの滞りが発生した場合、以下のいくつかの側面から対処することができます:
テナントのCPUリソースを拡張するか、負荷の少ないマシンにプライマリサーバーを切り替えることを試みます。
テナント内のCPUを拡張するには、
UNIT_CONFIG、UNIT_NUMを変更してCPUを拡張できます。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とメモリの設定のみが実際に有効であり、ディスクやIOPSなどの他のIOパラメータは一時的に無効であり、デフォルトで十分です。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の実行計画にヒントmax_concurrentをバインドすることで、SQLの並列処理を制限し、SQLの実行を制限します。例:
CREATE OUTLINE outline_name ON sql_id USING HINT /*+max_concurrent(1)*/;