Cassandraを使用しない場合は?


199

最近、カサンドラに関連する多くの話があります。

Twitter、Digg、Facebookなどで使用されています。

それはいつに意味がありますか:

  • Cassandraを使用し、
  • Cassandraを使用しない、および
  • Cassandraの代わりにRDMSを使用します。

7
おそらくCWである必要がありますか?これは、かなり主観的なIMOであるNoSQLとRelationalデータベースです。
Ed James

3
がメッセージングシステムに適しているかどうかを知りたいです。Twitterがそれを使用する場合、それは大丈夫だと思いますが、彼らはすべてのTwitterでそれを使用しないかもしれませんか?
ルーク、

回答:


164

特効薬に勝るものはありません。すべてが特定の問題を解決するために構築されており、独自の長所と短所があります。それはあなた次第です、あなたがどのような問題文を持っているか、そしてその問題に最もふさわしい解決策は何ですか。

私はあなたが尋ねたのと同じ順序であなたの質問に一つずつ答えようとします。CassandraはNoSQLファミリーのデータベースに基づいているため、質問に答える前に、NoSQLデータベースを使用する理由を理解することが重要です。

NoSQLを使用する理由

RDBMSの場合、このカテゴリのMySQL、Oracle、MS SQL、PostgreSQLのようなすべてのデータベースは、ACIDプロパティに向けられたほぼ同じ種類のソリューションを提供するため、選択は非常に簡単です。NoSQLに関しては、すべてのNoSQLデータベースが異なるソリューションを提供しており、アプリ/システム要件に最適なソリューションを理解する必要があるため、決定は困難になります。たとえば、MongoDBは、システムがスキーマレスのドキュメントストアを要求するユースケースに適しています。HBaseは、検索エンジン、ログデータの分析、または巨大な2次元の結合のないテーブルのスキャンが必要な場所に適しています。Redisは、ツリー、キュー、リンクリストなどのさまざまなデータ構造のインメモリ検索を提供するように構築されており、リアルタイムリーダーボードやpub-subのようなシステムの作成に適しています。同様に、このカテゴリには他のデータベース(Cassandraを含む)があり、さまざまな問題ステートメントに適しています。それでは、元の質問に移動して、1つずつ答えてみましょう。

Cassandraを使用する場合

NoSQLファミリーの一部であるCassandraは、非常に重い書き込みシステムが必要であり、その格納されたデータの上に非常に応答性の高いレポートシステムが必要な場合の問題に対するソリューションを提供します。リクエストごとにログデータが保存され、ブラウザ、IPなどによって1時間あたりのヒット数をリアルタイムでカウントする分析プラットフォームを構築するWeb分析の使用例を検討してください。このブログ投稿を参照すると、Cassandraが適合するユースケースの詳細を理解できます。

Cassandraの代わりにRDMSを使用する場合

CassandraはNoSQLデータベースに基づいており、ACIDおよびリレーショナルデータプロパティを提供しません。ACIDプロパティ(財務データなど)に対する強い要件がある場合、Cassandraはその場合には適合しません。明らかに、その回避策を講じることができますが、最終的には、ACIDプロパティをシミュレートするための大量のアプリケーションコードを作成することになり、市場投入までの時間を大幅に失うことになります。また、Cassandraでそのようなシステムを管理することは、複雑で退屈な作業になります。

Cassandraを使用しない場合

上記の説明が理にかなっている場合、答える必要はないと思います。


1
答えの問題は、すべてのNoSQLソリューションが一緒にまとめられることです。詳細については、dataconomy.com / sql-vs-nosql-need-knowをご覧ください。NoSQLランドスケープでは、基本的な区分はドキュメント、キー値、グラフ、ビッグテーブルです。問題ごとに特性が異なります。mongoに適したソリューションは、cassandraに適していない場合があります。
Yehosef 2016

17
この応答が「すべてのNoSQLソリューションをまとめる」唯一の方法は、カテゴリNoSQLによるものです。それ以外は、各NoSQLデータベースがさまざまな問題に対して「さまざまな解決策を提供する」ことを指摘する素晴らしい仕事をしています。著者は、mongo、cassandra、または他のNoSQLデータベースが同じ問題を解決することをほんの少しほのめかしただけだとは感じませんでした。
Nick Suwyn、2016年

NoSQL database事ではありません。NoSQLは、最新の非リレーショナルデータベースで使用される用語です(wikiを参照)。
eddyP23

2
また、すべてのNoSQLデータベースがACIDではないことに注意してください。グラフDBは通常ACIDです。
eddyP23

Cassandraは、軽量トランザクションを使用して、パーティションごとに行レベルのアトミック操作とアトミックおよび分離をサポートします。ACIDを行レベルで使用する必要がある場合、Cassandraを使用できませんか?重要なデータでも?
TechEnthusiast 2017年

52

分散データシステムを評価するときは、CAPの定理を考慮する必要があります。一貫性、可用性、およびパーティションの許容範囲の2つを選択できます。

Cassandraは、結果整合性をサポートする、使用可能なパーティショントレラントシステムです。詳細については、私が作成したこのブログ投稿「Visual SQL to NoSQL Systems」を参照してください。


両方のパーティションが大きいパーティションを最後に見たのはいつですか?私の質問を参照してくださいstackoverflow.com/questions/7969874/...
アーロン・ワターズ

5
Cassandraでは、クエリ時に整合性要件を指定することもできます。これは、一部のユースケースにとって有用な妥協案になる可能性があります
Richard Marr

30

Cassandraは特定の問題に対する答えです。1つのサーバーに収まらないほど大量のデータがある場合はどうしますか?どのようにしてすべてのデータを多くのサーバーに保存し、銀行口座を破らず、開発者を狂気にしないのですか?Facebookは毎日4テラバイトの新しい圧縮データを取得しています。そして、この数は、おそらく1年以内に2回以上増加するでしょう。

これほど多くのデータがない場合、またはエンタープライズOracle / DB2クラスターのインストールに数百万ドルを支払う必要があり、それをセットアップして維持するのに必要な専門家がいる場合は、SQLデータベースで問題ありません。

しかし、Facebookはもはやcassandraを使用せず、MySQLを使用して、パフォーマンスを高速化し、制御を向上させるために、アプリケーションスタック内のパーティションをほぼ排他的に移動します。


27

NoSQLの一般的な考え方は、アプリケーションに最適なデータストアを使用することです。財務データのテーブルがある場合は、SQLを使用します。リレーショナルスキーマにマップするために複雑なクエリや遅いクエリが必要になるオブジェクトがある場合は、オブジェクトまたはキー/値ストアを使用します。

もちろん、あなたが遭遇する現実世界の問題のほとんどは、これら2つの両極端の間のどこかにあり、どちらのソリューションも完璧ではありません。各ストアの機能と、一方をもう一方に使用した場合の影響を考慮する必要があります。これは、解決しようとしている問題に非常に特有です。


3
スキーマが変更される可能性は低く、テーブル構造にうまく適合し、データの損失/不整合が実際の問題を引き起こす可能性があります。
トムクラークソン

4
一貫性のないデータが銀行に実際の問題を引き起こす可能性がある理由がわかりません。シナリオ:銀行口座が1つあり、上限を$ 100超えており、銀行カードが2枚あります。2つの異なるATMで同時に2枚のカードでお金を引き出そうとすると、100倍の2倍と、追加料金の手紙がメールボックスに届きます。銀行は、一貫性のないデータを使用してお金(限度を下回る場合の追加料金)を稼ぎます。1つの大きなリレーショナルデータベースを介して世界中のすべてのATMを相互に接続するのは困難です。一貫性のない財務データが問題になる可能性のある例を挙げられますか?
Paco

5
これはすべてCOBOLおよびバッチ処理であり、ユーザーが考えるほど設計/安定性が高いとは言えません。ATMはいかなる種類の統合データストアにも接続しないため、適切な例とは言えません。これは、インターネット上のすべての人にデータベースへの直接アクセスを許可することができないため、SQLはWebアプリに適していないと言っているようなものです。その上、銀行については何も言わなかった-組織に対処する必要がないeコマースサイトでの注文のようなものは、SQLが新しく信頼できないと見なされるほど保守的であると考えてください。
トムクラークソン

6
@Paco:最初のATMは残高($ 100)を読み取り、2番目のATMも同じことを行います。どちらのATMも、100ドルから100ドルを差し引き、最終的な0ドルの残高をアカウントに書き込みます。結果:銀行は100ドルを失います。
Seun Osewa

9
@Paco:ポイントは、適切なトランザクションの分離がなければ、通常の銀行は口座が引き落とされたことさえ知らないということです。彼らも知りません。
Seun Osewa

14

Cassandraを使用する場合と使用しない場合についての上記の回答に加えて、Cassandraを使用する場合は、Cassandra自体を使用しないことを検討してください。

上記のいくつかの回答は、Cassandraと多くのプロパティを共有するさまざまな「NoSQL」システムをすでに指摘しており、多少の違いはありますが、特定のニーズにはCassandra自体よりも優れている可能性があります。

さらに、最近(この質問が最初に尋ねられてから数年後)、Scylla(https://en.wikipedia.org/wiki/Scylla_ (database)を参照と呼ばれるCassandraクローンがリリースされました。ScyllaはC ++でのCassandraのオープンソースの再実装です。Cassandraは、元のJava Cassandraよりもスループットが大幅に高く、レイテンシが低いと主張していますが、(機能、API、およびファイル形式において)ほとんど互換性があります。したがって、すでにCassandraを検討している場合は、Scyllaも検討することをお勧めします。


9

Cassandraをデプロイしている最中に誰かと話していると、多対多をうまく処理できません。彼らは最初のテストを行うためにハックの仕事をしています。私はこれについてカサンドラのコンサルタントと話しました、そしてあなたがこの問題を抱えていたらそれを勧めないと彼は言った。


4

あなたは自分に次の質問をするべきです:

  1. (ボリューム、速度)大量の情報を書き込んだり読み取ったりすることになるため、1台のコンピューターで書き込みを処理できないほどの情報。
  2. (グローバル)世界のある部分での書き込みに世界の別の部分でアクセスできるように、世界中でこの書き込みおよび読み取り機能が必要ですか?
  3. (信頼性)このデータベースが常に稼働している必要があり、どのクラウド、どの国、それがVM、コンテナー、またはベアメタルであるかに関わらず、決してダウンしないようにしますか?
  4. 拡張性)このデータベースは、簡単に成長し続け、線形に拡張できるようにする必要がありますか?
  5. (一貫性)一部の書き込みが非同期で発生し、他の書き込みが認証される必要がある場合、TUNABLEの一貫性が必要ですか?
  6. (スキル)このテクノロジーと、誰でもどこでも高速で実行できるグローバルに分散されたデータベースの作成に伴うデータモデリングを学習するために必要なことを実行しますか?

これらの質問のいずれかについて「たぶん」または「いいえ」と思った場合は、別の何かを使用する必要があります。それらすべてに対する答えとして「地獄はい」があった場合は、Cassandraを使用する必要があります。

1つのボックスですべてを実行できる場合は、RDBMSを使用します。それはおそらくほとんどの人よりも簡単で、だれでもそれを扱うことができます。


3

ここで他の回答に加えて、重い単一クエリとgazillion軽いクエリ負荷は、考慮すべきもう1つのポイントです。NoSqlスタイルのDBで単一のクエリを自動的に最適化することは本質的に困難です。私はMongoDBを使用していて、複雑なクエリを計算しようとしたときにパフォーマンスの問題に遭遇しました。私はCassandraを使用していませんが、同じ問題があると思います。

一方、負荷が非常に多くの小さなクエリの負荷であることが予想され、簡単にスケールアウトできるようにしたい場合は、ほとんどのNoSql DBが提供する結果整合性を利用できます。結果整合性は実際には非リレーショナルデータモデルの機能ではありませんが、NoSqlベースのシステムで実装および設定する方がはるかに簡単です。

単一の非常に重いクエリの場合、最新のRDBMSエンジンは、クエリの一部を並列化してまともなジョブを実行し、(単一のマシンで)クエリに投入したのと同じだけのCPUとメモリを利用できます。NoSqlデータベースには、大きなクエリの真にインテリジェントな並列化を可能にする仮定を立てるために、データの構造に関する十分な情報がありません。これらを使用すると、より多くのサーバー(またはコア)を簡単にスケールアウトできますが、クエリが複雑度レベルに達すると、NoSqlエンジンがインテリジェントに処理する方法を知っている部分に手動で分割する必要があります。

MongoDBでの私の経験では、最終的にはクエリが複雑なため、Mongoがクエリを最適化して複数のデータでその一部を実行するためにできることはほとんどありませんでした。Mongo複数のクエリを並列化しますが、単一のクエリの最適化はあまり得意ではありません。


3

実際のケースをいくつか読んでみましょう。

http://planetcassandra.org/apache-cassandra-use-cases/

この記事の内容:http : //planetcassandra.org/blog/post/agentis-energy-stores-over-15-billion-records-of-time-series-usage-data-in-apache-cassandra

MySqlを選択しなかった理由は、dbの同期が遅すぎるためです。

(2フレーズコミットのため、FK、PK)


CassandraはAmazon Dynamoペーパーに基づいています

特徴:

安定

高可用性

バックアップはうまく機能します

読み取りと書き込みはHBaseより優れています(JavaのBigTableクローン)。

wiki http://en.wikipedia.org/wiki/Apache_Cassandra

彼らの結論は:

We looked at HBase, Dynamo, Mongo and Cassandra. 

Cassandra was simply the best storage solution for the majority of our data.

2018年現在、

バックサポートが必要な場合は、ScyllaDBを使用してクラシックカサンドラを置き換えることをお勧めします。

Postgres kvプラグインは、cassandraよりも高速です。マルチインスタンスのスケーラビリティがありません。


1つのデータベース技術だけで解決する必要はありません。実際にコンボを作成して、特定の問題に適した方を使用できます。
Pepito Fernandez

3

ここでは、Cassandraが本当に必要かどうかを判断するのに役立つ重要な側面のいくつかに焦点を当てます。リストは完全ではありませんが、私が頭に浮かんだポイントのいくつかだけです-

  • (データセット全体の)関係に厳しい要件がある場合は、Cassandraを最初の選択肢と見なさないでください。

  • Cassandraはデフォルトで(CAPの)APシステムです。ただし、調整可能な整合性をサポートしているため、CPとしてもサポートするように構成できます。したがって、APであるとどこかで読んでいて、CPシステムを探しているという理由だけで、それを無視しないでください。Cassandraは、より正確には「調整可能な一貫性」と呼ばれます。つまり、必要な一貫性のレベルを、可用性のレベルとバランスよく簡単に決定できます。

  • 規模があまり大きくない場合、または分散していないDBを処理できる場合は、Cassandraを使用しないでください。

  • Cassandraのような分散DBを使用すれば、すべての問題が解決されるとチームが考えている場合は、より深く考えてください。これらのDBには多くのデフォルトが付属しているため、最初は非常に簡単ですが、特定の問題を解決するために最適化して習得するには、かなりの量のエンジニアリング作業が必要です。

  • Cassandraは列指向ですが、同時に各行には一意のキーもあります。したがって、それをインデックス付きの行指向のストアと考えると役立つ場合があります。ドキュメントストアとしても使用できます。

  • Cassandraは、事前にフィールドを定義することを強制しません。したがって、起動モードであるか、機能が進化している場合(アジャイルなど)-Cassandraはそれを採用しています。より良いのは、まずクエリについて考え、次にそれらに答えるためのデータについて考えます。

  • Cassandraは、書き込みで本当に高いスループットが得られるように最適化されています。ユースケースが(キャッシュのように)読み取りが多い場合、Cassandraは理想的な選択肢ではない可能性があります。


2

選択を容易にするもう1つの状況は、合計、最小、最大などの集約関数と複雑なクエリ(上記の金融システムなど)を使用する場合です。リレーショナルデータベースの方が、おそらくnosqlデータベースよりも便利です。実際に多くの反転インデックスを使用しない限り、nosqlデータベースでは不可能です。nosqlを使用する場合、集計関数をコードで実行するか、独自の列ファミリーに個別に格納する必要がありますが、これによりすべてが非常に複雑になり、nosqlを使用することで得られるパフォーマンスが低下します。


一例として、CouchdBを使用すると、集約関数を非常に簡単に計算できます:wiki.apache.org/couchdb/…。技術的には、これは「コード内」ですが、Cassandraの場合のように達成するのは「複雑」ではありません。
user359996

2
実際、コードで集計を書き込むのに1日かかる場合があることに同意しますが、データベースの0サイクル近くを使用するバックエンドサーバーで実行するように書き込むことができます。SQLデータベースを使用すると、5行かかる1行を書き込む結果が得られます。ただし、実行するたびにデータベース全体の速度が低下します。したがって、両方の方法に長所と短所があります。たとえば、私の銀行は、深夜にすべてのWebサイトアクセスを約10〜15分間閉じます。彼らは間違いなくCOBOLを使用していますが、それは非常によく似た問題です。
Alexis Wilke 2013年

1

SQLセマンティクスで完全に一貫したデータベースが必要な場合、Cassandraはソリューションではありません。Cassandraはキーと値のルックアップをサポートしています。SQLクエリはサポートしていません。Cassandraのデータは「結果的に整合性があります」。データの同時ルックアップには一貫性がない場合がありますが、最終的にはルックアップに一貫性があります。

厳密なセマンティクスが必要で、SQLクエリのサポートが必要な場合は、MySQL、PostGresなどの別のソリューションを選択するか、CassandraとSolrを組み合わせて使用​​します。


1
Cassandraクエリ言語(CQL)はSQLにかなり似ています。実際、CQLは、SQLのようなインターフェースを探している人にとって、Cassandraが他のNoSQLオプションよりも優れている点だと思います。
arussell84 2017年

1
Cassandraは、技術的には最終的に一貫性がありません。Cassandraを使用すると、可用性と一貫性をトレードオフできます。Cassandraは基本的にCAP定理のバランスをとっています。最終的に一貫性のある書き込みを行ってから、一貫性のある読み取り、その逆、または両方で一貫性のある読み取りを行うことができます。これはすべて、読み取り/書き込みレベルと組み合わせたレプリケーション係数に依存します。この理由のために、「結果的に一貫性がある」と引用符で囲まれた答えが得られたと思いますが、ある程度の明確さが必要だと思います。
tsturzl 2017

1

Cassandraは、次の場合に適しています。

  1. DBからのACIDプロパティは必要ありません。

  2. DBには膨大な数の書き込みがあります。

  3. ビッグデータ、Hadoop、Hive、Sparkと統合する必要があります。

  4. リアルタイムのデータ分析とレポート生成が必要です。

  5. 印象的なフォールトトレラントメカニズムの要件があります。

  6. 均質なシステムの要件があります。

  7. チューニングには多くのカスタマイズが必要です。


0

Mongodbには非常に強力な集約関数と表現力豊かな集約フレームワークがあります。リレーショナルデータベースの世界で開発者が慣れている機能の多くを備えています。たとえば、ドキュメントデータ/ストレージ構造により、Cassandraよりも複雑なデータモデルが可能になります。

もちろんこれにはトレードオフが伴います。したがって、データベース(NoSQL、NewSQL、またはRDBMS)を選択するときは、解決しようとしている問題と、スケーラビリティーのニーズを確認してください。1つのデータベースですべてを行うことはできません。


0

DataStaxによると、Cassandraは、

1-ハイエンドハードウェアデバイス。2-ロールバックなしのACID準拠(銀行取引)


0
  • テーブル全体の完全なトランザクション管理はサポートしていません。
  • セカンダリインデックスはサポートされていません。
  • セカンダリインデックスはElastic search / Solrに依存する必要があり、カスタム同期コンポーネントを作成する必要があります。
  • ACID準拠システムではありません。
  • クエリのサポートは制限されています。

0

Apache cassandraは、高可用性サービスを提供し、単一障害点をなくしながら、多くの汎用サーバーにわたって大量の構造化データを管理するための分散データベースです。

アーキテクチャは、純粋に可用性と分割許容度であるキャップ定理に純粋に基づいており、興味深いことに結果的に一貫しています。

クラスタのラック全体に大量のデータを保存しない場合は使用しないでください。時系列データを保存しない場合は使用しないでください。サーバーにパティションを適用しない場合は使用しないでください。強い整合性が必要な場合は使用しないでください。


強い整合性が保証され、サーバーは常に書き込みを行い、すべての読み取りは最新のものを提供します。
Remario
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.