sql >> データベース >  >> NoSQL >> MongoDB

本番環境でMongoDBを使い始めるときに知っておくべきこと-10のヒント

    MongoDBを学ぶには、多くの正確な思考が必要です。実稼働モードでのデータベースのパフォーマンスを危険にさらす可能性のある重要な作業では、ほとんど考慮されないことがよくあります。

    MongoDBはNoSQLDBMSであり、特にセキュリティと構造に沿って、SQLデータベースとは文字通り異なるパターンに従います。統合された機能のいくつかはそのパフォーマンスを促進し、最近では最高の1つになっていますが、その結果、いくつかの機能は潜在的な脅威をもたらし、考慮しないとパフォーマンスを損なう可能性があります。

    最近の「最悪のケース」の経験では、大きな配列を持つドキュメントでコレクションをクエリしようとしていたため、結果を返すのに何年もかかりました。誰かが同じ問題を経験した場合、このブログが大いに役立つことを知っていたので、私はこのブログを書くことにしました。

    本番環境でのMongoDBに関する重要な考慮事項
    1. セキュリティと認証。
    2. ドキュメントのインデックス作成
    3. コレクションでスキーマを使用する
    4. 上限付きコレクション
    5. ドキュメントサイズ
    6. 埋め込みドキュメントの配列サイズ
    7. 集約パイプラインステージ
    8. ハッシュオブジェクト内のキーの順序
    9. MongoDBの「undefined」と「null」
    10. 書き込み操作

    MongoDBのセキュリティと認証

    データはさまざまな点で異なり、明らかに一部の情報の機密を保持する必要があります。デフォルトでは、MongoDBのインストールでは認証要件が必須として設定されていませんが、特に財務記録や医療記録などの機密データが含まれる場合は、認証要件を使用することはできません。開発ワークステーションでは、それは大したことではありませんが、実稼働モードにはマルチユーザーが関与するため、認証証明書を設定することをお勧めします。最も一般的で使いやすい方法は、デフォルトのMongoDBユーザー名とパスワードのクレデンシャルです。

    データは、暗号化されていない場合、サードパーティのツールを介してアクセスできるファイルに書き込まれます。匿名の誰かがシステムファイルにアクセスすると、知らないうちにデータが変更される可能性があります。専用サーバーでデータベースをホストし、データファイルへのフルアクセス権を持つ単一のユーザーを割り当てると、トリックを節約できます。

    外部からのインジェクション攻撃からデータを保護することも重要な取り組みです。 $ group、$ whereby、mapReduce操作などの一部の演算子はjavascript(js)で開発されているため、js操作が発生しやすくなっています。結果としてデータ整合性のインスタンスを回避するために、上記の演算子を使用していない場合は、構成ファイルでパラメーターjavascriptEnabled:falseを構成することにより、任意のJS設定を無効にすることができます。さらに、MongoDBセキュリティチェックリストで強調表示されている手順のいくつかを採用することで、ネットワーク侵害によるデータアクセスのリスクを減らすことができます。

    ドキュメントのインデックス作成

    インデックス作成とは、通常、MongoDBコレクション内の各ドキュメントに一意の識別値を割り当てることです。インデックス作成により、読み取り操作と書き込み操作の両方でパフォーマンスが向上します。デフォルトでは有効になっており、常にその設定を維持する必要があります。インデックスを作成しないと、データベースは最初から最後まで複数のドキュメントをチェックする必要があります。残念ながら、操作は終わりに近づくドキュメントのコストが高くなり、クエリの待ち時間が短くなります。ある時点で、アプリケーション側で、ユーザーは遅延を経験し、アプリケーションが実際に機能していないと思う場合があります。インデックス付けは、検索操作自体を除外せずに、クエリ操作の並べ替えと検索に役立ちます。並べ替えは、返される多くのドキュメントで一般的な操作です。多くの場合、ドキュメントがフィルタリングされた後の最終段階として実行されるため、少量のデータを並べ替える必要があります。この場合のインデックスは、エントリの性質上データを並べ替え、返されるデータを32MBの制限に制限するのに役立ちます。インデックスがない場合、返されるドキュメントの合計サイズで32メモリ制限の可能性を超え、データベースがこの制限に達すると、空のレコードセットを返す以外にエラーがスローされます。

    $ lookup操作は、インデックスが設定されている場合にもサポートされます。外部キーとして使用されるキー値のインデックスは、前の段階の処理に不可欠です。

    コレクションでのスキーマの使用

    MongoDBでは、SQL dbmsの場合と同じように、フィールド(列)を定義する必要はありません。ただし、データの不整合や発生する可能性のあるいくつかの後退を回避するために、フィールドを定義する必要はありませんが、スキーマを定義することは常に良い習慣です。スキーマ設計により、どのタイプのデータが特定のフィールドに送られるかを決定できます。どのフィールドに値を指定する必要があり、通常、入力または更新前のデータ検証を強化して、データの整合性と一貫性を促進します。スキーマ設計では、データを参照するか埋め込むかを指示します。初心者の場合、唯一のモデルは「One-to-N」であり、サブドキュメントの配列エントリを簡単に作成できると思うかもしれませんが、そうではありません。

    モデルを作成する前に、ドキュメント間のカーディナリティの関係を理解する必要があります。最適なスキーマを作成するのに役立つルールは次のとおりです。

    1. 一部のデータにアクセスする前に実行する必要のあるクエリの数を減らすために、フィールドや配列要素がほとんど含まれていない場合は、サブドキュメントを埋め込むことができます。以下のモデルの例を見てください。
      1. {
         Name: ‘John Doh’,
         Age:20
         Addresses:[
           {street: ‘Moi Avenue’, city:’Nairobi’, countryCode: ‘KE’},
           {street: ‘Kenyatta Avenue’, city:’Nairobi’, countryCode: ‘KE’},
         ]
        }
        
    2. 頻繁に更新されるドキュメントの場合は、非正規化を使用します。いずれかのフィールドが頻繁に更新される場合は、更新が必要なすべてのインスタンスを見つけるタスクがあります。これにより、クエリ処理が遅くなり、非正規化に関連するメリットさえも圧倒されます。
    3. 集約パイプラインなどの複雑なクエリは、多くのサブドキュメントが含まれ、ドキュメントを個別にフェッチする必要がある場合、実行に時間がかかります。
    4. オブジェクトデータの大規模なセットを含む配列要素は、大きくなり、その結果ドキュメントサイズを超える可能性があるため、明らかに埋め込むべきではありません。

    スキーマのモデリングは、多くの場合、アプリケーションのアクセスパターンによって決定されます。モデルの設計に役立つその他の手順については、ブログ6「MongoDBスキーマ設計の経験則」

    を参照してください。 最近のドキュメントの優先度に上限付きコレクションを使用する

    MongoDBは、上限付きコレクションなどの多くのリソースを提供します。残念ながら、一部は利用されていないことになります。上限付きコレクションのサイズは固定されており、挿入順序に基づいてドキュメントを挿入および取得する高スループット操作をサポートすることが知られています。スペースがいっぱいになると、古いドキュメントは削除され、新しいドキュメント用のスペースが確保されます。

    上限付きコレクションのユースケースの例:

    • コレクション自体は書き込みが多いのではなく読み取りが多いため、頻繁にアクセスされるデータをキャッシュします。コレクションが常にパフォーマンスを発揮していることを確認する必要があります。
    • 大量のシステムのログ情報。上限付きコレクションはインデックスを使用しないことが多く、これはファイルへの書き込みと同じように記録速度が非常に速いという利点があります。

    MongoDBドキュメントサイズに注意してください

    すべてのMongoDBドキュメントのサイズは16メガバイトに制限されています。ただし、ドキュメントがこの制限に達するか近づくのが最適です。これは、いくつかの重大なパフォーマンスの問題を引き起こすためです。 MongoDB自体は、ドキュメントのサイズが数キロバイトの場合に最適に機能します。ドキュメントのサイズが十分に大きい場合、複雑なプロジェクションリクエストには長い時間がかかり、クエリがタイムアウトする可能性があります。

    埋め込まれたドキュメントの配列サイズに注意してください

    サブドキュメントをドキュメント内のフィールドにプッシュして、このフィールドに配列値を作成できます。前述のように、サブドキュメントのサイズを低く抑える必要があります。配列要素の数が4桁未満であることを確認することも同様に重要です。そうしないと、ドキュメントがそのサイズを超えて大きくなり、ディスクに再配置する必要があります。このような操作に関連するさらなる問題は、すべてのドキュメントのインデックスを再作成する必要があることです。さらに、各サブドキュメントも同様にインデックスを再作成する必要があります。これは、多くのインデックス書き込みが発生し、操作が遅くなることを意味します。サブドキュメントのサイズが大きい場合は、埋め込みよりも新しいコレクションにレコードを保持することが重要です。

    集約パイプラインステージ

    通常のMongoDBクエリ操作に加えて、順序付けやグループ化などの仕様に従ってデータを操作および返すために使用される集約フレームワークがあります。 MongoDBにはクエリオプティマイザーがないため、クエリを適切に並べ替える必要があります。集約フレームワークを使用して、パイプラインステージが適切に順序付けられていることを確認します。 $ match演算子を使用して処理するデータの量を減らすことから始め、最後にソートする必要がある場合は$sortを使用します。 Studio 3Tなどのサードパーティツールを使用して、コードに統合する前に集計クエリを最適化できます。このツールを使用すると、どの段階でもデータの入力と出力を確認できるため、何を扱っているかを知ることができます。

    $limitと$sortを使用すると、クエリが実行されるたびに常に同じ結果が得られるはずです。 $ limitを使用する場合、返されるデータは決定論的ではなく、追跡が困難な問題が発生する可能性があります。

    ハッシュオブジェクトのキーの順序を確認する サンプルデータを含む2つの大きなドキュメントを用意することを検討してください

    {
    
       FirstName: ‘John’,
    
       LastName: ‘Doh’
    
    }

    クエリ{FirstName:'John'、LastName:'Doh'}で検索操作を実行すると、操作はクエリ{LastName:'Doh' FirstName:'John'と一致しません。 }。したがって、ドキュメント内の名前と値のペアの順序を維持する必要があります。

    MongoDBでは「undefined」と「null」を避けてください

    MongoDBは、ドキュメントにBSON形式を使用します。 JSON検証では、「未定義」はサポートされていないため、使用を避ける必要があります。 $ nullは解決策として提供されますが、それも避ける必要があります。

    書き込み操作を検討する

    MongoDBを高速書き込み用に設定することもできますが、これは後退を招き、データが書き込まれる前でも応答が返されます。このシナリオを回避するには、ジャーナルリングを有効にする必要があります。さらに、データベースが故障した場合でも、データは引き続き利用可能であり、リカバリプロセスで使用できるチェックポイントが作成されます。ジャーナル書き込み期間の構成は、パラメーターcommitIntervalMsを使用して設定できます。

    結論

    データベースシステムは、障害や悪意に強いだけでなく、データの整合性と一貫性を確保する必要があります。ただし、この要因に到達するには、データベース自体とデータベースが保持するデータを理解する必要があります。上記の要因を考慮に入れると、MongoDBはうまく機能します。それらの最重要事項はスキーマを使用していることです。スキーマを使用すると、入力または更新する前にデータを検証し、このデータをモデル化する方法を確認できます。データモデリングは、多くの場合、アプリケーションのアクセシビリティパターンによって推進されます。これらすべてを合計すると、データベースのパフォーマンスが向上します。


    1. NoSQLデータベースの戦い-MongoDBとFirebaseの比較

    2. Redisはinit.dで手動で起動しますが、起動時には起動しません

    3. Laravelキャッシングを理解する:キャッシュファサードとRedis

    4. Mongodbであいまい検索しますか?