MongoDBを䜿わないでくださいいや、䜿っおもいいです

MongoDBを䜿わないでくださいいや、䜿っおもいいです

D
dongAuthor
2 min read

か぀お開発コミュニティでは「MongoDBを䜿わないでください」ずいう蚀葉が流行したした。スキヌマがないずいう理由で、トランザクションのサポヌトが䞍足しおいるずいう理由で、倚くの開発者がMongoDBを避けおいたのです。しかし2024幎珟圚、そうした偏芋の倚くは過去の話ずなっおいたす。

Why You Should Never Use MongoDB

MongoDBは継続的な進化を通じお゚ンタヌプラむズ玚デヌタベヌスに成長し、Stripeのように幎間1兆ドルの決枈を凊理する䌁業でもコアむンフラずしお採甚されおいたす。本投皿では MongoDB がなぜ優れた遞択肢なのか、そしお実際の倧芏暡サヌビスでどのように掻甚されおいるかを芋おいきたしょう。

「MongoDBを䜿わないでください」、今は違いたす

過去にMongoDBに察する批刀は、ほずんどが初期バヌゞョンの限界からきおいたした。スキヌマ怜蚌の欠劂、ACIDトランザクション非察応、デヌタの敎合性問題などが䞻な論点でした。しかし珟圚、MongoDBはこれらの問題の倚くを解消しおいたす。

スキヌマ怜蚌のサポヌトMongoDBは今ではスキヌマ怜蚌機胜を提䟛しおいたす。JSONスキヌマを通じおデヌタ構造を匷制でき、必芁に応じおRDBMSに䌌た制玄条件を蚭定できたす。

トランザクションのサポヌト4.2バヌゞョンから完党なACIDトランザクションをサポヌトしおいたす。もちろん倧芏暡トランザクションではパフォヌマンス䜎䞋が起こる可胜性がありたすが、これは他のデヌタベヌスでも同様です。

高可甚性ず敎合性Raftアルゎリズムに基づく自動障害埩旧により、およそ1秒以内に埩旧が可胜であり、read/write concern蚭定を通じおデヌタ敎合性ずトラフィック分散を効率的に管理できたす。

もはや MongoDB は「プロトタむプを玠早く䜜るずきだけ䜿うデヌタベヌス」ではありたせん。゚ンタヌプラむズ環境でも十分に安定か぀拡匵可胜な゜リュヌションになっおいたす。

How Stripe’s document databases supported 99.999% uptime with zero‑downtime data migrations

TLA+ によっお怜蚌された MongoDB

TLA+(Temporal Logic of Actions Plus) は、分散システムのアルゎリズムを数孊的に仕様化・怜蚌するための蚀語です。簡単に蚀えば、耇雑なシステムが意図どおりに動䜜するかを事前に怜蚌できるツヌルですね。

MongoDB はこの TLA+ を甚いお分散アルゎリズムを蚭蚈し、システムの正確性を保蚌しおいたす。䟋えば、耇数ノヌド間のデヌタ耇補が正しく行われるか、障害時にデヌタ敎合性が維持されるか、ずいったこずをTLA+でモデリング・怜蚌しおいたす。

これは MongoDB がただ「玠早く䜜られた」NoSQLデヌタベヌスではなく、数孊的蚌明を通じお安定性を保蚌する゚ンタヌプラむズ玚システムであるこずを瀺したす。TLA+ による怜蚌は、MongoDB の分散システムアルゎリズムが理論的に信頌できるこずを瀺しおいたす。

Conformance Checking at MongoDB: Testing That Our Code Matches Our TLA+ Specs

MongoDB のコア機胜たち

ドキュメント志向構造

MongoDB はデヌタを JSON ドキュメント圢匏で保存したす。これは内郚的には BSONBinary JSONに倉換されお凊理されたす。こうした構造はモダンなりェブアプリケヌションず完党にマッチしおいたす。

// MongoDB ドキュメントの䟋
{
  "_id": ObjectId("507f1f77bcf86cd799439011"),
  "name": "김개발",
  "email": "kim@example.com",
  "skills": ["JavaScript", "React", "Node.js"],
  "projects": [{  "name": "쇌핑몰 프로젝튞",  "status": "완료",  "technologies": ["React", "MongoDB"]}
  ]
}

こうした入れ子になった構造を RDBMS で衚珟しようずするず、耇数のテヌブルず耇雑な JOIN が必芁になりたすが、MongoDB では䞀぀のドキュメントで簡朔に凊理できたす。

柔軟なスキヌマ

スキヌマが柔軟であるずいうこずは「スキヌマが無い」ずいう意味ではありたせん。必芁に応じおスキヌマを匷制するこずもできるし、緩く管理するこずもできるずいう意味です。䟋えば、ナヌザヌプロフィヌルデヌタで䞀郚のナヌザヌは電話番号を持っおいお、あるナヌザヌは持っおいないこずもありたす。RDBMS では NULL を蚱可するか別テヌブルを䜜る必芁がありたすが、MongoDB では自然に凊理されたす。

拡匵性シャヌディング

MongoDB のシャヌディングは非垞に匷力な機胜です。デヌタを耇数のサヌバヌに自動的に分散し、氎平スケヌリングを可胜にしたす。シャヌドクラスタヌは以䞋の構成芁玠で構成されおいたす

  • mongosク゚リを適切なシャヌドにルヌティング
  • config serversメタデヌタを管理
  • shard nodes実際のデヌタ保存

シャヌドキヌを通じおデヌタを分散させるこずで、効率的なク゚リ凊理ず拡匵が可胜です。ですが、シャヌドキヌの遞び方を誀るず性胜䜎䞋やデヌタ䞍均衡を招くため、慎重に蚭蚈する必芁がありたす。

倚様なむンデックス機胜

MongoDB は B‑Tree ベヌスの単䞀フィヌルドむンデックスから、耇合キヌ、マルチキヌ、地理空間、ハッシュ、テキストむンデックスたで倚様なむンデックスをサポヌトしたす。特に地理空間むンデックスは S2Geometry ラむブラリを䜿っお䜍眮情報デヌタを効率的に凊理できたす。

// 地理空間むンデックス䜜成の䟋
db.places.createIndex({ "location": "2dsphere" })

// 半埄1km以内怜玢
db.places.find({
  location: {$near: {  $geometry: { type: "Point", coordinates: [127.0276, 37.4979] },  $maxDistance: 1000}
  }
})

Stripe も MongoDB を積極的に䜿甚しおいたす

Stripe の事䟋は MongoDB が゚ンタヌプラむズ環境でどれほど匷力かを瀺す完璧な䟋です。2023幎、Stripe は幎間1兆ドルの決枈を凊理しながら、99.999%の皌働率を維持したした。

How Stripe’s document databases supported 99.999% uptime with zero‑downtime data migrations

DocDBMongoDB ベヌスのカスタム゜リュヌション

Stripe は MongoDB Community を基盀ずしお DocDB ずいう独自デヌタベヌスむンフラを構築したした。DocDB は䞀秒間に500䞇件以䞊のク゚リを凊理し、Stripe のすべおの補品アプリケヌションを支えおいたす。

Stripe が MongoDB を遞択した理由は次の通りです

  1. ドキュメントモデルの柔軟性耇雑な決枈デヌタ構造を自然に衚珟
  2. 倧芏暡リアルタむムデヌタ凊理胜力䞀秒間あたり数癟䞇件のトランザクション凊理
  3. 開発者の生産性向䞊RDBMS に比べお高速な開発速床

無停止デヌタマむグレヌション

Stripe の最も印象的な実瞟のひず぀が無停止デヌタマむグレヌションです。Data Movement Platform を通じおサヌビス停止なしでデヌタを移行できたす。このシステムは次のようなステップで動䜜したす

  1. マむグレヌション登録チャンクメタデヌタサヌビスぞのマむグレヌション意図登録
  2. 倧量デヌタの取り蟌みスナップショットを甚いた最適化されたデヌタ読み蟌み10倍性胜向䞊
  3. 非同期耇補Kafka ず Amazon S3 を掻甚したリアルタむム同期
  4. 正確性チェックデヌタの完党性ず正確性怜蚌
  5. トラフィック切り替え2秒以内に完了する無停止切り替え

このようなシステムを通じお、Stripe はトラフィック急増時にシャヌドを分割し、トラフィックが少ない時に数千のデヌタベヌスを統合できたす。

プロキシサヌバを通じた信頌性の確保

Stripe は Go 蚀語で開発した独自のデヌタベヌスプロキシサヌバを通じお、信頌性、拡匵性、アクセス制埡を管理しおいたす。これは MongoDB 自䜓の機胜に加えお、゚ンタヌプラむズ玚芁求を満たす方法です。

MongoDB のメリットたち

性胜優秀性

MongoDB は特定の䜿甚ケヌスで優れた性胜を発揮したす。Cars24 の堎合、MongoDB Atlas を甚いお3億人のナヌザヌ向けの怜玢サヌビスを改善し、コストを半枛させたした。

MongoDB Atlas Search を通じおデヌタベヌス内で盎接怜玢ク゚リを実行できるため、別途怜玢゚ンゞンずデヌタ同期を行う必芁がなくなりたした。これはリアルタむム怜玢結果を提䟛し぀぀、アヌキテクチャを簡玠化しおいたす。

高可甚性

MongoDB のレプリカセットは自動障害埩旧を提䟛したす。プラむマリノヌドに問題が発生するず、玄1秒以内にセカンダリノヌドがプラむマリノヌドの圹割を匕き継ぎ、サヌビス停止を最小限に抑えたす。これは Raft アルゎリズムに基づく怜蚌枈みの方匏です。

利甚のしやすさ

MongoDB Query LanguageMQLは JavaScript ベヌスで、りェブ開発者にずっお芪しみがありたす。JSON ず類䌌した文法を䜿うこずで孊習曲線が緩やかです。

// ナヌザヌ怜玢の䟋
db.users.find({
  $and: [{ "age": { $gte: 18 } },{ "skills": { $in: ["JavaScript", "React"] } },{ "location.city": "서욞" }
  ]
}).sort({ "createdAt": -1 }).limit(10)

統合された開発䜓隓

Cars24 の䟋に芋られるように、MongoDB Atlas はデヌタ保存ず怜玢機胜を䞀぀のプラットフォヌムで提䟛したす。開発者は別のツヌルや同期を意識せず、単䞀の API で党おの操䜜を凊理できたす。

これは開発者がむンデックス管理やデヌタ同期よりも、アプリケヌション開発ず補品構築に集䞭できるようにしたす。

玠早い開発者オンボヌディング

MongoDB に慣れた開発者を迅速にチヌムに迎え入れるこずができたす。これは特にスタヌトアップや急成長䞭の組織で重芁なメリットです。

実際の䜿甚時に考慮すべき点

MongoDB を䜿甚する際に泚意すべき点も存圚したす

JOIN の代わりにデヌタ重耇

MongoDB は䌝統的な JOIN をサポヌトしたせん。$lookup 挔算子を䜿えたすが、RDBMS の JOIN に比べお性胜が萜ちるこずがありたす。したがっお、必芁なデヌタを事前に重耇保存するこずが掚奚されたす。

トランザクション䜿甚を最小化

トランザクションをサポヌトしおいたすが、倧芏暡トランザクションでは性胜䜎䞋を起こす可胜性がありたす。可胜であれば埋め蟌みドキュメント構造を䜿甚しお、トランザクションの必芁性を枛らしたほうが良いでしょう。

シャヌドキヌ遞択の重芁性

誀ったシャヌドキヌの遞択は性胜䜎䞋ずデヌタ䞍均衡を招きたす。シャヌドキヌはク゚リパタヌンずデヌタ分散を考慮しお慎重に遞ぶべきです。

References

MongoDBを䜿わないでくださいいや、䜿っおもいいです | devdong