パフォーマンスを得るためには、クライアントが利用する全ての情報をCouchbase ServerのRAMに保存できればよいですが、これは全てのアプリケーションで可能ではなく、また得策ではない場合もあります。低レイテンシをサポートするには、データの"ワーキングセット"をRAMに格納して、直ちにアクセス可能な状態にすることが必要です。
Couchbase Serverのパフォーマンスを向上させるために使用されるキャッシング層の一部としてRAMにできるだけ多くのデータを保持した上で、ディスクにデータを格納します。ディスクの永続性によって、簡単にバックアップ/リストアといった操作が可能となり、データセットは、組み込みのキャッシュ層よりも大きく成長することができます。
Couchbaseは利用頻度の高いデータをメモリに、そうでないデータはディスクにと、自動的にRAMとディスク間で(非同期にバックグラウンドで)データを移動します。Couchbaseはクライアントからアクセスされた情報を監視し、アクティブなデータをキャッシュ層に保持します。
メモリ割り当て量に加えて、有効なメモリを開放する必要があるか判断するためにエンジンが利用する2つの設定(water mark)があります。これらはmem_low_wat
とmem_high_wat
です。
システムにデータがロードされると、いずれmem_low_watを超えます。この時点では何も起こりません。これはシステムがアイテムをディスクに移動する際に目標とする"ゴール"です。データをロードし続けると、最終的にmem_high_wat
に到達します。すると、アイテムがディスクに移行し、メモリが他のCouchbase Serverのアイテムに対して使用可能になるようにバックグラウンドジョブがスケジュールされます。測定されたメモリがmem_low_wat
に達するまで、このジョブは実行されます。入力アイテムの割合がディスクへの移動よりも早い場合、システムは十分なスペースがないことを示すエラーを返すことがあります。使用可能なメモリがある限りこれが継続されます。
積極的に使用される情報のためキャッシュからデータを削除する処理は排出と呼ばれ、Couchbase Serverのクラスタで構成された各バケットに設定されたしきい値によって自動的に制御されます。
クライアントがリクエストした各ドキュメントIDに対応する情報が存在するか否かが分かる必要がありますが、ディスクストレージを利用する場合、これが問題になります。Couchbase Serverはメタデータ構造を利用してこれを実現しています。メタデータはデータベースに保存された各ドキュメントの情報をRAMに保持します。これによりサーバが常に"ドキュメントIDが見つからない"ことを判定できます。また、RAMからでも(この場合即座に返却されます)、ディスクからでも(遅延の後、あるいはタイムアウトになったら)、ドキュメントのデータを返すことができます。
ディスクとの間で情報を移動するプロセスは非同期です。サーバがアクティブなリクエストを処理している間に、バックグラウンドでメモリからディスクへデータを排出します。データベースへの書込み負荷が高い場合は、サーバが十分なデータをメモリからディスクへ排出するまでの間、一時的なメモリ不足をクライアントへ通知する可能性があります。
同様に、サーバがメモリ上に存在しないアイテムをディスクからロードする場合、その処理はロードキューを処理するバックグラウンドプロセスによって実行され、ディスクから読み取ったデータはメモリへと返されます。クライアントは、サーバがデータをメモリにロードし、情報を返すまで待たされます。
このような非同期処理・キューの利用によって非常に高速な書き込みや読み込みが可能となります。急激な負荷の増加を軽減し、RDBMSのような性能の問題は起こりにくくなっています。