このトピックでは、MongoDB 8.0 の新機能と最適化について説明します。
クイックプレビュー
このトピックでは、以下の側面から MongoDB 8.0 を紹介します。
詳細については、「MongoDB 8.0 リリースノート」をご参照ください。
高度な TCMalloc
MongoDB 8.0 は高度な TCMalloc を使用します。
キャッシュ メカニズムの調整: 高度な TCMalloc は、各スレッドではなく各 CPU のキャッシュを使用して、メモリ フラグメントを削減し、データベースが高負荷に対応できるようにします。
メモリ解放メカニズム: 高度な TCMalloc は、1 秒ごとにオペレーティング システムにメモリを解放しようと試みるバックエンド スレッドを作成します。
tcmallocReleaseRateパラメーターは、メモリ解放のレートをbytes/s単位で指定します。 MongoDB 8.0 より前は、このパラメーター値はあいまいな1-10でした。 ApsaraDB for MongoDB のtcmallocReleaseRateのデフォルト値は10485760で、これは 10 MB に相当します。このパラメーター値が 0 であっても、一部のメモリは解放されます。ビジネス要件に基づいてこの値をカスタマイズできます。
レプリケーション パフォーマンスの最適化
「Majority」書き込みコンサーン
MongoDB 8.0 以降では、writeConcern が majority に設定されている場合、MongoDB は変更が適用されるのを待つのではなく、ほとんどのレプリカ セット メンバーに oplog が書き込まれた後に oplog を返します。これにより、majority モードでの書き込みパフォーマンスが向上します。
したがって、アプリケーションが majority 書き込み確認を受信した直後にセカンダリ ノードからデータを読み取る場合、返される結果にはこの書き込み操作によって変更されたコンテンツが含まれていない可能性があります。
Oplog バッファー
セカンダリ ノードは、各バッチの oplog を並行して書き込み、適用します。 Writer スレッドがプライマリ ノードから新しい oplog エントリを読み取り、ローカル oplog に書き込むと、Applier スレッドはこれらの変更をローカル データベースに非同期的に適用します。これにより、セカンダリ ノードのレプリケーション スループットが向上します。
したがって、serverStatus の関連メトリックも変更され、metrics.repl.buffer.write バッファーと metrics.repl.buffer.apply バッファーになります。
再シャーディング パフォーマンスの最適化
reshardCollection のパフォーマンスが向上しました。このコマンドを使用して、コレクションのシャード キーとデータの分散を変更できます。
MongoDB 8.0 は forceRedistribution オプションをサポートしており、これにより、以前と同じシャード キーを使用してコレクションを再シャーディングし、新しいシャードにデータを再分散できます。これは、チャンクを特定の範囲に移行するよりも時間がかかりません。このオプションを zones オプションと一緒に使用して、データを特定のゾーンに移行できます。
db.adminCommand({
reshardCollection: "db.coll",
key: { shard_key: "hashed" },
forceRedistribution: true
})再シャーディング中にインデックスを作成すると、明示的なエラー メッセージなしにインデックスの作成が失敗する可能性があります。再シャーディング中はインデックスの作成を避け、再シャーディング前にインデックスの作成が完了していることを確認してください。
増分 oplog キャッチアップ ステージでは、ソース シャード ブロックは、推定残りの操作時間が 2 秒以内である場合にのみコレクションへの書き込みをブロックし、宛先シャードがキャッチアップを完了するのを待ちます。ただし、サービスのダウンタイムやメンテナンス ウィンドウなど、ビジネスでより長いブロッキング期間を受け入れることができる場合は、commitReshardCollection コマンドを使用して、事前にこのコレクションへの書き込みを禁止し、再シャーディング プロセスの完了を高速化できます。
再シャーディングのカーネル フローの詳細については、「再シャーディング プロセス」をご参照ください。再シャーディングに関連する操作の詳細については、「コレクションのシャーディング」をご参照ください。
シャーディング
再シャーディング パフォーマンスの最適化に加えて、MongoDB 8.0 は以下の側面からシャーディングを最適化します。
ハッシュ シャーディングは、デフォルトでシャードごとに 1 つのチャンクを作成します(MongoDB 8.0 より前は、デフォルトで 2 つのチャンクが作成されていました)。
dbhashコマンドはシャード上で実行できます。findAndModifyコマンドとdeleteOneコマンドは、部分的なシャード キーをクエリ述語として使用できます。シャーディングされたコレクションで
upsertをtrueに設定してupdateOneコマンドを使用する場合、クエリ述語内のすべてのシャード キーを除外できます。unshardCollectionコマンドまたはsh.unshardCollection()メソッドを使用して、既存のコレクションのシャーディング操作をキャンセルできます。これにより、コレクション内のすべてのドキュメントが特定のシャード、またはデータ量が最も少ないシャードに移動されます。moveCollectionコマンドを使用して、シャーディングされていないコレクションをプライマリ シャードに制限されることなく特定のシャードに移動できます。ただし、時系列コレクションとクエリ可能な暗号化コレクションは移動できず、コレクション書き込みブロックは約 2 秒間続きます。次のデータベース コマンドと mongosh ヘルパー関数がサポートされています。
コマンド
mongosh ヘルパー関数
説明
moveCollection
sh.moveCollection()
シャーディングされていないコレクションを特定のシャードに移動します。
unshardCollection
sh.unshardCollection()
既存のシャーディングされたコレクションのシャーディング操作をキャンセルし、コレクション データを特定のシャードに移動します。
abortMoveCollection
sh.abortMoveCollection()
実行中の
moveCollection操作を停止します。abortUnshardCollection
sh.abortUnshardCollection()
実行中の
unshardCollection操作を停止します。なし
sh.shardAndDistributeCollection()
コレクションをシャーディングし、既存のシャード キーを使用してすぐにデータを再分散します。
データ移行を高速化します。このヘルパー関数は、
shardCollectionとreshardCollectionを組み合わせたものと同じ結果になります。
ロギング
workingMillis フィールドがスロー クエリ ログに追加され、実際の操作に必要な時間が表示されます。
合計操作レイテンシを示す durationMillis オプションとは異なり、workingMillis には、ロック待ちやトラフィック調整などの要因によって消費された時間は含まれません。
集約
BinData 変換
$convert 演算子を使用して、次の変換を実行できます。
文字列値を binData 値に変換します。
binData 値を文字列値に変換します。
さらに、$toUUID 式は、文字列値を UUID 値に変換するための簡略化された構文を提供します。
$queryStats
$queryStats ステージは、記録されたクエリの統計を返し、変更ストリームのメトリックの追跡とレポートを最適化します。
データベース セキュリティ
クエリ可能な暗号化: 範囲クエリ
クエリ可能な暗号化は、$lt、$lte、$gt、または $gte を使用した暗号化フィールドでの範囲クエリをサポートします。
入口キュー
MongoDB 8.0 は、入口アクセス制御 (_ticketHolder) の新しいキューを導入し、ネットワークからデータベースに送信された操作が入口キューに入ることを示します。
入口キューはデフォルトでは制限されていません。キューイングのリクエストを許可するために、最大キュー値をカスタマイズできます。
その他の最適化
新しい クエリ シェイプ が導入されました。以前のクエリ シェイプは、プラン キャッシュ クエリ シェイプと呼ばれます。クエリ オプティマイザーは、クエリ設定を追加の入力情報として使用し、最終的なクエリ プランの選択に影響を与えます。
setQuerySettings には、クエリ設定が含まれています。
インデックスの選択を指定します。 MongoDB 8.0 では、
planCacheSetFilterを使用してindex filterを設定することはできません。トラフィック調整設定を指定します。
rejectオプションを使用して、特定のクエリ シェイプの拒否を設定できます。
removeQuerySettingsは、クエリ設定を削除するために使用されます。$querySettingsは、クエリ設定を表示するために使用されます。
explain()コマンドには、queryPlanner.optimizationTimeMillisにミリ秒単位で測定されたクエリ プランの最適化に費やされた時間が含まれています。新しい
defaultMaxTimeMSパラメーターは、単一の読み取り操作が完了するまでのデフォルトの制限時間をミリ秒単位で指定します。該当する操作:
findaggregate($mergeステージと$outステージを除く)countdistinctdbHash
クライアントが
maxTimeMSを指定した場合、defaultMaxTimeMSはこの操作には適用されなくなります。
新しい
bulkWriteコマンドは、単一のリクエストで複数のコレクションに対して複数の挿入、更新、および削除操作を実行できます。updateOneは、sortオプションを使用したソートをサポートしています。TTL インデックスは、キャップされたコレクションに作成できます。
トランザクションではないバルク挿入では、個別の oplog は生成されなくなり、単一の oplog でバッチ処理されます。挿入されたすべてのドキュメントは、変更ストリーム イベントで同じ
clusterTimeを持ちます。これにより、バルク挿入のパフォーマンスが向上し、セカンダリ ノードから複数の oplog を再生することによって発生する可能性のあるレプリケーションの遅延が回避されます。同じデータベース内の異なるコレクションに対して、同時 DDL 操作を実行できます。
コレクションを変更する
reshardCollectionなど、シャーディングされたクラスターで DDL 操作が実行されている場合、シャードの追加または削除はブロックされます。これらの操作は、DDL 操作の後でのみ実行できます。インデックスの作成は、より高速なエラー レポートとより強力なディザスタ リカバリ機能によって改善されています。
操作
MongoDB 8.0
MongoDB 8.0 より前
エラー検出後にインデックスの作成を停止する状況
コレクション スキャン フェーズ中に検出されたインデックス エラー(重複キー エラーを除く)はすぐに返され、インデックスの作成は停止します。
MongoDB 8.0 は、インデックス エラーの診断を迅速に実行するのに役立ちます。たとえば、互換性のないインデックス値形式が見つかった場合、このエラーはすぐに返されます。
MongoDB 8.0 より前は、コレクション スキャン フェーズ中に検出されたインデックス エラーは、インデックス作成の最後に発生するコミット フェーズで返されていました。
MongoDB 8.0 と比較して、以前のバージョンでは、コミット フェーズのインデックス作成の最後にエラーが返されるため、インデックス作成エラーが返されるまでに時間がかかる場合があります。
回復力のあるデプロイメント
デプロイメントの回復力が強化されています。インデックス作成エラーが発生した場合、セカンダリ メンバーはプライマリ メンバーにインデックス作成の停止を要求でき、クラッシュしません。
インデックス作成の停止要求は、常に実行できるとは限りません。メンバーがすでにインデックスのコミットに投票している場合、セカンダリ メンバーはインデックス作成の停止を要求できず、クラッシュします。この状況は、MongoDB 7.0 以前のバージョンと似ています。
インデックス作成エラーにより、セカンダリ メンバーがクラッシュする可能性があります。
ディスク容量
インデックス作成のためにディスク容量管理が最適化されています。使用可能なディスク容量が
indexBuildMinAvailableDiskSpaceMBパラメーターで指定された最小値未満の場合、インデックス作成が自動的に停止する場合があります。メンバーがインデックスのコミットに投票している場合、インデックス作成は停止しません。
使用可能なディスク容量が不十分な場合も、インデックス作成は停止します。