Couchbase Serverが少しいい加減に有効期限を処理すること、つまり有効期限切れのアイテムがすぐに削除されるのではなく、まず削除フラグを付けられるということに注意してください。Couchbase Serverには保守プロセスがあり、これはexpiry pagerと呼ばれ、定期的にすべての情報を確認して、有効期限切れのアイテムを削除します。この保守プロセスは60分ごとに実行されますが、異なる間隔で実行するように変更可能です。Couchbase Serverは次のこのアイテムへのリクエスト時に削除のフラグがついたアイテムをすぐに削除し、サーバはリクエスト処理にアイテムが存在しないと応答します。
ビューからの結果セットには、ディスク上に格納されたビュー関数の要求を満たすアイテムが含まれるでしょう。したがって、ディスクからまだ削除されていない情報はビューへの問い合わせの時に結果セットの一部として表示されてしまいます。
Couchbase ビューを使用すると、計算やデータの集計に利用するため、reduce関数も実行できます。たとえば、オブジェクトのタイプのインスタンスをカウントしたい場合、reduce関数を使用することになります。繰り返しになりますが、アイテムがディスク上にあれば、reduce関数で実行される計算に含まれます。ディスクの永続化のためにこのような動作をするので、ビューの有効期限を処理するためのガイドラインをここで紹介します。
結果セットでの有効期限切れのドキュメントを判別する :Couchbase Serverからインデックスされたアイテムのためのビューを使用する場合、expiry pagerの保守プロセスの一部としてまだ削除されていないアイテムは、ビューへの問い合わせで返ってくる結果セットの一部となります。結果セットからこれらのアイテムを除外するには、include_doc
パラメータをtrue
にセットしたクエリを使用するべきです。このパラメータによって、通常、結果セット内のキーに関連付けられているすべてのJSONドキュメントを含みます。例えば、include_docs=true
パラメータを使用した場合、Couchbase Serverは追加の"doc"
オブジェクトを含んだ結果セットを返し、そのオブジェクトにはキーのJSONもしくはバイナリデータを含んでいます:
{"total_rows":2,"rows":[ {"id":"test","key":"test","value":null,"doc":{"meta":{"id":"test","rev":"4-0000003f04e86b040000000000000000","expiration":0,"flags":0},"json":{"testkey":"testvalue"}}}, {"id":"test2","key":"test2","value":null,"doc":{"meta":{"id":"test2","rev":"3-0000004134bd596f50bce37d00000000","expiration":1354556285,"flags":0},"json":{"testkey":"testvalue"}}} ] }
include_doc=true
をセットした場合、有効期限切れのドキュメントについては、Couchbase Serverはドキュメントはもうすでに存在しないということを示して結果セットを返します。特に、有効期限切れでまだクリーンアッププロセスにより削除されていないキーがあれば、"doc":null
という行として結果セットが表示されるでしょう。
{"total_rows":2,"rows":[ {"id":"test","key":"test","value":null,"doc":{"meta":{"id":"test","rev":"4-0000003f04e86b040000000000000000","expiration":0,"flags":0},"json":{"testkey":"testvalue"}}}, {"id":"test2","key":"test2","value":null,"doc":null} ] }
Reduceと有効期限切れドキュメント:いくつかのケースでは、Couchbase Server 2.0のデータに対して集計したり、計算したりするためにreduce 関数を実行したいことがあります。このケースでは、Couchbase Serverはインデックスで格納されている事前に計算された値を取り、最終的な結果を算出します。また、これはまだディスク上にある有効期限切れのアイテムがreduceの一部になるということを意味します。これは有効期限切れアイテムの割合が他のアイテムと比較して比例して低い場合、最終的な結果としてあまり問題になりません。例えば100万のプレイヤーの平均スコアを計算するために、10の有効期限切れスコアがまだディスク上に残っている場合、最終的な結果でごく小さな違いにしかなりません。しかしながら、20のプレイヤーの平均スコアを計算するために、10の有効期限切れスコアがまだディスク上に残っている場合、予想した平均よりと大きく違う結果となるでしょう。
このケースでは、有効期限切れのアイテムがreduce関数内で使用される計算に確実に含まれないようにより頻繁にexpiry pagerプロセスを実行したいでしょう。クラスタの各ノードでexpiry pagerが10分間隔で実行されることを推奨します。ノード上でより頻繁にクリーンアップを実行するので、この間隔はノードの性能に多少の影響を与えるということに十分注意してください。
保守プロセスの実行間隔の設定についての詳細は、Couchbase コマンドラインツールのマニュアルCouchbase Server Manual 2.0, Specifying Disk Cleanup Intervalを参照し、そしてexp_pager_stime
のサンプルを参照してください。ビューとビューへの問い合わせのパラメータについての詳細は、Finding Data with Viewsを参照してください。