「トゥームストーン」文書

トゥームストーン文書とは、元の文書が削除された場合にデータベース内に保管される小さい文書です。 この文書の目的は、削除操作の複製を可能にすることです。

複製が完了したら、トゥームストーンは不要になります。 自動圧縮によって、保管されるデータ量も複製時に転送されるデータ量も最小限に抑えることができます。 それでも 墓碑銘は自動的に削除されるわけではない。

時間の経過とともに、文書が作成および削除されるにつれて、 トゥームストーン文書の数は増加します。 個々のトゥームストーンは小さくても、 徐々にデータベースのディスク・スペース使用量を増大させ、 1 次索引の照会時間を増加させることになります。 このような影響を減らすために、トゥームストーンを削除することをお勧めします。

「トゥームストーン」文書の単純な削除

トゥームストーンを手動で削除するには、以下の手順を実行します。

  1. 必要な文書を格納するためのデータベースを作成します。

この新規データベースは、トゥームストーン文書以外のすべての文書を格納するためのものです。

  1. 元のデータベースの文書を新規データベースに複製するために、 フィルターされた複製をセットアップします。

_deleted」属性を持つ文書を複製しないようにフィルターを構成します。

  1. 複製が完了したら、新規データベースを使用するようにアプリケーションのロジックを切り替えます。

  2. アプリケーションが新規データベースで正常に機能することを確認します。

すべてが正常に機能していることを確認したら、古いデータベースを削除することができます。

一般には、削除の実行が必要最小限になるようにアプリケーションを設計および実装することを目指してください。

削除された文書を複製時に除外するフィルターの例を次に示します。

{
	"_id": "_design/filters",
	"filters": {
		"deleted_filter": "function(doc, req) { return !doc._deleted; };"
	}
}

トゥームストーン文書の高度な削除

複製が実行されている間、ソース・データベースで文書の更新が行われなければ、 単純な削除の手法で問題ありません。

複製中に更新が行われる場合は、通常どおり完全な文書がターゲット・データベースに複製された後に、 さらにその文書がソース・データベースで削除されたために、トゥームストーンが残ることがあります。 問題は、トゥームストーンがフィルターで除外されるために、 ターゲット・データベースに複製されないことです。 そのため、ソース・データベースから削除された文書がターゲット・データベースから削除されずに、 不整合が発生します。

解決策は、墓石をより高度に除去することである。 validate_doc_update 機能

validate_doc_update 関数は、設計文書に保管されています。 この関数は、データベース内で文書が更新されるたびに実行されます。 この関数を使用して、無効な文書更新または無許可の文書更新を防止することができます。

この関数は、以下のパラメーターを使用して動作します。

  • 新規バージョンの文書。
  • データベース内にある現行バージョンの文書。
  • ユーザー・コンテキスト。これを使用して、更新された文書を提供したユーザーに関する詳細を取得します。

この関数は、要求を検査して、その更新を進めてよいかどうかを判別します。 受け入れ可能な更新である場合は、関数が戻ります。 受け入れ可能な更新でない場合は、該当するエラー・オブジェクトが返されます。 具体的には、更新を実行する権限がユーザーにない場合には、 unauthorized エラー・オブジェクトが、説明のエラー・メッセージとともに返されます。 同様に、要求された更新が何らかの理由で許可されない場合があります。例えば、新規文書に必須フィールドがない場合などです。 この場合は、forbidden エラー・オブジェクトが、やはり説明のエラー・メッセージとともに返されます。

トゥームストーンを削除するためには、以下のように機能する validate_doc_update 関数が適しています。

  1. 更新が、ターゲット・データベース内の既存の文書 (oldDoc) に変更を適用するものである場合は、 関数は戻ることでその変更を許可します。

この理由は、その更新が、複製中にターゲット・データベースにコピーされたものの、まだ複製中のソース・データベースで 変更された文書に対する更新であるからです。 その変更が DELETE であり、ターゲット・データベースに トゥームストーン・レコードが生成される可能性もあります。 そのトゥームストーン・レコードは、後で将来のいずれかの時点で行われる複製プロセスで削除されます。 2. ターゲット・データベースに現行文書のコピーがなく、かつ更新される文書に (その文書がトゥームストーンであることを示す) _deleted プロパティーが含まれています。 したがって、その更新される文書はトゥームストーンであり、過去に検出されたものであるため、ターゲット・データベースに対する更新は拒否する必要があります。

ターゲット・データベースにまだ存在しない削除済みの文書を拒否するための JavaScript の validate_doc_update 関数の例を以下に示します。

function(newDoc, oldDoc, userCtx) {
	// any update to an existing doc is OK
	if(oldDoc) {
		return;
	}

	// reject tombstones for docs we don’t know about
	if(newDoc["_deleted"]) {
		throw({forbidden : "Deleted document rejected"});
	}

	return; // Not strictly necessary, but clearer.
}

validate_doc_update 関数を使用してトゥームストーン文書を削除するには、以下のようにします。

  1. ソース・データベースからターゲット・データベースへの複製を停止します。
  2. 適切な場合は、ターゲット・データベースを削除してから、 新規ターゲット・データベースを作成します。
  3. 上記の例のような適切な validate_doc_update 関数を追加します。
  4. この関数は、ターゲット・データベースの設計文書に追加します。
  5. ソース・データベースと (新規) ターゲット・データベースの間の複製を再開します。
  6. 複製が完了したら、新規データベースを使用するようにアプリケーションのロジックを切り替えます。
  7. アプリケーションが新規データベースで正常に機能することを確認します。

すべてが正常に機能していることを確認したら、古いデータベースを削除することができます。

validate_doc_update 関数を使用してトゥームストーン文書を削除する方法として、もう 1 つ別の方法を次に示します。

  1. 例えば、削除日を記録するためにメタデータをトゥームストーン文書に追加します。
  2. 関数を使用してそのメタデータを検査し、ターゲット・データベースに適用すべき削除文書であれば、その削除文書を許可します。

このような検査を行うと、削除を正しく複製するために役立ちます。

トゥームストーン削除のパフォーマンスへの影響

トゥームストーンは、データベース間で文書の削除についての整合性を向上させるために使用されます。 この目的は、特にモバイル・デバイスの場合に重要です。 トゥームストーン・ドキュメントがないと、削除がモバイル・デバイスに正しく複製されず、その結果、ドキュメントがデバイスから削除されない可能性があります。

例えば、複製用に新規ターゲット・データベースを作成するなど、データベースを再作成する場合には、 そのターゲット・データベースをサーバーとして使用しているクライアントで、すべての変更をもう一度処理する必要があります。データベースのシーケンス番号が変わった可能性があるからです。

validate_doc_update 関数を使用する場合に、この関数をクライアントに複製することは避けてください。 この規則は、この関数がクライアント上にあることで望ましくない副次的影響が発生する可能性を防ぐためです。

IBM Cloudant sync ライブラリーは設計文書を複製しないので、validate_doc_update 関数の複製が IBM Cloudant で問題になることは通常ありません。 ただし、他のクライアントが設計文書や validate_doc_update 関数を複製し、望ましくない副次的影響が引き起こされる可能性があります。