OceanBaseの分散データベースをスムーズに使い始めるために、利用を始める前にメモリとタイムアウト時間というよくある2つの特性についてを理解しておきましょう。
メモリについて
ダーティページ(更新されたデータ)をリアルタイムでディスクに書き込む(フラッシュする)従来のデータベースとは異なり、OceanBaseではデータをメモリ上の「MemTable」とディスク上の「SSTable」に分けて管理します。全てのデータ更新や書き込み処理は、まずメモリ上のMemTableで完結します。そして、メモリ使用量が一定のしきい値に達するとコンパクション(Compaction)がトリガーされ、データはディスク上のSSTableへ転送されると同時に、使用されていたメモリが解放されます。このアーキテクチャの利点は、ディスクへのランダムI/OをシーケンシャルI/Oに変換することで、書き込みスループットを大幅に向上させられる点にあります。詳細については、ストレージアーキテクチャの概要を参照してください。
LSM-Treeは増分データをまずメモリ上に蓄積し、しきい値に達して初めてディスクへのデータ転送を行う仕組みです。このため、リソースの割り当てが少ない小規模なテナントインスタンスで、データインポートや大量のバッチ処理など、その処理能力を超えるような書き込みが集中した場合、MemTableが上限に達してしまい、新たなリクエストを受け付けられなくなる可能性があります。
書き込み速度の制限を有効にする:メモリへの書き込みが一定のしきい値に達すると、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データベースではタイムアウト時間に関して以下の変数が利用でき、SHOW VARIABLES LIKE '%timeout%';コマンドで確認することができます。
ob_query_timeout:クエリのタイムアウト時間 (単位:us、デフォルト値:10000000)。
ob_trx_timeout:トランザクションのタイムアウト時間 (単位:us、デフォルト値:86400000000)。
ob_trx_idle_timeout:トランザクションのアイドルタイムアウト時間 (単位:us、デフォルト値: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;
データベースの開発と管理に関する詳細は、『アプリケーションの開発』および『データベースの管理』を参照してください。