18

リレーショナル データベースでよく知られているように、トランザクション性の欠如に対処する方法を示す NoSQL アプリの良い例を探しています。ほとんどが読み取り専用のコードの場合、これははるかに簡単な作業であるため、私は主に書き込み集中型のコードに興味があります。NoSQL全般、CAP定理、結果整合性などについて多くのことを読んだことがありますが、それらはデータベースアーキテクチャ自体に集中する傾向があり、それで使用する設計パターンには集中しません。分散アプリ内で完全なトランザクション性を達成することは不可能であることは理解しています。これがまさに、タスクを実行可能にするために、どこでどのように要件を下げる必要があるかを理解したい理由です。

編集:

結果整合性がそれ自体の私の目標であるというわけではありません。今のところ、書き込みが集中する特定の処理に NoSQL を使用する方法がわかりません。説明: オファーがある単純なオークション システムを使用しています。理論的には、オファーを最初に受け入れた人が勝ちます。実際には、勝者が 1 人だけであることと、人々が同じリクエストで結果を取得できることを少なくとも保証したいと思います。おそらく実現不可能です。しかし、実際にそれを解決する方法 - 何かがうまくいかなかったために、リクエストによっては通常よりも時間がかかる場合があります。おそらく、一部のリクエストは自動的に更新されるはずです。これはほんの一例です。

4

3 に答える 3

34

純粋に直感的な言葉で CAP を説明しましょう。まず、C、A、P の意味は次のとおりです。

  • 一貫性: 外部オブザーバーの観点から、各「トランザクション」は完全に完了するか、完全にロールバックされます。たとえば、Amazon で購入する場合、サブシステムへの内部分割に関係なく、購入確認、注文ステータスの更新、在庫削減などはすべて「同期」しているように見える必要があります。

  • 可用性: 100% の要求が正常に完了します。

  • Partition Tolerance: システム内のノードのサブセットが利用できない場合でも、任意の要求を完了することができます。

これらは、システム設計の観点から何を意味しますか? CAP が定義する張力とは何ですか?

P を達成するには、レプリカが必要です。emがたくさん!保持するレプリカが多いほど、一部のノードがオフラインになっていても、必要なデータを利用できる可能性が高くなります。絶対的な「P」の場合、すべてのデータ項目をシステム内のすべてのノードに複製する必要があります。(明らかに、実生活では 2、3 などで妥協します)

A を達成するために、単一障害点は必要ありません。つまり、マスター/プライマリは単一障害点であるため、「プライマリ/セカンダリ」または「マスター/スレーブ」のレプリケーション構成は有効ではありません。複数のマスター構成を使用する必要があります。絶対的な「A」を達成するには、単一のレプリカが他のレプリカとは独立して読み取りと書き込みを処理できる必要があります。(実際には、非同期、キューベース、クォーラムなどで妥協しています)

C を達成するには、システムに「単一バージョンの真実」が必要です。つまり、ノード A に書き込み、すぐにノード B から読み戻すと、ノード B は最新の値を返す必要があります。明らかに、これは真の分散型マルチマスター システムでは起こり得ません。

それで、あなたの質問に対する解決策は何ですか?おそらく、いくつかの制約を緩め、他の制約を妥協するためです。

たとえば、n 個のレプリカを持つシステムで「完全な書き込み一貫性」を保証するには、読み取り数 + 書き込み数が n : r + w >= n 以上である必要があります。 これは例を使って簡単に説明できます。各アイテムを 3 つのレプリカに保存する場合、一貫性を保証するためのオプションがいくつかあります。

A) アイテムを 3 つのレプリカすべてに書き込んでから、3 つのレプリカのいずれかから読み取ることができ、最新バージョンを取得していると確信できます B) レプリカの 1 つにアイテムを書き込んでから、3 つのレプリカすべてを読み取り、選択することができます3 つの結果の最後 C) 3 つのレプリカのうち 2 つに書き込み、3 つのレプリカのうち 2 つから読み取ることができ、そのうちの 1 つに最新バージョンがあることが保証されています。

もちろん、上記のルールは、その間にノードがダウンしていないことを前提としています。P + Cを確実にするには、さらに妄想的になる必要があります...

また、無限に近い数の「実装」ハックがあります。たとえば、最小クォーラムに書き込めない場合、ストレージ レイヤーは呼び出しに失敗する可能性がありますが、成功を返した後でも追加のノードに更新を伝達し続ける可能性があります。または、セマンティックの保証を緩めて、バージョン管理の競合をマージする責任をビジネス レイヤーに押し上げる可能性があります (これは、Amazon の Dynamo が行ったことです)。

データのサブセットが異なれば保証も異なります (つまり、単一障害点は重要なデータには問題ないかもしれませんし、最小限の数の書き込みレプリカが新しいバージョンの書き込みに成功するまで、書き込み要求をブロックしても問題ないかもしれません)。

話し合うべきことはまだありますが、これが役に立ったかどうかをお知らせください。フォローアップの質問があれば、そこから続けることができます...

【続き…】

90% のケースを解決するためのパターンは既に存在しますが、各 NoSQL ソリューションは異なる構成でそれらを適用します。パターンは、パーティショニング (安定/ハッシュ ベースまたは変数/ルックアップ ベース)、冗長性とレプリケーション、メモリ キャッシュ、map/reduce などの分散アルゴリズムなどです。

これらのパターンを掘り下げると、基礎となるアルゴリズムもかなり普遍的です: バージョン ベクトル、マークル ツリー、DHT、ゴシップ プロトコルなどです。

ほとんどの SQL ソリューションについても同じことが言えます。それらはすべてインデックス (内部で b ツリーを使用) を実装し、既知の CS アルゴリズムに基づく比較的スマートなクエリ オプティマイザーを備えており、すべてメモリ内キャッシュを使用してディスク IO を削減します。違いは主に実装、管理経験、ツールセットのサポートなどにあります

残念ながら、あなたが知る必要があるすべてを含む知恵の中央リポジトリを示すことはできません. 一般に、本当に必要な NoSQL 特性は何かを自問することから始めます。これにより、キー値ストア、ドキュメント ストア、列ストアのいずれかを選択することができます。(これらは、NoSQL 製品の 3 つの主要なカテゴリです)。そこから、さまざまな実装の比較を開始できます。

[2011/4/14 再更新]

OK、これが実際に報奨金を正当化する部分です. NoSQL システムに関する次の 120 ページのホワイトペーパーを見つけました。これは、以前に存在しないと言った「NoSQL バイブル」に非常に近いものです。それを読んで喜んでください:-)

NoSQL データベース、Christof Strauch

于 2011-04-03T10:38:01.743 に答える
4

結果整合性に問題がないアプリケーションは数多くあります。かなり有名な例として、Twitter を考えてみましょう。あなたの「つぶやき」がすべての「フォロワー」に即座に送信されなければならない理由はありません。あなたの「つぶやき」が配信されるまでに数秒(または数分?)かかるとしたら、誰が気付くでしょうか。

Web 以外の例が必要な場合は、ストア アンド フォワード サービス (電子メールや USENET など) には結果整合性が必要です。

于 2011-04-03T07:06:03.773 に答える
1

NoSQLでトランザクションや一貫性を得るのは不可能ではありません。多くの人がNoSQLをトランザクションの欠如、または結果整合性の要求という観点から定義していますが、これは正確ではありません。アプリの一貫性を提供しながらも非常に適切に拡張できるトランザクションnosql製品があります(たとえば、タプルスペースを検討してください)。

于 2011-03-29T18:40:40.380 に答える