MongoDB 4.4 は 2024 年 2 月にサポート終了(EOL)を迎えました。EOL バージョンを継続して実行すると、セキュリティパッチ、バグ修正、および技術サポートが一切提供されなくなります。さらに重要なのは、ApsaraDB for MongoDB チームが、MongoDB 4.4 およびそれ以前のバージョンにおいて特定のカーネルバグおよび運用上のリスクを文書化しており、その一部は「高」の深刻度に分類されている点です。これらの問題は、アップグレードによってのみ解決されます。
MongoDB 5.0、6.0、7.0、または 8.0 へアップグレードしてください。バージョンのライフサイクル期間については、「ライフサイクルスケジュール」をご参照ください。
旧バージョンにおけるリスク
ApsaraDB for MongoDB チームは、長年のクラウドデータベース運用経験に基づき、以下のリスクを特定しました。
移行中の孤立ドキュメントによるデータの不整合
影響を受けるバージョン:MongoDB 4.2 以降を実行するシャードクラスターインスタンス
修正済みバージョン:MongoDB 4.4 以降
チャンクがソースシャードから送信先シャードへ移行した後、ソースシャードはチャンクを一時的に保持したまま削除します。移行が中断されると、孤立ドキュメントが残存します。孤立ドキュメントは、mongos ノードでのリクエストには影響しません。これは、ConfigServer ノードのルーティングデータによってリクエストが検証されるためです。ただし、孤立ドキュメントが蓄積すると、その後の移行中にデータの不整合が発生します。
MongoDB 4.4 では、自己回復型のチャンク移行および孤立ドキュメントの自動クリーンアップ機能が導入されました。ノードが移行途中で障害を起こした場合でも、MongoDB は処理を自動的に再開します。そのため、cleanupOrphaned コマンドを手動で実行する必要はありません。バックグラウンドのクリーンアップスレッドが有効であることを確認する場合にのみ、このコマンドを実行してください。
詳細については、「cleanupOrphaned」をご参照ください。
compact コマンドによる読み取り/書き込みのブロック
影響を受けるバージョン:MongoDB 4.2 以前を実行するすべてのアーキテクチャ
修正済みバージョン:MongoDB 4.4 以降
MongoDB 4.2 以前で compact コマンドを実行してディスクの断片化を解消すると、その実行中はすべての読み取りおよび書き込み操作がブロックされます。この操作は中断できないため、復旧の唯一の手段はインスタンスの再起動となり、業務継続性に影響を与えます。
MongoDB 4.4 では、compact コマンドのロック動作が最適化され、CRUD 操作はブロックされなくなりました。一部の DDL 操作 — createIndex および dropIndex — のみが一時的に影響を受けます。compact の実行は、メンテナンスウィンドウ外でスケジュールしてください。
ディスクの断片化を解消するには、ApsaraDB for MongoDB が提供する ストレージ分析 機能の使用を推奨します。
詳細については、「インスタンスのディスクのデフラグメント」および「ブロッキング コンパクト」をご参照ください。
compact コマンドによるノードの RECOVERING 状態への移行
影響を受けるバージョン:メジャーバージョンが MongoDB 4.2 以前であり、マイナーバージョンが 4.2.18 より前のすべてのアーキテクチャ
修正済みバージョン:MongoDB 4.4 以降
該当バージョンでは、compact コマンドを実行すると、mongos ノードが RECOVERING 状態に移行します。ノードがこの状態を長期間維持すると、ApsaraDB for MongoDB のアクティベーションコンポーネントがノードを異常と判断し、再構築をトリガーします。これにより、予期しないダウンタイムが発生します。
MongoDB 4.2.18 以降では、compact 実行後に mongos ノードが RECOVERING 状態に移行しなくなるため、ノードの利用不能および予期しない再構築フローが防止されます。
ディスクの断片化を解消するには、ApsaraDB for MongoDB が提供する ストレージ分析 機能の使用を推奨します。
詳細については、「インスタンスのディスクをデフラグする」および「compact RECOVERING」をご参照ください。
非表示ノードにおける物理バックアップによる過剰なディスク領域消費
影響を受けるバージョン:MongoDB 4.2 以前を実行し、ローカルディスクを使用するすべてのアーキテクチャ
修正済みバージョン:MongoDB 5.0 以降(クラウドディスク)
ローカルディスクインスタンスにおける物理バックアップ機構では、バックアップのアップロード中にディスクファイルサイズが継続的に増加します。大規模な累積ファイルは大量のディスク領域を消費し、ノード障害やスイッチオーバー時に誤ったディスク使用率アラートを引き起こします。
クラウドディスクインスタンスでは、物理バックアップとディスクスナップショットを組み合わせることで、WiredTiger(WT)バックアップチェックポイントの維持に必要な時間が短縮され、非表示ノードにおけるディスク領域の肥大化が解消されます。2 TB を超えるデータを持つレプリカセットインスタンスでは、ローカルディスクの物理バックアップに伴う長時間のバックアップ、高い失敗率、および O&M 操作の競合を回避するために、スナップショットバックアップをご利用ください。
残留ルーティングデータによる同名データベース再作成時の障害
影響を受けるバージョン:MongoDB 4.4 以前を実行するシャードクラスターインスタンス
修正済みバージョン:MongoDB 5.0 以降
シャードクラスター内で dropDatabase を使用してデータベースを削除し、その後同名のデータベースを再作成すると、ConfigServer ノード内の残留ルーティングデータにより、読み取りおよび書き込み操作が失敗します。
MongoDB 4.2 以前では、dropDatabase を繰り返し実行した後、すべての mongos ノードで flushRouterConfig を実行してルーティングデータをフラッシュする必要があります。そうしないと、残留データがパフォーマンスを劣化させます。
MongoDB 5.0 では、dropDatabase のルーティングデータ処理が最適化され、ルーティングデータが自動的にクリアされるようになったため、この手動クリーンアップは不要になりました。
詳細については、「dropDatabase」および「flushRouterConfig」をご参照ください。
デフォルトの書き込み保証 {w:1} によるセカンダリノードでのデータ同期失敗
影響を受けるバージョン:MongoDB 5.0 より前のすべてのアーキテクチャ
修正済みバージョン:MongoDB 5.0 以降
デフォルトの書き込み保証 {w:1} を使用すると、プライマリノードへ高速に書き込まれたデータが、セカンダリノードへ完全に反映されない場合があり、結果としてセカンダリノードが RECOVERING 状態に移行します。これにより、インスタンスの可用性が低下し、読み書き分離ワークロードが破綻し、増分バックアップおよびポイントインタイムリカバリが実行できなくなります。
MongoDB 5.0 では、デフォルトの書き込み保証が {w:1} から {w:"majority"} へ変更されました。書き込みは、レプリカセットメンバーの過半数が確認した時点でクエリ可能になります。これにより、わずかなパフォーマンス低下を伴いながらもデータ信頼性が向上します。高スループットの書き込みワークロードで従来の動作を許容できる場合は、書き込み保証を {w:1} へ戻すことができます。
詳細については、「デフォルトの書き込み保証」および「setDefaultRWConcern」をご参照ください。
スケールアウトを支えるのに十分な速度でデータを再バランスできないバランサー
影響を受けるバージョン: すべてのアーキテクチャで、MongoDB 5.0 より前のバージョンを実行しているもの
修正済みバージョン:MongoDB 5.0 以降
バランサーは、スケールアウトイベント中にデータを再バランスするのに十分な速度でチャンクを移行できません。その結果、データがシャード間で不均等に分散されたままとなり、パフォーマンスが劣化します。
MongoDB 5.0 では、chunkMigrationConcurrency および balancerMigrationsThrottlingMs パラメーターが追加され、ワークロードに応じてバランサーの移行同時実行数およびスループットを調整できるようになりました。
インスタンスが既に MongoDB 5.0 で動作しているにもかかわらず、これらのパラメーターが利用できない場合は、後続のマイナーバージョンへ更新してください。「インスタンスのマイナーバージョンの更新」をご参照ください。
詳細については、「chunkMigrationConcurrency」および「balancerMigrationsThrottlingMs」をご参照ください。
チャンク数に基づくバランス調整によるシャードクラスター内の負荷不均衡
影響を受けるバージョン:メジャーバージョンが MongoDB 5.0 以下かつマイナーバージョンが 6.0.3 より前のすべてのアーキテクチャ
修正済みバージョン:MongoDB 6.0 以降
バランサーは、データ量ではなくチャンク数に基づいてデータを分散します。ジャンボチャンクや空のチャンクが存在する場合、あるいは一部のデータに対してトラフィックが集中する場合、チャンク数は均等に見えるものの、シャード間で負荷が不均等になります。
MongoDB 6.0.3 では、バランサーがチャンク数ではなく、シャード間のデータ量の差に基づいてデータを分散するように変更されました。これにより、ジャンボチャンク、空のチャンク、ホットデータパターンに起因する負荷不均衡が解消されます。
詳細については、「MongoDB 6.0.3 におけるバランサーの変更点」をご参照ください。
その他のカーネル問題
以下は、ApsaraDB for MongoDB チームが特定した、以前の MongoDB バージョンにおけるその他のカーネル問題の一覧です。
| バージョン | 問題 | リスクレベル | トリガーおよび説明 |
|---|---|---|---|
| MongoDB 3.4 | SERVER-34192 SERVER-20328 SERVER-21307 | 中 | トリガー:読み書き分離が有効化されている。 問題:セカンダリノードが oplog を再生する際にグローバルロックが取得され、リクエストが遅延する。 |
| MongoDB 4.0 | SERVER-70783 | 低 | トリガー:サーバー接続数が大幅に増加する。 問題:セッション数が不足することによりアサーションが発生し、mongos ノードの障害およびスイッチオーバーが発生する。 |
| MongoDB 3.6–4.2 | SERVER-40535 | 低 | トリガー:偶発的。 問題:Cache Reader No keys found for HMAC that is valid for time エラーが発生し、リトライロジックが必要となる。 |
| MongoDB 4.2 以前 | SERVER-43641 SERVER-51803 | 低 | トリガー:偶発的;/dev/urandom に関連。 問題:mongos ノードがクラッシュし、再起動後に自動的に回復する。 |
| MongoDB 4.0–4.2 | SERVER-43889 | 低 | トリガー:偶発的。 問題:サーバーがトランザクションとリトライ可能な書き込みを区別できず、リクエストが失敗する。 |
| MongoDB 4.0–4.4 | SERVER-51281 SERVER-50365 | 高 | トリガー:長時間実行されるトランザクション。 問題:ライトスルーキャッシュのエビクションが失敗し、汚れたキャッシュラインが 20 % を超え、トランザクションクリーンアップスレッドが停止する — これにより、リクエストのレイテンシーが大幅に増加し、パフォーマンスが劣化する。 |
| MongoDB 3.6–4.4 | SERVER-52654 | 高 | トリガー:ConfigServer ノードが 90 日間切り替わっていない。 問題:ConfigServer ノードにおけるハッシュベースのメッセージ認証コード(HMAC)鍵生成の失敗により、mongos ノードがクラッシュし、自動回復に失敗する。 |
| MongoDB 4.0–4.4 | SERVER-53566 | 中 | トリガー:偶発的。 問題:opContext アサーションエラーにより mongod がクラッシュし、スイッチオーバーが発生する。 |
| MongoDB 4.4 以前 | SERVER-21307 | 高 | トリガー:セカンダリノードにおけるバックグラウンドインデックス作成中に、DDL 操作が oplog に記録される。 問題:DDL 操作がブロックされ、セカンダリノードが障害を起こす。 |
| MongoDB 4.4 以前 | WT-5809 | 中 | トリガー:ノードの再起動またはデータ同期の初期化。 問題:WiredTiger 履歴ストアにおける時系列順序の問題により WT アサーションエラーが発生し、mongod がクラッシュする。 |
| MongoDB 4.2–4.4 | SERVER-51041 | 高 | トリガー:読み書き分離が有効化されており、セカンダリノードの負荷が高い。 問題:POSIX スレッドミューテックスの競合により、セカンダリノードの読み取りチケットが枯渇し、パフォーマンスが劣化する。 |
| MongoDB 4.2–4.4 | SERVER-52556 SERVER-66176 | 中 | トリガー:アプリケーションが頻繁に listCollections を呼び出す。 問題:基盤となる CollectionCatalog コンポーネントにおけるミューテックスロック競合により、パフォーマンスが大幅に劣化する。 |
| MongoDB 6.0 以前 | SERVER-63865 SERVER-67038 SERVER-69877 | 高 | トリガー:インデックス作成中のメモリ不足(OOM)エラー。 問題:mongod が繰り返し再起動し、回復に失敗する。レプリカセットのノードが 2 つともこの状態になると、インスタンスが利用不能になる。 |
| MongoDB 6.0 以前 | SERVER-56194 | 低 | トリガー:TTL(Time to Live)インデックスの作成または有効期限の変更後に、大量の期限切れドキュメントが発生する。 問題:バックエンドの TTL スレッドが停止し、回復できないため、TTL 機能が停止する。 |
後続バージョンの新機能
| バージョン | 機能 | 説明 |
|---|---|---|
| MongoDB 5.0 | 時系列コレクション | インターネット・オブ・ビークルズ(IoV)および IoT(モノのインターネット)シナリオ向けの、時系列データの効率的な保存およびクエリ機能。 |
| 長時間実行されるスナップショットクエリ | 進行中の操作に影響を与えることなく、履歴スナップショットを読み取ることができます。 | |
| バージョン付き API | アプリケーションライフサイクルとデータベースライフサイクルを分離します。アプリケーションは、データベースのバージョンアップグレード後も完全に互換性を保ち、互換性対応の作業は不要です。 | |
| MongoDB 6.0 | チェンジストリーム | 事前変更ビューが利用可能になりました。実行効率およびリソース利用率が向上しています。孤立ドキュメントの更新をフィルター処理できます。より多くの DDL 変更イベントがサポートされ、Change Data Capture(CDC)の機能が強化されています。 |
| シャードクラスターにおける JOIN クエリ | シャードクラスターインスタンスは、JOIN クエリ用の $lookup および $graphLookup 演算子をサポートし、演算子のパフォーマンスが向上しています。 | |
| シャードクラスターにおける自動最適化 | configureCollectionBalancing を使用して、シャードごとのチャンクサイズを指定し、自動最適化を有効化できます。シャードクラスターでは、compact コマンドを手動で実行する必要はありません。 | |
| 時系列コレクションの改善点 | シャーディング対応、ストレージ使用量削減のためのカラム圧縮、読み取りパフォーマンス向上のためのセカンダリおよび結合インデックス、時空間データ向けの GeoSpatial インデックス、および時系列データの最適化されたソート機能。 | |
| 拡張された compact コマンド | WiredTiger 内の compact コマンドが完全に最適化され、パフォーマンスが大幅に向上し、エビクションによる障害が減少しました。 | |
| MongoDB 7.0 | シャードキー分析 | サンプリングされたクエリ結果を分析して、コレクションのシャードキーが最適かどうかを評価します。これにより、スキーマおよびシャードキーの設定をより効率的に行えます。 |
| クエリ可能な暗号化 | 機密データをそのライフサイクル全体 — 通信中、静止時、利用中、ログ内、バックアップ内 — で暗号化します。データはクライアント側でのみ復号されるため、盗難によるデータ漏えいリスクが大幅に低減されます。 | |
| メタデータ整合性チェック | メンテナンスウィンドウ終了後、または OOM エラーまたはフェールオーバーなどの例外発生後に、メタデータおよびインデックスの不整合を自動的に検出します。 | |
| チェンジストリームにおける大規模な変更イベント | $changeStreamSplitLargeEvent 演算子を使用することで、16 MB を超える変更イベントを分割できます。これにより、以前のバージョンで大規模イベントが原因でチェンジストリームが失敗するという制限が解消されます。 | |
| WiredTiger 内の動的速度制限 | WiredTiger トランザクションの同時実行数(デフォルト:128)を動的に調整し、例外発生後のリクエストの蓄積によるデータベース障害を防止します。 | |
| MongoDB 8.0 | 高度な TCMalloc | スレッドごとのキャッシュではなく、CPU ごとのキャッシュを使用することで、メモリフラグメントを削減し、より重いワークロードに対応します。バックグラウンドスレッドが毎秒、オペレーティングシステムへメモリを解放します。 |
| 同期性能の最適化 | 書き込み保証を majority に設定した場合、MongoDB は変更が適用されるのを待つのではなく、oplog がレプリカメンバーの過半数に書き込まれた時点で応答を返します — これにより、書き込みスループットが向上します。セカンダリノードでは、oplog バッチの書き込みと適用が並列で実行されます。Writer スレッドがプライマリから読み取り、ローカル oplog へ書き込む一方、Applier スレッドが非同期でローカルデータベースへ変更を適用します。 | |
| リシャーディングの最適化 | reshardCollection コマンドのパフォーマンスが向上し、コレクションのシャードキーおよびデータ分布の変更が高速化されました。 |