9

次のようなキーバリューストアはありますか?

  • ノードを追加および削除するだけで、データが自動的に再配布されます
  • ノードを削除しても、冗長性を提供するために2つの追加データノードを追加できます
  • 最大1GBのサイズのテキストまたは画像を保存できます
  • 最大100TBのデータを保存できます
  • 高速(その上でクエリを実行できるようになります)
  • これをすべてクライアントに対して透過的にします
  • Ubuntu/FreeBSDまたはMacで動作します
  • 無料またはオープンソース

基本的に、「単一」を使用できるものが必要であり、memcached、db、およびいくつかのストレージコンポーネントについて心配する必要はないので、そうです、データベースの「銀の弾丸」が必要です。

ありがとう

ズベイル

これまでの回答:BackBlaze上にあるMogileFS-私が見る限り、これは単なるファイルシステムであり、いくつかの調査の結果、大きな画像ファイルにのみ適しているようです。

東京暴君-ライトクラウドが必要です。新しいノードを追加しても、これは自動スケーリングされません。私はこれを調べましたが、単一のノードに適合するクエリでは非常に高速であるようですが

Riak-これは私が自分で調べているものですが、まだ結果がありません

Amazon S3-本番環境で唯一の永続化レイヤーとしてこれを使用している人はいますか?私が見たところ、複雑なクエリは高すぎるため、画像の保存に使用されているようです

@shamanはCassandraを提案しました-間違いなく私が調べているものです

これまでのところ、100ポイントの賞金を提供した後でも、質問に答えられなかったとしても、私が述べた基準を満たすデータベースまたはキーバリューストアはないようです。

4

12 に答える 12

17

あなたはオープンソースソフトウェアにあまりにも多くを求めています。

エンタープライズクラスのソフトウェアの予算に数十万ドルある場合は、いくつかの解決策があります。箱から出して欲しいものを何もするつもりはありませんが、あなたが探しているものに近い製品を持っている会社があります。

「高速(その上でクエリを実行できるようになります)」

Key-Valueストアがある場合は、すべてが非常に高速である必要があります。ただし、問題は、Key-Valueストアの上に構築されたオントロジーまたはデータスキーマがないと、クエリごとにデータベース全体を調べてしまうことです。保存するデータの「タイプ」ごとにキーを含むインデックスが必要です。

この場合、通常、最大15,000台のマシンすべてに対して並行してクエリを実行できます。ボトルネックは、安価なハードドライブが1秒あたり50シークで上限に達することです。データセットがRAMに収まる場合、パフォーマンスは非常に高くなります。ただし、キーがRAMに保存されているが、値を保存するのに十分なRAMがない場合、システムはほとんどすべてのキー値ルックアップでディスクに移動します。キーはそれぞれ、ドライブ上のランダムな位置に配置されています。

これにより、サーバーごとに1秒あたり50のKey-Valueルックアップに制限されます。キーと値のペアがRAMに保存されている場合、コモディティハードウェア(Redisなど)でサーバーごとに1秒あたり100kの操作が行われることは珍しくありません。

ただし、シリアルディスクの読み取りパフォーマンスは非常に高くなります。シリアル読み取りで50MB/ s(800 Mb / s)のシークドライブがあります。したがって、ディスクに値を格納する場合は、ディスクから読み取る必要のある値をシリアルに読み取ることができるようにストレージを構成する必要があります。

それは問題。キーと値のペアを完全にRAM(またはSSDドライブ上の値を持つRAMのキー)に格納するか、あるタイプのスキーマまたはタイプシステムをその上に定義しない限り、バニラキー値ストアで良好なパフォーマンスを得ることができません。キーを押してから、ディスク上のデータをクラスター化して、特定のタイプのすべてのキーをシリアルディスク読み取りで簡単に取得できるようにします。

キーに複数のタイプがある場合(たとえば、データベースにデータ型の継承関係がある場合)、キーは複数のインデックステーブルの要素になります。この場合、ディスクからシリアルに読み取れるように値を構造化するために、時空間のトレードオフを行う必要があります。これには、キーの値の冗長コピーを保存する必要があります。

特にクエリを実行する場合は、Key-Valueストアよりも少し高度なものが必要になります。ただし、大きなファイルを保存する問題は問題ではありません。システムが最大50メガをキーイングできるふりをします。次に、1ギガのファイルを50メガのセグメントに分割し、各セグメントの値にキーを関連付けます。単純なサーバーを使用すると、必要なファイルの部分をKey-Valueルックアップ操作に変換するのは簡単です。

冗長性を実現する問題はより困難です。サーバーのキー値テーブルを「ファウンテンコード」または「パーツファイル」するのは非常に簡単なので、特定のサーバーが停止した場合に、サーバーのデータをワイヤ速度(1 Gb / s)でスタンバイサーバーに再構築できます。通常、サーバーが10秒間応答しない場合にトリガーされる「ハートビート」システムを使用して、サーバーの停止を検出できます。パーツファイルでエンコードされたKey-Valueテーブルに対してKey-Valueルックアップを行うことも可能ですが、それは非効率的ですが、サーバー障害が発生した場合のバックアップを提供します。より大きな問題は、バックアップを最新の状態に保つことはほとんど不可能であり、データは3分前のものである可能性があります。大量の書き込みを行う場合、バックアップ機能によってパフォーマンスのオーバーヘッドが発生します。

私は障害モードでデータベースの整合性と整合性制約を維持する専門家ではないため、この要件によってどのような問題が発生するかわかりません。これについて心配する必要がない場合は、システムの設計とその要件が大幅に簡素化されます。

高速(その上でクエリを実行できるようになります)

まず、データベースがこれほど大きい場合は、結合やn * log(n)よりも高速にスケーリングする操作を忘れてください。通常実装されている機能を結合で置き換えるためにできることは2つあります。結合を行う必要がないようにデータを構造化するか、実行しているクエリを「プリコンパイル」して時間と空間のトレードオフを行い、結合を事前に計算して、事前にルックアップ用に保存することができます。 。

セマンティックWebデータベースの場合、適度なサイズのデータ​​セットでも適切なパフォーマンスを実現するために、クエリを事前にコンパイルし、時間と空間のトレードオフを行う人々が見られると思います。これは、アプリケーションプログラマーの努力なしに、データベースバックエンドによって自動的かつ透過的に実行できると思います。ただし、リレーショナルデータベースにこれらの手法を実装しているエンタープライズデータベースはまだ始まったばかりです。私の知る限り、オープンソース製品はこれを実行しません。水平方向にスケーラブルなデータベースのリンクトデータに対してこれを実行しようとしている人がいるとしたら、私は驚きます。

これらのタイプのシステムでは、追加のRAMまたはストレージスペースがある場合、キー値ストアに冗長性を追加するのではなく、パフォーマンス上の理由から、一般的なサブクエリの結果を事前に計算して保存するのが最適です。結果を事前に計算し、クエリ対象のキーで並べ替えて、n ^ 2結合をlog(n)ルックアップに変換します。n * log(n)よりもスケーリングが悪いクエリまたはサブクエリは、結果を実行してKey-Valueストアにキャッシュする必要があるものです。

多数の書き込みを実行している場合、キャッシュされたサブクエリは、処理できるよりも早く無効になり、パフォーマンス上の利点はありません。キャッシュされたサブクエリのキャッシュ無効化に対処することは、もう1つの手に負えない問題です。解決策は可能だと思いますが、見たことがありません。

地獄へようこそ。このようなシステムをさらに20年間無料で入手できると期待すべきではありません。

これまでのところ、100ポイントの賞金を提供した後でも、質問に答えられなかったとしても、私が述べた基準を満たすデータベースまたはキーバリューストアはないようです。

あなたは奇跡を求めています。オープンソースの奇跡のデータベースができるまで20年待ちます。そうしないと、アプリケーションのニーズに合わせてカスタマイズされたソリューションにお金を払う必要があります。

于 2010-08-29T08:52:56.420 に答える
5

Amazon S3 はストレージ ソリューションであり、データベースではありません。

単純なキー/値のみが必要な場合は、Amazon SimpleDB を S3 と組み合わせて使用​​することをお勧めします。大きなファイルは S3 に保存され、検索用のメタデータは SimpleDB に保存されます。これにより、S3 に直接アクセスできる水平方向にスケーラブルなキー/値システムが提供されます。

于 2010-01-29T07:39:21.780 に答える
4

HBaseとHDFSは一緒になって、これらの要件のほとんどを満たします。HBaseは、小さなオブジェクトの保存と取得に使用できます。HDFSは、大きなオブジェクトを格納するために使用できます。HBaseは小さなオブジェクトを圧縮し、大きなオブジェクトとしてHDFSに保存します。速度は相対的です-HBaseはディスクからのランダム読み取りではmysqlほど高速ではありません(たとえば)-しかし、メモリからの読み取りにはかなり高速です(Cassandraと同様)。書き込み性能に優れています。基盤となるストレージレイヤーであるHDFSは、複数のノードの損失に対して完全に回復力があります。ラック間で複製するだけでなく、ラックレベルのメンテナンスも可能です。これは、Apacheライセンスを持つJavaベースのスタックです-ほとんどのOSを実行します。

このスタックの主な弱点は、最適なランダムディスク読み取りパフォーマンスに満たないことと、クロスデータセンターのサポートがないことです(これは進行中の作業です)。

于 2010-04-18T17:51:08.210 に答える
4

まさにあなたが探しているものと思われる別のソリューションがあります: Apache Cassandra プロジェクト: http://incubator.apache.org/cassandra/

現在、Twitter は memcached+mysql クラスターから Cassandra に切り替えています。

于 2010-02-26T13:39:32.087 に答える
2

私があなたの質問で見たものから、ProjectVoldemortが最も近いもののようです。彼らのデザインページを見てください。

私が見る唯一の問題は、それが巨大なファイルをどのように処理するかということであり、このスレッドによると、すべてが良いわけではありません。ただし、ファイルを使用すると、いつでもかなり簡単に回避できます。結局のところ、これがファイルシステムの正確な目的です。ファイルシステムのウィキペディアリストを見てください-リストは膨大です。

于 2010-01-29T08:30:59.120 に答える
2

2 つの解決策を提案できます。

1) Amazon のサービス (Amazon S3) を購入します。100 TB の場合、月額 14,512 ドルかかります。
2) はるかに安価なソリューション:

2 つのカスタム Backblaze ストレージ ポッド (リンク) を構築し、その上で MogileFS を実行します。

現在、同様のソリューションを使用して数ペタバイトのデータを保存する方法を調査しているので、その上で何か興味深いことを見つけたら、メモを投稿してください。

于 2010-01-21T10:27:18.197 に答える
2

東京タイラントを見てください。これは、東京キャビネットのキー値ストアをネットワークにエクスポートする、非常に軽量で高性能な複製デーモンです。私はそれについて良いことを聞いたことがあります。

于 2010-01-22T10:26:30.070 に答える
1

他の人が言及したことに加えて、OrientDB を見ることができます - http://code.google.com/p/orient/非常に有望なドキュメントと K/V ストアです。

于 2011-10-04T22:43:26.140 に答える
1

BigCouchをチェックしてください。これは CouchDB ですが、クラスター用に最適化されています (そして、クラスターが適しているすべてのビッグデータ問題)。私たちが話しているように、 BigCouch はCloudantの人々によってCouchDB プロジェクトに統合されつつあります。その多くは CouchDB のコア コミッターです。

要件の概要:

ノードを追加および削除するだけで、データが自動的に再配布されます

ノードを削除しても、冗長性を提供するために 2 つの余分なデータ ノードが残っていることを許可してください

はい。BigCouch は Dynamo の Quorum の概念を使用して、データのコピーを保持するノードの数を設定します。

サイズが 1GB までのテキストまたは画像を保存できるようにする

はい。CouchDB と同様に、任意のサイズの BLOB (ファイルなど) をデータベースにストリーミングできます。

最大 100 TB のデータの小さなサイズのデータ​​を保存できます

はい。BigCouch を構築したチームは、1 秒あたりペタバイトのデータを生成するシステムに直面していたため、そうしました。

高速(その上でクエリを実行できるようになります)

はい。クエリは MapReduce によってO(log n) 時間で実行されます。

これらすべてをクライアントに透過的にする

Ubuntu/FreeBSD または Mac で動作

無料またはオープンソース

うん!Apache 2.0 ライセンスの下でオープン ソース。デフォルトのインストール手順は、Ubuntu などの Debian システム用です。

于 2013-05-31T11:18:14.610 に答える
1

MarkLogic はこの方向に向かっています。全然無料じゃないけど…

于 2011-07-23T23:37:57.943 に答える
1

ズバイル、

これまでのところ、何よりも高速なキー値ストアに取り組んでいます。

(まだ) レプリケーションを使用しておらず、最初の 2 つの要件がありませんが、この質問は私にインスピレーションを与えました - ありがとう!

いいえ: ノードを追加および削除するだけで、データを自動的に再配布できます
いいえ: ノードを削除しても、冗長性を提供するために 2 つの追加データ ノードを保持できます
ok: 最大 1GB のサイズのテキストまたは画像を保存できます(はい:無制限)
ok: 100 TB までの小さなサイズのデータ​​を保存できます(はい: 無制限)
ok: 高速です (その上でクエリを実行できます) (はい: Tokyo Cabinet の TC-FIXED アレイよりも高速です)
ok: Makeクライアントに対して透過的(はい: Web サーバーに統合)
ok: Ubuntu/FreeBSD または Mac で動作 (はい: Linux)
ok: フリーまたはオープンソース(はい: フリーウェア)

ハッシュ テーブルや B ツリーよりも優れたシングル スレッド パフォーマンスに加えて、この KV ストアは、「WAIT-FREE」であることがわかっている唯一のストアです (操作をブロックしたり遅延したりしません)。

于 2011-06-07T14:44:00.037 に答える
1

MongoDBをご覧になることをお勧めします。

私が言えることは、データベースと分散ファイルシステムの組み合わせを探しているということですが、見つけるのが難しいか、不可能でさえあるかもしれません。

MooseFSGlusterなどの分散ファイルシステムを調べて、データをファイルとして保持することをお勧めします。どちらのシステムもフォールト トレラントで分散型 (好きなようにノードを出し入れできます) であり、どちらもクライアントに対して透過的です (FUSE の上に構築されています) - シンプルなファイルシステム ops を使用しています。これは次の機能をカバーします: 1)、2)、3)、4)、6)、7)、8)。私たちはデジタル ムービー ストレージに MooseFS を使用しており、約 1.5 PB のストレージがあり、アップロード/ダウンロードはネットワーク設定が許す限り高速です (したがって、パフォーマンスはプロトコルや実装に依存するのではなく、I/O に依存します)。リストにクエリ (機能 5) はありませんが、そのようなファイルシステムを MongoDBなどと組み合わせることができます。または、ファイルシステムに保存されているデータをクエリするための Lucene (クラスター化されたインデックスがある) のような検索エンジンですらあります。

于 2010-01-28T21:23:28.420 に答える