OceanBase分散データベースをより良く体験し、使い始めるために、まずは メモリ と タイムアウト時間 という2つの最も一般的な仕様の違いを理解しておいてください。
メモリについて
OceanBaseデータベースはLSM-Treeをベースとしたストレージエンジンであり、従来のデータベースが不潔ページをリアルタイムにフラッシュする仕組みとは異なります。OceanBaseデータベースでは、データをメモリ上のMemTableとディスク上のSSTableに分けて管理します。すべてのデータ更新および書き込み操作は、まずメモリ上のMemTableで完了し、メモリ使用量が一定のしきい値に達するとCompactionがトリガーされ、データはSSTableにダンプされ、使用されていたメモリが解放されます。このアーキテクチャの利点は、ランダムI/OをシーケンシャルI/Oに変換することで、より高い書き込みスループットを実現できる点です。詳細については、ストレージアーキテクチャの概要を参照してください。
LSM-Treeは増分データをすべてメモリに格納し、一定のしきい値に達して初めてダンプをトリガーするため、小規模なテナントインスタンスがその処理能力を超える高負荷な書き込みシナリオ(例:データインポートや大量のデータバッチ処理の実行時)で動作すると、MemTableが上限に達して新たなリクエストを受け付けられなくなることがあります。OceanBaseデータベースでは、以下の対処方法があります:
書き込みスロットリングの有効化:メモリへの書き込みが一定のしきい値に達すると、OceanBaseデータベースがクライアントからのインポート速度を自動的に制限します。
テナントメモリの拡張:環境内のノード全体のメモリリソースに余裕がある場合、テナントのメモリを拡大できます。
テナントメモリ内のMemTableの割合の調整:ノード全体のメモリが限られており拡張できない場合でも、テナントメモリ内のMemTableの割合を調整することで、書き込み可能なメモリ領域を拡大し、ダンプのしきい値を引き下げてより早くダンプを発生させることができます。
書き込みスロットリングの有効化
OceanBaseデータベースは書き込み過負荷保護機能を備えており、リソースが限られてメモリを拡張できない場合でも、サーバー側で書き込みをスロットリングすることでメモリを保護し、書き込みによるメモリ上限の超過を防ぐことができます。以下の2つのパラメータを設定することで、サーバー側の書き込みスロットリング機能を有効にできます。
writing_throttling_trigger_percentage:書き込み速度のしきい値を設定します。MemStoreの使用済みメモリがこのしきい値(割合)に達すると、書き込みスロットリングがトリガーされます。このパラメータの取り得る範囲は[1, 100]で、デフォルト値は60です。値を100に設定すると書き込みスロットリングメカニズムが無効になります。
writing_throttling_maximum_duration:書き込みスロットリングがトリガーされた後、残りのMemStoreメモリを使い切るまでに必要な時間を指定します。デフォルト値は2時間です。このパラメータは通常、変更する必要はありません。
テナントの管理者アカウントで、メモリ使用量が80%に達した時点でスロットリングを開始し、残りのメモリが2時間分の書き込みを維持できるように設定する例を以下に示します。
obclient> ALTER SYSTEM SET writing_throttling_trigger_percentage = 80;
Query OK, 0 rows affected
obclient> ALTER SYSTEM SET writing_throttling_maximum_duration = '2h';
Query OK, 0 rows affected
テナントメモリの拡張
環境のメモリリソースが比較的豊富な場合、最適な対処法はテナントメモリを増やすことです。
メモリ設定の手順は以下のとおりです。
rootユーザーでOceanBaseクラスタのsysテナントにログインし、以下のSQLステートメントを実行して、現在のテナントが使用しているUNIT_CONFIG NAMEを確認します。obclient> SELECT NAME FROM DBA_OB_UNIT_CONFIGS; +-----------------+ | NAME | +-----------------+ | sys_unit_config | | test_unit | +-----------------+ 2 rows in set説明
sys_unit_configは管理テナントのパラメータで、通常は変更しません。- この例では、テナント
testのunit_config nameはtest_unitです。
テナントの
unit_config nameをコピーし、以下のコマンドを使用してメモリ拡張を完了します。obclient> ALTER RESOURCE UNIT test_unit MIN_CPU = 2, MAX_CPU = 2, MEMORY_SIZE = '10G', MAX_IOPS = 10000, MIN_IOPS = 10000;
注意
現在のバージョンでは、CPUとメモリの設定のみが有効で、その他のI/Oパラメータ(例:IOPS)はまだ有効になりません。
テナントメモリ内のMemStoreの割合の調整
以下のパラメータを使用して、テナントメモリ内のMemStoreの割合を調整します:
freeze_trigger_percentage:テナントのMemStoreメモリ使用量がこのパラメータで指定された割合に達すると、自動的にダンプがトリガーされ、占有されているメモリが解放されます。このパラメータの値の範囲は[1,99]で、デフォルト値は20です。これは、MemStore使用率が20%を超えるとダンプがトリガーされることを意味します。memstore_limit_percentage:このパラメータは、テナントメモリのうちMemStoreへの書き込みに利用可能な割合を制御します。値の範囲は[0, 100)で、デフォルト値は0です。これは、テナントがMemStoreに使用するメモリの割合がシステムによって総利用可能メモリの割合に応じて自動的に調整されることを意味します。
メモリ不足の場合、memstore_limit_percentageの値を引き上げ、freeze_trigger_percentageの値を引き下げることで、一時的なメモリ拡張と、迅速なダンプによるメモリ解放の効果を得ることができます。
例:
obclient> ALTER SYSTEM SET freeze_trigger_percentage = 20;
Query OK, 0 rows affected
obclient> ALTER SYSTEM SET memstore_limit_percentage = 70;
Query OK, 0 rows affected
タイムアウト時間について
OceanBaseデータベースでは、クエリの実行時やDML操作の実行時に timeout または Transaction is timeout エラーが発生することがあります。これは、ユーザーがさまざまなビジネスシナリオに合わせて調整できるように、OceanBaseデータベースがクエリとトランザクションのタイムアウトにデフォルト設定を設けているためです。
OceanBaseデータベースでは、以下のタイムアウト時間関連の変数を提供しており、SHOW VARIABLES LIKE '%timeout%'; コマンドで確認できます。
ob_query_timeout:クエリのタイムアウト時間(単位:μs)。デフォルト値は10000000です。
ob_trx_timeout:トランザクションのタイムアウト時間(単位:μs)。デフォルト値は86400000000です。
ob_trx_idle_timeout:トランザクションのアイドルタイムアウト時間(単位:μs)。デフォルト値は86400000000です。
タイムアウト時間の設定
タイムアウト時間の設定方法は以下のとおりです:
セッション単位またはグローバル単位で変数を設定します。例:
obclient> SET ob_query_timeout = 10000000; Query OK, 0 rows affected obclient> SET GLOBAL ob_query_timeout = 10000000; Query OK, 0 rows affectedJDBC接続文字列で設定します。例:
jdbc:mysql://10.1.0.0:1001/unittests?user=**u**@sys&password=******&sessionVariables = ob_query_timeout = 60000000000,ob_trx_timeout = 60000000000&xxxxSQLレベルでHintを追加して設定します。例:
説明
この方法は、現在のSQL文にのみ有効です。
SELECT /*+query_timeout(100000000) */ c1 FROM t1;
データベースの開発や管理に関する詳細については、『アプリケーション開発』および『データベース管理』を参照してください。