OceanBaseデータベースはV4.1.0バージョンからアダプティブコンパクションをサポートしています。アダプティブコンパクションを有効にすると、システムはユーザーのクエリや書き込みなどの情報をリアルタイムで収集・統計し、これらの情報に基づいてクエリの遅延が発生する可能性のあるシナリオを特定し、適応的にコンパクションタスクをスケジュールします。これにより、ユーザーに気付かれることなく、関連するシナリオで発生する可能性のあるクエリの遅延問題を解決します。アダプティブコンパクションが有効な期間中、システムはパーティション単位で統計情報の収集およびコンパクションタスクのスケジューリングを行います。
アダプティブコンパクション機能を使用することで、以下の問題を解決できます:
バッファテーブルの一部の問題を回避します。
一部のシナリオにおけるクエリ性能を最適化します。
一部のクエリの遅延シナリオを特定し、回避します。
トリガー条件
パーティションのリーダーが特定の条件を満たすと、システムはそのパーティションおよびフォロワーレプリカに対して自動的に適応的コンパクションをスケジュールします。適応的コンパクションのトリガー条件は以下の通りです:
システムは一定期間のパーティション統計情報を分析し、そのパーティションのクエリおよびダンプ回数、および増分データにおける挿入行数の割合を取得し、このシナリオがデータ導出シナリオであるかどうかを確認します。データ導出シナリオである場合、そのパーティションに対して適応的コンパクションがトリガーされます。
システムは一定期間のパーティション統計情報を分析し、そのパーティションのダンプ回数および増分データにおける更新行と削除行の割合を取得し、このシナリオがデータ導出シナリオであるかどうかを確認します。データ導出シナリオである場合、そのパーティションに対して適応的コンパクションがトリガーされます。
システムはパーティションの増分データの総行数を統計し、このシナリオが継続的書き込みシナリオであるかどうかを確認します。継続的書き込みシナリオである場合、システムはそのパーティションに対して適応的コンパクションをトリガーします。
システムはクエリスキャンしたデータ量と実際の有効データの比率を照会し、そのパーティションに対するクエリがスロークエリであるかどうかを確認します。スロークエリである場合、システムはそのパーティションに対して適応的コンパクションをトリガーします。
注意事項
適応的コンパクションは、一部のクエリの遅延問題を効果的に軽減できます。業務上、クエリ性能に高い要件があり、かつ適応的コンパクションがサポートするシナリオが存在する場合は、適応的コンパクション機能を無効にしないことを推奨します。
OceanBaseデータベースでは、名前が「_」で始まる構成パラメータはすべて非表示の構成パラメータであり、開発者が障害調査や緊急運用時にのみ使用します。適応的コンパクション機能を無効にする必要がある場合は、技術サポート担当者に連絡し、協力して処理を行ってください。
ステップ1:適応型コンパクションを有効にする
適応型コンパクション機能は、テナントレベルの非表示構成パラメータ _enable_adaptive_compaction によって制御され、デフォルトでは有効になっています。
rootユーザーでクラスタのsysテナントにログインします。テナントレベルの非表示構成パラメータ
_enable_adaptive_compactionの値を照会します。obclient [oceanbase]> SELECT * FROM oceanbase.GV$OB_PARAMETERS WHERE NAME LIKE '_enable_adaptive_compaction';照会結果は次のとおりです:
+----------------+----------+-------+--------+-----------+-----------------------------+-----------+-------+---------------------------------------------------------------------------------+---------+-------------------+---------------+-----------+ | SVR_IP | SVR_PORT | ZONE | SCOPE | TENANT_ID | NAME | DATA_TYPE | VALUE | INFO | SECTION | EDIT_LEVEL | DEFAULT_VALUE | ISDEFAULT | +----------------+----------+-------+--------+-----------+-----------------------------+-----------+-------+---------------------------------------------------------------------------------+---------+-------------------+---------------+-----------+ | 172.xx.xxx.xxx | 2882 | zone1 | TENANT | 1 | _enable_adaptive_compaction | BOOL | True | specifies whether allow adaptive compaction schedule and information collection | TENANT | DYNAMIC_EFFECTIVE | True | YES | | 172.xx.xxx.xxx | 2882 | zone1 | TENANT | 1001 | _enable_adaptive_compaction | BOOL | True | specifies whether allow adaptive compaction schedule and information collection | TENANT | DYNAMIC_EFFECTIVE | True | YES | | 172.xx.xxx.xxx | 2882 | zone1 | TENANT | 1002 | _enable_adaptive_compaction | BOOL | True | specifies whether allow adaptive compaction schedule and information collection | TENANT | DYNAMIC_EFFECTIVE | True | YES | | 172.xx.xxx.xxx | 2882 | zone1 | TENANT | 1003 | _enable_adaptive_compaction | BOOL | True | specifies whether allow adaptive compaction schedule and information collection | TENANT | DYNAMIC_EFFECTIVE | True | YES | | 172.xx.xxx.xxx | 2882 | zone1 | TENANT | 1004 | _enable_adaptive_compaction | BOOL | True | specifies whether allow adaptive compaction schedule and information collection | TENANT | DYNAMIC_EFFECTIVE | True | YES | +----------------+----------+-------+--------+-----------+-----------------------------+-----------+-------+---------------------------------------------------------------------------------+---------+-------------------+---------------+-----------+ 5 rows in set照会結果において、
VALUE列の値がTrueである場合、適応型コンパクションが有効になっていることを示します。適応型コンパクションが有効になっていない場合は、以下のステートメントを実行して有効にすることができます。
obclient [oceanbase]> ALTER SYSTEM SET _enable_adaptive_compaction = True TENANT = tenant_name;注意
適応型コンパクションのスケジューリングタスクの実行には一部のシステムリソースが消費されるため、システムリソースの使用量を削減するために、テナントレベルの非表示構成パラメータ
_enable_adaptive_compactionの値をFalseに変更することで、extremeモードのテーブル以外の適応型コンパクションのスケジューリングを無効にできます。
(オプション)ステップ2:テーブルオプションtable_modeを使用して適応的なメジャーコンパクション戦略を指定する
適応的なメジャーコンパクションを有効にした後、Bufferテーブルによるパフォーマンスの低下問題をより柔軟に解決するため、OceanBaseデータベースはV4.2.3バージョンからテーブルオプションtable_modeをサポートしています。ユーザーは各テーブルに異なるtable_mode値を設定することで、異なるクイックフリーズおよび適応的なメジャーコンパクション戦略を指定し、Bufferテーブルの問題に対処できます。
テーブル作成時または変更時に、テーブルオプションtable_modeを使用して、異なるモードの適応的なメジャーコンパクション戦略を指定できます。テーブルオプションtable_modeは、異なるコンパクション戦略に対応するために、以下の5つのモードを提供します。
| モード | ダンプ後のコンパクションのトリガー確率 |
|---|---|
| normal(デフォルト値) | ごく低い |
| queuing | 低 |
| moderate | 中 |
| super | 高 |
| extreme | 非常に高い |
業務に精通している場合は、テーブル作成時に業務状況に応じて適切なモードを設定できます。例えば、queuingモードのテーブルを作成する場合、例は以下のとおりです。
obclient> CREATE TABLE tbl1 (c1 int, c2 double) table_mode = 'queuing';
上記のステートメントでは、明示的にtable_mode値を指定しない場合、システムはデフォルトでnormalモードのテーブルを作成します。
テーブル作成後、特定のテーブルで読み込みアンプリケーション現象が深刻であり、Bufferテーブル現象が発生した場合、業務ニーズに応じて、そのテーブルのtable_modeを手動で変更することで、システムがより頻繁にそのテーブルのコンパクションをトリガーし、クエリを高速化できます。コンパクションの頻度が高くなるほど、消費される計算リソースも増加するため、コンパクションのトリガー頻度が低いものから順次高いものへとtable_mode値を調整することを推奨します。例えば、まずnormalからqueuingに調整し、一定期間観察した後、queuingからmoderateに調整します。調整例は以下のとおりです。
obclient> ALTER TABLE tbl1 SET table_mode = 'moderate';
テーブル変更ステートメントの実行が成功すると、システムには一定の遅延(約2分)が発生します。変更が反映されると、システムは設定されたコンパクションモードで適応的なメジャーコンパクションをスケジュールし、Bufferテーブル現象を解決します。