61

ちょっとした背景として、この質問は単一の小さな EC2 インスタンスで実行されているプロジェクトを扱っており、中規模のインスタンスに移行しようとしています。主なコンポーネントは、Django、MySQL、および python と java で記述された多数のカスタム分析ツールであり、これらが面倒な作業を行います。同じマシンで Apache も実行されています。

データ モデルは次のようになります。大量のリアルタイム データがさまざまなネットワーク センサーからストリーミングされます。理想的には、現在の 15 分ごとのアプローチではなく、ロング ポーリング アプローチを確立したいと考えています (統計の計算とデータベース自体への書き込み)。データが入ってきたら、未加工のバージョンを MySQL に保存し、分析ツールにこのデータを解き放ち、別のいくつかのテーブルに統計を保存します。これらはすべて Django を使用してレンダリングされます。

私が必要とするリレーショナル機能 -

  • [CassandraのAPIのSliceRangeはこれを満たしているようです]による注文
  • グループ化
  • 複数のテーブル間の多対多関係[Cassandra SuperColumns は 1 対多でうまく機能するようです]
  • これについて Sphinx は素晴らしい全文エンジンを提供してくれるので、それも必要です。[Cassandra では、Lucandra プロジェクトがこのニーズを満たしているようです]

私の主な問題は、データの読み取りが非常に遅いことです (書き込みもそれほど速くありません)。今は多額のお金やハードウェアを投入したくありません。また、時間の経過とともに簡単に拡張できるものを選びたいと思っています。MySQL の垂直方向のスケーリングは、その意味で簡単ではありません (または安価です)。

基本的に、NOSQL について多くのことを読み、MongoDB、Cassandra、Voldemort などを試した後、私の質問は次のとおりです。

  • 中程度の EC2 インスタンスでは、Cassandra のようなものに移行することで、読み取り/書き込みにメリットがありますか? この記事(pdf) は間違いなくそれを示唆しているようです。現在、毎分数百回の書き込みが標準だと思います。読み取りの場合 - データは約 5 分ごとに変更されるため、キャッシュの無効化はかなり迅速に行う必要があります。ある時点で、多数の同時ユーザーも処理できるようになるはずです。現在、MySQL では、インデックスが作成されていても、大きなテーブルでいくつかの結合を実行すると、アプリのパフォーマンスが低下します。32k 行程度のものは、レンダリングに 1 分以上かかります。(これは、EC2 仮想化 I/O のアーティファクトでもある可能性があります)。テーブルのサイズは約 400 万から 500 万行で、そのようなテーブルは約 5 つあります。

  • CAP定理と結果整合性を考えると、複数のノードでCassandraを使用することについて誰もが話しています。しかし、成長し始めたばかりのプロジェクトの場合、1 ノードの cassandra サーバーをデプロイする意味はありますか? 注意事項はありますか?たとえば、Django のバックエンドとして MySQL を置き換えることはできますか? 【おすすめは?】

  • シフトする場合、行をフェッチするために複数のルックアップを行う必要があるため、アプリの一部を書き直して、より多くの「管理」を行う必要があると思います。

  • MySQL をリレーショナル エンジンではなく、キー バリュー ストアとして使用することに意味があるでしょうか。そうすれば、安定したエンジンだけでなく、利用可能な多数の安定した API を利用することができます (必要に応じてリレーショナルに移行することもできます)。(これに関する Friendfeed からの Brett Taylor の投稿 - http://bret.appspot.com/entry/how-friendfeed-uses-mysql )

シフトを行った人からの洞察は大歓迎です!

ありがとう。

4

3 に答える 3

38

Cassandraおよび現在利用可能な他の分散データベースは、SQLからのアドホッククエリサポートのようなものを提供していません。これは、結合を使用してクエリをパフォーマンス的に分散できないため、代わりに非正規化に重点が置かれているためです。

ただし、Cassandra 0.6(ベータ版は明日正式にリリースされますが、焦りがちな場合は0.6ブランチから自分でビルドできます)は、分析用のHadoop map / reduceをサポートしています。これは、実際にはあなたにぴったりのようです。

Cassandraは、最初の1つのグループであっても、新しいノードを簡単に追加するための優れたサポートを提供します。

とは言うものの、数百回の書き込み/分で、長い間、mysqlで問題がないでしょう。Cassandraはキー/値ストア(さらに優れた、キー/列ファミリー)であることにはるかに優れていますが、MySQLはリレーショナルデータベースであることにはるかに優れています。:)

Cassandra(または他のnosqlデータベース)のdjangoサポートはまだありません。彼らは1.2以降の次のバージョンのために何かをすることについて話しているが、pyconのdjango開発者と話していることに基づいて、それがどのようになるかはまだ誰にもわからない。

于 2010-02-25T14:37:30.350 に答える
19

あなたがリレーショナル データベースの開発者である場合 (私のように)、次のことを提案/指摘します。

  • 実稼働システムでの使用にコミットする前に、Cassandra を操作する経験を積んでください。特に、その実稼働システムの完成期限が厳しい場合はそうです。最初に重要でない何かのバックエンドとして使用するかもしれません。
  • SQL エンジンを使用したデータ操作に関して、私が当たり前だと思っている単純なことを実行することは、予想以上に困難であることがわかっています。特に、データのインデックス作成と結果セットの並べ替えは簡単ではありません。
  • データ モデリングも困難であることが証明されています。リレーショナル データベースの開発者として、あなたは多くの荷物を持ってテーブルに着きます...データを非常に異なる方法でモデル化する方法を進んで学ぶ必要があります。

以上のことから、Cassandra で何かを構築することを強くお勧めします。あなたが私のような人なら、そうすることで、データ ストレージの理解に挑戦し、リレーショナル データベースはすべての状況に適合するという私が認識していなかった考え方を再考するようになるでしょう。

私が見つけたいくつかの良いリソースは次のとおりです。

于 2011-05-06T01:25:44.367 に答える
1

Django-cassandra は初期のベータ モードです。また、Django は SQL を使用しないデータベース用に作成されていません。Django ORM のキーは SQL に基づいています (Django は PostgreSQL の使用を推奨しています)。no-sql のみを使用する必要がある場合 (同じアプリで sql と no-sql を混在させることができます)、危険を冒して no-sql ORM を使用する必要があります (従来の SQL orm または No-SQL ストレージの直接使用よりも大幅に遅くなります)。または、django ORM を完全に書き直す必要があります。しかし、この場合、なぜ Django が必要なのか、推測できません。トルネードのような他のものを使用できますか?

于 2013-01-11T13:36:58.203 に答える