MongoDB-おいしいコーヒーをbrewれる

はじめに


友人たち、まず第一に、私の仕事を高く評価してくれたことに感謝したい。 だから、なぜ私たちの象を買う必要があるのか​​、あなたは最初の記事ですでに理解していると思います、誰かがすでにダウンロードして味わっており、誰かがやろうとしているところです。 とにかく、始めましょう。



今日はMongoDBをインストールします。以下では、焼きたてのHabraLoggerを見て、 Habrのメインページをリアルタイムで確認します。



コーヒーを寝かせて沸騰したお湯を注ぐ


まず、独自のリリースとダウンロードを選択します- ダウンロード

任意のリリースを選択できます。1.1.1を使用します。 もしあなたが転倒を恐れていないなら、最後の転倒者を入れてください-1.1.2(転倒することはまったく約束しません、それは可能です)。



OSのアセンブリがある場合はインストールすることをお勧めしますが、ない場合はソースからアセンブリする必要があります。 最も簡単なインストールのセットアップは、 クイックスタートを参照してください 。 ソースからビルドする場合、Sconsを使用する必要があり、FreeBSDでは「shell / dbshel​​l.cpp:77:error: 'sigrelse' was not defined in this scope」というエラーが表示されます。この行をコメントアウトしてください。



そこで、彼らが何を設定するかを検討します。 レプリケーションが計画されている場合、このキーでMongoDBが操作のログ(oplog)を保持して、「mongod --master」を実行することをお勧めします。 「mongo test」の助けを借りて今すぐプレイできます(testはデータベースの名前です):



> db.habratest.save({abra: "foo", ka: true, da: 123, bra: {foo: "bar"}}); # .

> db.habratest.find({ka: true}); # ka == true,

{"_id" : ObjectId( "4af18c86977fd21033ca67f8") , "abra" : "foo" , "ka" : true , "da" : 123 , "bra" : {"foo ar"}}







そして、インデックスを作成しましょう-または、それが利用可能であることを確認してください:



> db.habratest.ensureIndex({"da": 1});

true

> db.habratest.find({da: 123}); # .

{"_id" : ObjectId( "4af18c86977fd21033ca67f8") , "abra" : "foo" , "ka" : true , "da" : 123 , "bra" : {"foo" : "bar"}}

> db.habratest.update({da: 123},{"$set": {pi: 3.14159265}}); #

> db.habratest.find({da: 123});

{"_id" : ObjectId( "4af18c86977fd21033ca67f8") , "abra" : "foo" , "ka" : true , "da" : 123 , "bra" : {"foo" : "bar"} , "pi" : 3.14159265}

> db.habratest.update({da: 123},{"$set": {"bra.pi": 3.14159265}}); #

> db.habratest.find();

{"_id" : ObjectId( "4af190176ca438316825ddef") , "abra" : "foo" , "ka" : true , "da" : 123 , "pi" : 3.14159265 , "bra" : {"foo" : "bar" , "pi" : 3.14159265}}

> db.habratest.remove({ka: true});

> db.habratest.find();

> db.habratest.drop();

{"nIndexesWas" : 2 , "msg" : "all indexes deleted for collection" , "ns" : "test.habratest" , "ok" : 1}







_idプロパティはクライアントによって自動的に生成され、各オブジェクトに固有です。必要に応じて、有用なデータを入力することでIDを独立して生成できます。



すべてが明確だと思います。 機能のスパイシーな詳細については、ドキュメントを参照することをお勧めします。



ドライバーを開発ツールに接続しましょう。使用可能なドライバーのリストはmongodb.org/display/DOCS/Driversです。 この記事では、PHPに焦点を当てますが、他の言語でもすべてが非常に似ています。 PHPでは、ドライバーはPECLの「mongo」拡張機能で表されます。



最初のカップを飲む


HabraLoggerという小さなサンプルアプリケーションを用意しました。



コードとコメントからすべてが明らかであると思いますが、そうでない場合は、質問に喜んでお答えします。 スクリプトの冒頭で、元のクラスからいくつかのクラスが継承されていることに気づいたかもしれませんが、これは必要ではなく、$ mongo-> mydb-> mycollectionの形式で構文糖を与えるだけです。 ランタイムの動機(0.411ミリ秒)。



確かにあなたの1人がコードの一部でgroup()操作に気付いた:



$stat['hostsHours'] = $db->hosts->group(

array('hour' => true) // keys

,array('count' => 0) // initial object

,'function (obj, prev) {++prev.count;}' // reduce function

,array('url' => $url) // condition

);







最初の引数は、グループ化のキー(フィールド)を設定します-GROUP BY時間。

2番目のオブジェクトの初期状態は、最初の反復の前になります。

3番目-セットを削減(削減)するために使用される関数。

さて、4番目に-それに基づいて多くを削減するフィルターが形成されます。

このアクションのSQL類似物は、SELECT時間、COUNT(*)カウントFROMホストGROUP BY時間です。



HabraLoggerアルゴリズムは非常に単純で、ログはヒットとホストのコレクションに書き込まれます。ホストにはIPと日ごとの一意のインデックスが含まれているため、一意のインデックスのみが24時間以内にそこに到達し、グラフが表示されるときに単純なグループ化が実行されます。



これは単なる例であり、もちろん、より最適な解決策は、ログをローテーションしてn分ごとに1回集計することです。 ただし、次回は最適化を検討します。



クラスタリング? この質問を待っていました!
まず、用語を定義しましょう。

シャーディング-データベースをいくつかのシャードに分割します。

シャード-同じデータを保存する1つ以上の同等のサーバー。

Config-server-メタ情報を最初に保存するサーバーで、どの断片が存在するかについて。

チャンク-インデックスによる一連のドキュメント。たとえば、hostsコレクションは、urlプロパティのインデックスによって分割できます。

mongos-クライアントからの要求を受け入れ、必要なシャードおよび構成サーバーと対話し、クライアントに準備完了応答を送信するデーモン。



次のようになります。







ドキュメントの改定は行わず、各タイプのリクエストでのmongosの動作を説明します。 シャーディングの詳細については、公式の英語ドキュメント- シャーディングの概要を参照してください

Googleのお父さんが同様のスキームを使用しているとだけ言っておきましょう。



私たちは光を消し、水を放出します


今日は以上です。 次の記事のトピックは、ラジオリスナーの要求に応じることに注意してください。 GridFS(MongoDB上のファイルシステム)について話し、他の例を検討できます。



友達、ありがとう! フィードバックを待っています。



PSこの記事への訪問の統計はここで見つけることができます 、そして、夜からs索していた別の記事の統計はここで見つけることができます



UPD: Habrのメインページをリアルタイムでスパイします。



All Articles