RDBMSまたはKey-Valueストアプロジェクトに対する3月

candybar2 よくプロジェクトを作成しますか? そして、おそらく、データベース、特にMySQL(および誰かとPostgreSQL)を使用するすべての場所。 しかし、ここで興味深いのは、経験から、さまざまなアーキテクチャの説明を読んだ直後に、プロジェクトのどこからでもデータベースの重要な機能が必要であることは明らかです。多くの場合、データベースは単に通常のデータのある種のリポジトリとして使用されます。 たとえば、キャッシングシステムでは、通常、データベースは使用されません。また、不要なリクエストを避けるためだけにキャッシングが使用されます。 そして、キャッシングに最も頻繁に使用されるのは何ですか? Memcached なに? ハッシュベースの分散ストレージシステムです。 一般的に、これは単にキーと値のペアのリポジトリであり、基本的な操作(書き込み、読み取り、削除、存在の確認)のみを実行できます。 はい、はい、フィルター、選択、ソートはありません。最大は、単一のリクエストですべての関連レコードを選択するためのタグシステムです。 多くの場合、このような機能で十分です。



私は決して狂信的ではありません。実際のプロジェクトでは、最適な組み合わせは、通常のリレーショナルデータベースと特殊なデータウェアハウスからのものです。 キーと値のペアだけでなく、オブジェクトに関する追加のメタ情報も保存するより高度なシステムは、機能の面で既にデータベースに近づいています。作業が行われている情報の単位であるため、ドキュメント指向データベース(リポジトリ)と呼ばれることもあります。ドキュメントとその関連データです。



2番目の基準または機能は分布です。 DBMSの場合、これは多くの場合非常に複雑に解決されるか、サードパーティツールの助けを借りて解決されます。 データウェアハウスはDHT( 分散ハッシュテーブル )に基づいて構築され、最初は分散作業の準備が整っており、個々のノードの障害に対するスケーラビリティと耐性を提供します。 一部のシステムでは、これは環境を犠牲にして解決されます(たとえば、ストレージがErlang VM上で実行される場合)、後者は組み込みの分散作業ツール(たとえば、JavaシステムのJGroups )またはMemcachedなどの独自のソリューションを使用します。



クラウド環境で作業するためのそのようなシステムの完全な準備はそれほど重要ではありません。そのようなストレージがAmazon(S3およびSimpleDB)で機能するのは、何の役にも立ちません。 Googleの有名なBigTableは、ほとんどの場合、キーと値のペアを保存および処理するための単なるシステムでもあります。 APIはシンプルであり、ささいなこともあります(ただし、標準のSQL DBよりも単純ですが、内部デバイスは常にそうではありません)ため、ソリューションは完全に拡張(読み取りと書き込みの両方)します。 。 したがって、クラスターを持っているか、持っている場合は、そのような決定を検討してください。 ただし、言及する価値のある点が1つあります。このようなシステムは、多くの場合、メモリにデータを格納する場合にのみ機能しますが、通常のリレーショナルデータベースに格納するなど、永続的なストレージが必要な場合は、バックエンドシステムが使用されますデータとそのパラメーターの制限(および速度低下)。



なぜこれを適用できるのですか? はい、別々の独立したブロックに分割できる大量の(ほぼ無制限の)データを保存する必要がある場合はどこでも。 これは、個々の記事、写真、ビデオ、または他の大きなバイナリオブジェクト、ログエントリ、ユーザープロファイル、セッションデータ(ちなみに、 以前に実験的なオープン開発、アプリケーションのPHPセッションの分散ストレージ用のJavaセッションサーバーを発表しましたが、同様のソリューションがあります) 工業用Zendプラットフォーム )。 ほとんどの場合、すべてはバイナリデータのセット、またはシリアル化された形式のデータまたはコードを含むテキスト文字列のいずれかに制限されているため、処理プログラムでさらにデータを使用するか、すぐにクライアントに渡すことができます-これは、 Nginxプラグインが行うことです。要求されたコンテンツがあり、スクリプトへのアピールを完全にバイパスして直接提供します。 現在、たとえば、チャットサーバーを設計していますが、そこでは、メインデータストアと同様に、分散キャッシュ(JGroupsを介したレプリケーションでキャッシュを使用するJavaシステム)が使用されます。これは、キーと値の形式の基本的に同じデータストアです。



さて、理論的には、市場に存在するストレージシステム(もちろん、オープンソース)を見てみましょう。



リストには、 Hadoop HBaseCassandraHypertableDynomiteKaiRingoなどのシステムが含まれていませんでした。



主にこれらのタイプのシステムでは、特殊な言語とプラットフォーム(Erlangはここではほとんど競合していません)またはJavaなどの既に古典的で主流になっている深刻なシステムを使用し、まれにC / C ++での独自の開発に基づいていることに注意してください。



必ずしもウェブではない高性能システムを開発していますか? 特定のデータストレージが必要ですか、それを最も簡単な方法で受け取りたいが、一瞬も停止することなく「上下」にスケールしますか? 大量のデータがあるかもしれませんが、それらはすべて単純で、文字列またはシリアル化された構造とバイナリブロックになりますか? 信頼できるデータストレージ、分散型、耐障害性が必要ですか? これらの質問の少なくとも1つの答えが「はい」の場合、リストから少なくともいくつかのプロジェクトを確認する必要があります。おそらく、プロジェクトが負荷に耐え、自信を持って開発できるようになるでしょう。



PS私が書くことを私に押し付けた元の記事 -システムの良い比較表があります。



All Articles