MongoDB - low-hill/Knowledge GitHub Wiki

Document Database

MongoDB๋Š” ๋ฌธ์„œ ์ง€ํ–ฅ(Document-Oriented) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์ด๋‹ค. ๋ฌธ์„œ๋Š” "field : value" ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ JSON ๊ฐ์ฒด์™€ ์œ ์‚ฌํ•˜๋‹ค. value์—๋Š” ๋‹ค๋ฅธ documents, arrays ๋ฐ ๋ฌธ์„œ์˜ ๋ฐฐ์—ด(arrays of documents)์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค. image

RDBMS์™€์˜ ๊ตฌ์กฐ ๋น„๊ต

RDBMS vs MongoDB ๊ตฌ์กฐ ๋น„๊ต

RDBMS MongoDB
Database Database
Table Collection
Row Document
Column Field

์žฅ์ 

  • Embedded documents์™€ ๋ฐฐ์—ด์˜ ์‚ฌ์šฉ์œผ๋กœ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์กฐ์ธ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค
  • ์Šคํ‚ค๋งˆ๊ฐ€ ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚จ

Collections, Views, On-Demand Materialized Views๋ฅผ ์ง€์›

  • MongoDB๋Š” documents๋ฅผ collection์— ์ €์žฅํ•œ๋‹ค.
    • collection์€ RDB์˜ ํ…Œ์ด๋ธ”๊ณผ ์œ ์‚ฌํ•˜๋‹ค.
  • Read-only View (MongoDB 3.4 ๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›)
  • On-Demand Materialized View (MongoDB 4.2 ๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›)
    • ์š”์ฒญ ์‹œ ๋จธํ‹ฐ๋ฆฌ์–ผ๋ผ์ด์ฆˆ๋œ ๋ทฐ๋Š” ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ์ ์— ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ทฐ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด MongoDB๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ทฐ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋ฉด์„œ๋„ ๋ฌธ์„œ ์ง€ํ–ฅ ๋ชจ๋ธ์˜ ์žฅ์ ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ทฐ์™€ ์ปฌ๋ ‰์…˜์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ํŠน์ • ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

MongoDB์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

  • ๋†’์€ ์„ฑ๋Šฅ
    • embedded data models์˜ ์ง€์›์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์˜ I/O ์ค„์ž„
    • ์ธ๋ฑ์Šค๋กœ ๋น ๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋ฉฐ embedded documents์™€ ๋ฐฐ์—ด์˜ ํ‚ค๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Œ

Query API

  • MongoDB ์ฟผ๋ฆฌ API๋Š” CRUD๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์Œ์„ ์ง€์›ํ•œ๋‹ค:
    • ๋ฐ์ดํ„ฐ ์ง‘๊ณ„
    • ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ ๋ฐ ์ง€๋ฆฌ๊ณต๊ฐ„ ์ฟผ๋ฆฌ

์„ฑ๋Šฅ๊ณผ ๊ฐ€์šฉ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ๊ธฐ์ˆ 

Replication: ๋ฐ์ดํ„ฐ ๊ฐ€์šฉ์„ฑ๊ณผ ๋‚ด๊ตฌ์„ฑ ํ™•๋ณด

Replication์€ ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์šฉ์„ฑ๊ณผ ๋‚ด๊ตฌ์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด MongoDB์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋ณต์ œํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์žฅ์•  ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์„ ๊ฐ•ํ™”ํ•˜๊ณ , ์ฝ๊ธฐ ์„ฑ๋Šฅ์„ ๋†’์ด๋ฉฐ, ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • MongoDB์˜ ๋ณต์ œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” replica set์€ ๋‹ค์Œ์„ ์ œ๊ณตํ•œ๋‹ค:
    • ์ž๋™ ์žฅ์•  ์กฐ์น˜ (automatic failover)
    • ๋ฐ์ดํ„ฐ ์ค‘๋ณต์„ฑ (data redundancy)
      • replica set์€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์œ ์ง€๊ด€๋ฆฌํ•˜๋Š” MongoDB ์„œ๋ฒ„ ๊ทธ๋ฃน์œผ๋กœ, ์ค‘๋ณต์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๊ฐ€์šฉ์„ฑ์„ ๋†’์ธ๋‹ค.
graph TB
    Client[ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜]
    
    subgraph "Replica Set"
        Primary[Primary Node]
        Secondary1[Secondary Node 1]
        Secondary2[Secondary Node 2]
        Arbiter[Arbiter]
    end
    
    Client --> Primary
    Client --> Secondary1
    Client --> Secondary2
    
    Primary ==> Secondary1
    Primary ==> Secondary2
    
    Primary -.-o Arbiter
    Secondary1 -.-o Arbiter
    Secondary2 -.-o Arbiter

    style Client fill:#4a4a4a,stroke:#333,color:#fff
    style Primary fill:#FF6B6B,stroke:#333,color:#fff,stroke-width:2px
    style Secondary1 fill:#4ECDC4,stroke:#333,color:#fff,stroke-width:2px
    style Secondary2 fill:#4ECDC4,stroke:#333,color:#fff,stroke-width:2px
    style Arbiter fill:#9B59B6,stroke:#333,color:#fff,stroke-width:2px
Loading

๊ตฌ์„ฑ์š”์†Œ

  • Primary Node: ๋ชจ๋“  ์“ฐ๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฃผ ๋…ธ๋“œ
  • Secondary Nodes: Primary์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•˜์—ฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ณด์กฐ ๋…ธ๋“œ๋“ค
  • Arbiter (์„ ํƒ์ ): ํˆฌํ‘œ๊ถŒ๋งŒ ๊ฐ€์ง„ ๋…ธ๋“œ๋กœ, ์ƒˆ๋กœ์šด Primary ์„ ์ถœ ์‹œ ์ฐธ์—ฌ

๋™์ž‘ ๋ฐฉ์‹

  • Primary์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์“ฐ๊ธฐ ์ž‘์—…์ด oplog์— ๊ธฐ๋ก
  • Secondary ๋…ธ๋“œ๋“ค์ด oplog๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋™๊ธฐํ™”
  • Primary ์žฅ์•  ์‹œ Secondary ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ƒˆ๋กœ์šด Primary๋กœ ์Šน๊ฒฉ

์‚ฌ์šฉ ์‚ฌ๋ก€

  • ๊ณ ๊ฐ€์šฉ์„ฑ์ด ํ•„์š”ํ•œ ์‹œ์Šคํ…œ
  • ์žฌํ•ด ๋ณต๊ตฌ(Disaster Recovery) ๋Œ€๋น„
  • ์ฝ๊ธฐ ์ž‘์—… ๋ถ„์‚ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

Sharding: ์ˆ˜ํ‰ ํ™•์žฅ์„ฑ

MongoDB์—์„œ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ˆ˜ํ‰ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋ถ„์‚ฐ ์ €์žฅํ•˜์—ฌ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋‚˜ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์ปค์ง์— ๋”ฐ๋ผ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

graph TB
    Client[ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜]
    
    subgraph "๋ผ์šฐํ„ฐ ๊ณ„์ธต"
        Router1[Mongos Router 1]
        Router2[Mongos Router 2]
    end
    
    subgraph "์„ค์ • ๊ณ„์ธต"
        Config[Config Servers<br/>ReplicaSet]
    end
    
    subgraph "๋ฐ์ดํ„ฐ ๊ณ„์ธต"
        Shard1[Shard 1]
        Shard2[Shard 2]
        Shard3[Shard 3]
    end

    Client --> Router1 & Router2
    
    Router1 & Router2 --> Config
    
    Router1 --> Shard1 & Shard2 & Shard3
    Router2 --> Shard1 & Shard2 & Shard3

    style Client fill:#4a4a4a,stroke:#333,color:#fff
    style Router1 fill:#FF6B6B,stroke:#333,color:#fff,stroke-width:2px
    style Router2 fill:#FF6B6B,stroke:#333,color:#fff,stroke-width:2px
    style Config fill:#9B59B6,stroke:#333,color:#fff,stroke-width:2px
    style Shard1 fill:#4ECDC4,stroke:#333,color:#fff,stroke-width:2px
    style Shard2 fill:#4ECDC4,stroke:#333,color:#fff,stroke-width:2px
    style Shard3 fill:#4ECDC4,stroke:#333,color:#fff,stroke-width:2px
Loading

๊ตฌ์„ฑ ์š”์†Œ

  • Shard
    • ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐ ์ €์žฅํ•˜๋Š” ๋…ธ๋“œ๋“ค: ๋ฐ์ดํ„ฐ์˜ ์‹ค์ œ ์ €์žฅ ์œ„์น˜, ๊ฐ ์ƒค๋“œ๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋ฅผ ์ €์žฅํ•˜๋ฉฐ, ๋…๋ฆฝ์ ์ธ ์„œ๋ฒ„๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Router (mongos)
    • ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ ์ ˆํ•œ ์ƒค๋“œ๋กœ ๋ผ์šฐํŒ…: ํด๋ผ์ด์–ธํŠธ์™€ ์ƒค๋“œ ๊ฐ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ ์ ˆํ•œ ์ƒค๋“œ๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • Config Servers
    • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ์ƒค๋“œ ๊ตฌ์„ฑ ์ •๋ณด ์ €์žฅ: ์ƒค๋“œ ๊ฐ„์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋ฒ„๋กœ, ๋ฐ์ดํ„ฐ ๋ถ„๋ฐฐ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Sharding ํ‚ค ์„ ํƒ

  • ์ƒค๋”ฉ ํ‚ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„ํ• ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ƒค๋”ฉํ‚ค๋Š” ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„ํฌ๋œ ๊ฐ’์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒค๋”ฉ ํ‚ค๋ฅผ ์ž˜๋ชป ์„ ํƒํ•˜๋ฉด ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, user_id๋‚˜ order_id์ฒ˜๋Ÿผ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„ํฌ๋œ ๊ฐ’์„ ์„ ํƒํ•ด์•ผ ์„ฑ๋Šฅ์˜ ๋ถˆ๊ท ํ˜•์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • Range Sharding: ๋ฒ”์œ„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์œผ๋กœ, ํŠน์ • ๋ฒ”์œ„์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ์ƒค๋“œ์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • Hash Sharding: ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„๋ฐฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋ถ€ํ•˜๊ฐ€ ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.
    • Zone Sharding: ํŠน์ • ์ง€์—ญ(๋ฐ์ดํ„ฐ)์— ๋Œ€ํ•ด ์ƒค๋“œ๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋™์ž‘ ๋ฐฉ์‹

  • ์ƒค๋“œ ํ‚ค(Shard Key)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐ
  • ๊ฐ ์ƒค๋“œ๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋ถ„๋งŒ ๋ณด์œ 
  • ๋ผ์šฐํ„ฐ๊ฐ€ ์š”์ฒญ์„ ๋ถ„์„ํ•˜์—ฌ ์ ์ ˆํ•œ ์ƒค๋“œ๋กœ ์ „๋‹ฌ

๋‘ ๋ชจ๋“œ์˜ ์กฐํ•ฉ

  • ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‘ ๋ชจ๋“œ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

๊ฐ ์ƒค๋“œ๋ฅผ ๋ ˆํ”Œ๋ฆฌ์นด ์…‹์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ:

  • ๊ณ ๊ฐ€์šฉ์„ฑ ๋ณด์žฅ
  • ํ™•์žฅ์„ฑ ํ™•๋ณด
  • ๋ฐ์ดํ„ฐ ์•ˆ์ •์„ฑ ํ–ฅ์ƒ
graph TB
    Client[ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜]
    Router[Mongos Router]
    Config[Config Servers]
    
    subgraph "Shard 1"
        Primary1[Shard1 Primary]
        Secondary1A[Shard1 Secondary 1]
        Secondary1B[Shard1 Secondary 2]
    end
    
    subgraph "Shard 2"
        Primary2[Shard2 Primary]
        Secondary2A[Shard2 Secondary 1]
        Secondary2B[Shard2 Secondary 2]
    end

    Client --> Router
    Router --> Config
    
    Router --> Primary1
    Router --> Primary2
    
    Primary1 --> Secondary1A & Secondary1B
    Primary2 --> Secondary2A & Secondary2B

    style Client fill:#4a4a4a,stroke:#333,color:#fff
    style Router fill:#FF6B6B,stroke:#333,color:#fff,stroke-width:2px
    style Config fill:#9B59B6,stroke:#333,color:#fff,stroke-width:2px
    style Primary1 fill:#FF8C42,stroke:#333,color:#fff,stroke-width:2px
    style Primary2 fill:#FF8C42,stroke:#333,color:#fff,stroke-width:2px
    style Secondary1A fill:#4ECDC4,stroke:#333,color:#fff,stroke-width:2px
    style Secondary1B fill:#4ECDC4,stroke:#333,color:#fff,stroke-width:2px
    style Secondary2A fill:#4ECDC4,stroke:#333,color:#fff,stroke-width:2px
    style Secondary2B fill:#4ECDC4,stroke:#333,color:#fff,stroke-width:2px
Loading

๋‹ค์ค‘ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์ง€์›

  • WiredTiger ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„(์•”ํ˜ธํ™” ํฌํ•จ)
  • ์ธ๋ฉ”๋ชจ๋ฆฌ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„

collection

  • db.collection_name.drop()
  • db.collection_name.deleteMany({})
    • db.users.deleteMany({ age: { $lt: 30 } })
    • db.users.deleteMany({ createdAt: { $gte: new Date('2022-01-01') } })

์„ค๊ณ„ ์‹œ ๊ณ ๋ ค์‚ฌํ•ญ

  • ์ปฌ๋ ‰์…˜ ์„ค๊ณ„
    • ๋…ผ๋ฆฌ์  ๊ทธ๋ฃนํ™”
    • ์ ‘๊ทผ ํŒจํ„ด ๊ณ ๋ ค
    • ์ธ๋ฑ์‹ฑ ์ „๋žต
  • ๋„ํ๋จผํŠธ ์„ค๊ณ„
    • ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํŒจํ„ด
    • ์—…๋ฐ์ดํŠธ ๋นˆ๋„
    • ๊ด€๊ณ„ ๋ชจ๋ธ๋ง
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”
    • ์ ์ ˆํ•œ ์ธ๋ฑ์Šค ์„ค์ •
    • ๋„ํ๋จผํŠธ ํฌ๊ธฐ ๊ด€๋ฆฌ
    • ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ ์„ค๊ณ„

Reference

โš ๏ธ **GitHub.com Fallback** โš ๏ธ