web-dev-qa-db-ja.com

MySQLからCassandra-長所/短所?

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

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

必要なリレーショナル機能-

  • [CassandraのAPIのスライス範囲は満足のいくようです]
  • グループ化
  • 複数のテーブル間の多対多リレーション [Cassandra SuperColumnsは1対多でうまくいくようです]
  • これに関するSphinxは私に素敵なフルテキストエンジンを提供するので、それも必要です。 [Cassandraでは、Lucandraプロジェクトがこのニーズを満たしているようです]

私の主な問題は、データの読み取りが非常に遅いことです(書き込みもそれほど熱くありません)。現時点では、多額の資金とハードウェアを投入したくはありません。時間とともに簡単にスケーリングできるものを好むでしょう。その意味では、MySQLの垂直スケーリングは簡単ではありません(または安価です)。

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

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

  • CAP定理と最終的な一貫性を考えると、誰もがCassandraを複数のノードで使用することについて話します。しかし、成長し始めたばかりのプロジェクトでは does it 1つのノードをデプロイする意味がありますcassandra server ?警告がありますか?たとえば、DjangoのバックエンドとしてMySQLを置き換えることができますか?[これはお勧めですか? ]

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

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

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

ありがとう。

58
viksit

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

ただし、Cassandra 0.6(ベータ版は明日正式にリリースされますが、せっかちな人は0.6ブランチからビルドできます)は、Hadoop map/reduce for analyticsをサポートします。君は。

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

とは言っても、数百の書き込み/分で、mysqlを長期間使用することができます。 Cassandraはキー/値ストア(さらに優れた、キー/カラムファミリー)であることがはるかに優れていますが、MySQLはリレーショナルデータベースであることがはるかに優れています。:)

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

38
jbellis

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

  • プロダクションシステムでの使用にコミットする前に、特にCassandra=の使用経験が必要です。特に、プロダクションシステムの完了期限が厳しい場合は、まず重要でないもののバックエンドとして使用してください。 。
  • SQLエンジンを使用したデータ操作について、当然のことと思っていた単純なことを行うと思っていたよりも、さらに難しいことがわかっています。特に、データのインデックス付けと結果セットの並べ替えは簡単ではありません。
  • データモデリングも困難であることが実証されています。リレーショナルデータベースの開発者は、多くの荷物を抱えてテーブルにアクセスします。データをまったく異なる方法でモデル化する方法を学ぶ必要があります。

これらのことから、Cassandraでsomethingをビルドすることを強くお勧めします。あなたが私と同じなら、そうすることはデータストレージの理解に挑戦し、私が保持していることすら知らなかったリレーショナルデータベースにすべての状況に合うOutlookを再考させるでしょう。

私が見つけたいくつかの良いリソースが含まれます:

19
codemonkey

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

1
logan