MongoDB 5.0 は、ユーザーに新機能をより迅速に提供するための新たなリリースサイクルを開始します。バージョン付き API とライブシャーディング再構成(live resharding)を組み合わせることで、データベースのアップグレードや業務変更時の課題が解消されます。ネイティブな時系列プラットフォームにより、MongoDB はより広範なワークロードおよびビジネスシナリオに対応可能になります。また、新しい MongoDB Shell はユーザーエクスペリエンスを向上させます。本トピックでは、各機能の概要およびワークロードへの影響について説明します。
ネイティブな時系列プラットフォーム
MongoDB 5.0 は、時系列データのライフサイクル全体(インジェスト、ストレージ、クエリ、リアルタイム分析、可視化、オンラインアーカイブ、有効期限)にわたる、第一級のサポートを追加しました。
時系列コレクションは、ストレージ容量および I/O を削減するため、圧縮されたカラム指向最適化フォーマットでデータを格納します。専用の時系列データベースとは異なり、時系列コレクションは同じデータベース内に通常のコレクションと共存するため、別途統合レイヤーを介さずに、時系列データとトランザクションデータを統合してクエリできます。
時系列コレクションを作成するには、以下のコマンドを実行します。
db.createCollection("collection_name", { timeseries: { timeField: "timestamp" } })MongoDB は、データを時間単位のチャンクに自動的にパーティション分割し、順不同の書き込みを処理するとともに、クエリ遅延を最小限に抑えるために時間順にソートされたクラスター化インデックスを作成します。
Kafka 連携。 Apache Kafka 向け MongoDB コネクタは、時系列コレクションをネイティブにサポートしています。Kafka トピックのメッセージを直接時系列コレクションへ書き込み、インジェスト時に処理および集約を実行できます。
分析クエリ。 MongoDB クエリ API は、時間単位のウィンドウをサポートするようにウィンドウ関数を拡張しました。行単位の集約(例:3 行移動平均)に加え、ウィンドウを時間単位で定義できます。たとえば、15 分間の指数移動平均(EMA)、微分値、積分値などが可能です。新しい時間演算子には、カスタムタイムウィンドウクエリ用の $dateAdd、$dateSubstract、$dateDiff、および $dateTrunc があります。ウィンドウ関数は、時系列コレクションおよび通常のコレクションの両方で使用可能です。
適用可能なワークロード:IoT テレメトリ、金融分析、物流トラッキング。
ライブシャーディング再構成
それ以前の MongoDB バージョンでは、シャーディング再構成に、全コレクションをオフラインでダンプ・再読み込みする方法(3 シャードクラスターで 10 TB を超えるコレクションの場合、数日かかる場合あり)または、2 つのシャードクラスター間で手動でマイグレーションを調整する方法が必要でした。ある MongoDB ユーザーは、手動方式で 100 億ドキュメントをマイグレーションするのに 3 ヶ月を要しました。
MongoDB 5.0 のシャーディング再構成は、完全にオンラインかつ自動化されています。
仕組み。 reshardCollection コマンドを実行すると、バックグラウンドで 3 つのフェーズからなるプロセスが起動します。
クローン:各受信シャードが、新しいシャードキーを使用してコレクションデータをクローンします。
適用:受信シャードが oplog からの継続的な書き込み操作を適用し、ソースと同期した状態を維持します。
切り替え:MongoDB が新しいコレクションに切り替え、古いコレクションを削除します。
コマンドの構文は以下のとおりです。
reshardCollection: "<database>.<collection>", key: <shardkey>| パラメーター | 型 | 説明 |
|---|---|---|
<database> | String | シャーディング再構成対象のコレクションを含むデータベース |
<collection> | String | シャーディング再構成対象のコレクション |
<shardkey> | Document | 新しいシャードキー(例:{ userId: 1 } または { orderId: "hashed" } |
シャーディング再構成に要する期間は、週~月単位から分~時間単位へと短縮され、ダウンタイムは不要です。本番環境でシャーディング再構成を実行する前に、開発環境またはテスト環境で複数のシャードキーを評価してください。また、ワークロードの成長や進化に応じて、シャードキーを随時変更することも可能です。
バージョン付き API
API バージョンを明示しない場合、サーバーアップグレードによってコマンドの動作が変更され、アプリケーションが停止する可能性があります。バージョン付き API は、アプリケーションで最も一般的に使用されるコマンドおよびパラメーターのセットを定義します。これらのコマンドは、MongoDB のすべてのリリース(年次メジャーリリースおよび四半期ごとの迅速リリース)において安定しており、アプリケーションライフサイクルとデータベースライフサイクルがデカップリングされます。ドライバーを特定の API バージョンに固定することで、サーバーアップグレード後も何年間もコード変更なしでアプリケーションを継続実行できます。
同一サーバー上で、既存の API バージョンと新しい API バージョンを並行して実行することも可能です。これにより、増分移行が可能になります。
デフォルトの majority 書き込み保証
MongoDB 5.0 以降、デフォルトの Write Concern は majority です。書き込みは、プライマリノードへの適用およびセカンダリノードの過半数へのログ永続化が完了した後にのみ確認されます。
これは、それ以前のデフォルトと比較して、出荷時からより強力なデータ耐久性を提供します。Write Concern は引き続き完全にチューニング可能であり、書き込み遅延と耐久性要件のバランスを調整できます。
接続管理の改善
MongoDB は、クライアント接続ごとに 1 スレッドを使用します(net.serviceExecutor = synchronous)。高い同時実行性下では、スレッド作成およびコンテキストスイッチが多大なリソースを消費します。接続が制御不能に増加する「接続ストーム」と呼ばれる状況が発生すると、サーバーは過負荷状態に陥り、特に負荷がすでに高いタイミングでその影響が顕著になります。
MongoDB 5.0 では、ドライバー側で以下の 3 つの改善が導入されています。
接続数制限:ドライバーが作成を試みる接続数を上限で制限し、サーバーが過負荷になるのを防ぎます。
ヘルスチェック頻度の低減:ドライバーが接続プールを確認する頻度を下げ、応答がない、または過負荷状態のノードにバッファーおよび回復の時間を与えます。
健全性の高い接続プールへのルーティング:サーバーをランダムに選択するのではなく、最も健全な接続プールを持つサーバーへルーティングします。
これらの変更は、mongos のクエリルーティングに関する従来の改善と相まって、高い同時実行性下でのスループットをさらに向上させます。
長時間実行スナップショットクエリ
長時間実行スナップショットクエリは、アプリケーションの汎用性および柔軟性を高めます。この機能で実行されるスナップショットクエリのデフォルト実行時間は 5 分です。実行時間はカスタマイズ可能です。この機能は、スナップショット隔離保証による強力な整合性を維持しつつ、ライブおよびトランザクションワークロードのパフォーマンスに影響を与えることなく、セカンダリノード上でスナップショットクエリを実行できるようになります。これにより、分析ワークロードをプライマリノードから分離できます。
仕組み。 スナップショットクエリは、MongoDB 4.4 以降で利用可能なストレージエンジン機能である「Durable history」に依存します。Durable history は、クエリ開始時点からの変更済みフィールド値のスナップショットを保持します。高い書き込み負荷下では、これによりストレージエンジンのキャッシュ圧力を軽減し、クエリスループットを向上させます。
新しい MongoDB Shell
MongoDB Shell は、Node.js REPL を基盤とするモダンなコマンドライン環境として再設計されました。現在、MongoDB のデフォルトシェルとなっています。
開発者体験の改善点:
構文ハイライト:フィールド、値、データの型を視覚的に区別し、構文エラーを軽減します。
インテリジェントな自動補完:MongoDB のバージョンに基づいて、メソッド、コマンド、MQL 式を提案します。
コンテキストに応じたエラーメッセージ:エラーの正確な位置を特定し、修正案を提示します。
コマンドの構文を忘れてしまった場合は、シェル内で直接検索できます:
スクリプト実行:スクリプトは Node.js REPL 上で実行されるため、すべての Node.js API および npm パッケージにアクセスできます。load() および eval() を使用して、ファイルシステムからスクリプトを読み込んで実行できます。これは、以前のシェルバージョンと同様の動作です。
スニペット:Snippets プラグインをインストールすることで、Node.js API および npm パッケージを活用した再利用可能なスクリプトでシェルを拡張できます。スニペットは MongoDB Shell に自動的にロード可能です。MongoDB は、指定されたコレクションパターンに対するプラグイン分析などの機能を提供する Snippets リポジトリを運用しています。
スニペットは実験的機能です。
PyMongoArrow
PyMongoArrow は、MongoDB のクエリ結果を Pandas DataFrame や NumPy 配列に直接変換する新しい Python ライブラリです。手動でのデータ変換を経ず、MongoDB のデータに対して機械学習ワークフローおよび分析タスクを実行できます。
スキーマ検証の改善
MongoDB 5.0 では、書き込み操作がスキーマ検証に失敗した場合、エラーメッセージに違反しているドキュメントおよびフィールドが明示的に記載されます。これにより、無効な書き込みを引き起こすコードパスを迅速に特定・修正できます。
再開可能なインデックス構築
インデックス構築中にノードが再起動した場合、MongoDB 5.0 は自動的に中断地点から構築を再開します。大規模コレクションにおけるインデックス構築は、計画メンテナンス、アップグレード、ローリングリスタートの際に、最初から再実行されるリスクから解放されます。
リリース頻度
MongoDB 5.0 以降、MongoDB は以下の 2 種類のシリーズでリリースされます。
| シリーズ | 目的 |
|---|---|
| メジャーリリース | 本番環境での使用 |
| 迅速リリース | 評価および開発専用;本番環境では使用不可 |
2 シリーズモデルにより、MongoDB は新機能をより迅速に提供できます。各バージョンは 20 以上のサポート対象プラットフォームで検証が必要であるため、迅速な反復開発と本番リリースを分離することで、配信パイプラインの流動性を確保しています。
今後の予定
MongoDB 5.0 の変更点の完全な一覧については、「MongoDB 5.0 のリリースノート」をご参照ください。