Couchbaseは最近、分散型マルチドキュメントACIDトランザクション実装の詳細な説明を公開した。Couchbaseはブログ投稿で、DBエンジンがMonotonic Atomic View一貫性モデルをどのようにサポートするかを説明している。これは、Read Committed一貫性モデルの強化バージョンである。
Couchbaseのアーキテクチャには、中央のトランザクションコーディネーターはいない。各クライアントが、トランザクションの調整に責任を持つ。SDKは、内部でこの調整を実行する。ブログ投稿者であるDenis Rosa氏は、2人のユーザ間の従来からある送金シナリオの例を示している。この例では、ユーザは1人のユーザの残高から特定の金額を差し引き、別のユーザの残高を同じ金額だけ増やす必要がある。次の画像は、トランザクション調整プロセスを示している。
Couchbaseでの分散トランザクションの例
出典: https://blog.couchbase.com/distributed-multi-document-acid-transactions/
vBucketは、Couchbase内部のシャーディングのユニットである。各vBucketには、アクティブトランザクションレコード(ATR)と呼ばれるトランザクションログを担当する単一のドキュメントがある。最初のドキュメント変更の前に、クライアントは変更されたレコードのvBucket ATRに、トランザクションIDと「保留中」のステータスと共に新しいエントリを追加する。
次に、クライアントは変更されたコンテンツを各レコードの「メタ」セクションに追加する。メタセクション(xAttrsとも呼ばれる)は、クライアントがメタデータを格納できる領域である。変更されたドキュメントは、別々のvBucketと物理ノードに存在する可能性がある。
クライアントがすべての変更を完了すると、ATRでトランザクションを「コミット済み」としてマークし、関連するドキュメントIDのリストで更新する。次に、クライアントは、関連するすべてのドキュメントを、メタデータセクションで以前にステージングした変更で更新する。そして、ドキュメント本体を置き換えて、トランザクションメタデータ情報を削除する。最後に、トランザクションは「完了」としてマークされ、ATRから削除される。
Monotonic Atomic Viewをサポートするために、Couchbaseクライアントは各ドキュメントのメタデータセクションを読み取るときにチェックする。ドキュメントのメタデータでトランザクションの存在を検出すると、それを保持しているATRからトランザクションに関係する詳細を読み取る。他のクライアントがトランザクションを「コミット済み」としてマークした場合、クライアントはメインのドキュメント本文ではなく、レコードのメタデータにあるステージされた変更を使用する。このクライアントの連携により、エラーや障害が発生した場合でも、原子性と独立性が保証される。以下の画像は、この流れの詳細を示している。
クライアントの連携によるトランザクション独立性保証
出典: https://blog.couchbase.com/distributed-multi-document-acid-transactions/
Couchbaseは、vBucketごとに多数の複製を用意することで耐久性を実現している。ユーザは、必要なレプリカの数を設定できる。また、ユーザは操作時の耐久性の要件を指定できる。これにより、クライアントが書き込みのACK応答を取得する速度とデータの「永続性」の間のトレードオフが制御できる。これらの設定は両方とも、トランザクション操作にも影響する。
さらに、何かが失敗した場合(トランザクションのタイムアウトなど)、トランザクションライブラリは定期的にクリーンアップジョブを実行して、すべてのドキュメントを可能な限り小さく保つ。
Couchbaseは、多くの人が利用するオープンソースの分散型マルチモデルNoSQLドキュメント指向データベースである。これは、マネージドキャッシュ、高速クエリ用のインデクサー、およびSQLのようなクエリを実行するためのクエリエンジンを備えたKey-Valueストアを提供する。