3

私は RDBMS のバックグラウンドを持ち、バックエンドとして Cassandra を使用してアプリを設計していますが、自分の設計の有効性とスケーラビリティについて確信が持てません。

私は、本/映画/などのある種の評価/フィードバックアプリに取り組んでいます。Cassandra には柔軟な列ファミリー (スパース構造) の概念があるため、次のスキーマを使用することを考えました。

user-id (row key): book-id/movie-id (dynamic column name) - rating (column value)

このようにすると、本質的に行キーに関連付けられていなくても、何百万もの列 (RDBMS では行) を持つことになります。たとえば、次のようになります。

user1: {book1:Rating-Ok; book1023:good; book982821:good}
user2: {book75:Ok;book1023:good;book44511:Awesome}

すべての列ファミリーが 1 つのファイルに格納されているため、これがスケーラブルな設計であるかどうか (またはまったく設計ではない!) はわかりません。さらに、 のようなクエリがあるかもしれません"pick all 'good' reviews of 'book125'"。どのようなアプローチを使用する必要がありますか?

4

3 に答える 3

2

この設計は完全にスケーラブルです。Cassandra はデータをスパース形式で保存するため、空のセルがディスク領域を消費することはありません。

欠点は、cassandra が値によるインデックス作成にあまり適していないことです。セカンダリ インデックスはありますが、何百万もの列のそれぞれではなく、1 つまたは 2 つの列にインデックスを付けるためにのみ使用する必要があります。

この問題に対処するには、次の 2 つのオプションがあります。

  • マテリアライズド ビュー (たとえば、ここで説明されています: http://maxgrinev.com/2010/07/12/do-you-really-need-sql-to-do-it-all-in-cassandra/ )。これにより、事前定義された一連のクエリ (おそらく非常に複雑なもの) を作成できます。
  • アドホック クエリは、データセット全体を効果的に反復するある種の map/reduce ジョブで可能です。これは恐ろしく聞こえるかもしれませんが、それでも非常に高速です。Cassandra はすべてのデータを SSTable に格納し、この反復処理を実装してデータ ファイルを順次スキャンすることができます。
于 2012-09-13T22:55:55.977 に答える
2

必要な一連のクエリから開始し、それらのビューをサポートするように列ファミリーを構成します。特に関連するフィールドが非常に少ないため、各 CF はデータの独自のインデックス付きビューとして低コストで機能します。フェッチ中に、キーはデータを最終的に 1 つの特定の Cassandra ノードに分割します。このノードは、一連の幅の広い行をアプリ サーバーに事前に決められた順序で迅速にストリーミングできます。これは Cassandra の強みの 1 つです。RDBMS テーブルのインデックス付き検索でさまざまなトラックやセクターをバウンスする場合と比較して、物理メディア (キャッシュされていない場合) での読み取りの断片化が非常に少ないためです。

可能な場合に役立つ 1 つの方法は、キーを選択してデータをセグメント化し、そのセグメント内のすべての列のフル スキャンが合理的な提案であり、クエリに大まかに適合するようにすることです。次に、そのフィルタリングがクライアント (アプリ サーバー) で実行されている場合でも、必要のないものをフィルタリングします。映画のすべてのレビューが良い例です。肯定的なレビューをフィルター処理したり、最近のレビューや概要のみを提供したりしたとしても、そのキーのすべての行を合理的に取得してから、不要なものを破棄することができます。

于 2012-09-14T03:48:38.997 に答える
0

もう 1 つのオプションは、データを (時間ごと、カテゴリごとに) 分割する方法を理解できる場合です。playOrm は、S-SQL を非常に高速にパーティションに分割するソリューションを提供します。スケーラビリティを維持するためにデータを分割し、必要な数のパーティションを持つことができることを除いて、RDBMS と非常によく似ています。パーティションには数百万行を含めることができます(パーティション内でも1,000万行を超えることはありません)。

後、ディーン

于 2012-09-14T19:45:44.503 に答える