ちょっとした背景として、この質問は単一の小さな 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 )
シフトを行った人からの洞察は大歓迎です!
ありがとう。