MongoDB - low-hill/Knowledge GitHub Wiki
MongoDB๋ ๋ฌธ์ ์งํฅ(Document-Oriented) ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ
์ด๋ค.
๋ฌธ์๋ "field : value" ์์ผ๋ก ๊ตฌ์ฑ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก JSON ๊ฐ์ฒด์ ์ ์ฌํ๋ค. value์๋ ๋ค๋ฅธ documents, arrays ๋ฐ ๋ฌธ์์ ๋ฐฐ์ด(arrays of documents)์ ํฌํจํ ์ ์๋ค.
RDBMS vs MongoDB ๊ตฌ์กฐ ๋น๊ต
RDBMS | MongoDB |
---|---|
Database | Database |
Table | Collection |
Row | Document |
Column | Field |
- Embedded documents์ ๋ฐฐ์ด์ ์ฌ์ฉ์ผ๋ก ๋น์ฉ์ด ๋ง์ด ๋๋ ์กฐ์ธ์ ์ค์ผ ์ ์๋ค
- ์คํค๋ง๊ฐ ์ ์ฐํ๊ณ ํ์ฅ์ฑ์ด ๋ฐ์ด๋จ
- MongoDB๋ documents๋ฅผ collection์ ์ ์ฅํ๋ค.
- collection์ RDB์ ํ ์ด๋ธ๊ณผ ์ ์ฌํ๋ค.
- Read-only View (MongoDB 3.4 ๋ฒ์ ๋ถํฐ ์ง์)
- On-Demand Materialized View (MongoDB 4.2 ๋ฒ์ ๋ถํฐ ์ง์)
- ์์ฒญ ์ ๋จธํฐ๋ฆฌ์ผ๋ผ์ด์ฆ๋ ๋ทฐ๋ ์ฟผ๋ฆฌ ์คํ ์์ ์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ๋ทฐ์ด๋ค. ์ด๋ฅผ ํตํด MongoDB๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ทฐ ๊ธฐ๋ฅ์ ์ง์ํ๋ฉด์๋ ๋ฌธ์ ์งํฅ ๋ชจ๋ธ์ ์ฅ์ ์ ํ์ฉํ ์ ์๋ค. ๋ทฐ์ ์ปฌ๋ ์ ์ ์ ์ ํ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ํน์ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋์ ์ฑ๋ฅ
- embedded data models์ ์ง์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ I/O ์ค์
- ์ธ๋ฑ์ค๋ก ๋น ๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์ง์ํ๋ฉฐ embedded documents์ ๋ฐฐ์ด์ ํค๋ฅผ ํฌํจํ ์ ์์
- MongoDB ์ฟผ๋ฆฌ API๋ CRUD๋ฟ๋ง ์๋๋ผ ๋ค์์ ์ง์ํ๋ค:
- ๋ฐ์ดํฐ ์ง๊ณ
- ํ ์คํธ ๊ฒ์ ๋ฐ ์ง๋ฆฌ๊ณต๊ฐ ์ฟผ๋ฆฌ
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
- Primary Node: ๋ชจ๋ ์ฐ๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๋ ์ฃผ ๋ ธ๋
- Secondary Nodes: Primary์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ์ฌ ๊ฐ์ง๊ณ ์๋ ๋ณด์กฐ ๋ ธ๋๋ค
- Arbiter (์ ํ์ ): ํฌํ๊ถ๋ง ๊ฐ์ง ๋ ธ๋๋ก, ์๋ก์ด Primary ์ ์ถ ์ ์ฐธ์ฌ
- Primary์์ ๋ฐ์ํ๋ ๋ชจ๋ ์ฐ๊ธฐ ์์ ์ด oplog์ ๊ธฐ๋ก
- Secondary ๋ ธ๋๋ค์ด oplog๋ฅผ ์ค์๊ฐ์ผ๋ก ๋๊ธฐํ
- Primary ์ฅ์ ์ Secondary ์ค ํ๋๊ฐ ์๋ก์ด Primary๋ก ์น๊ฒฉ
- ๊ณ ๊ฐ์ฉ์ฑ์ด ํ์ํ ์์คํ
- ์ฌํด ๋ณต๊ตฌ(Disaster Recovery) ๋๋น
- ์ฝ๊ธฐ ์์ ๋ถ์ฐ์ด ํ์ํ ๊ฒฝ์ฐ
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
- Shard
- ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐ ์ ์ฅํ๋ ๋ ธ๋๋ค: ๋ฐ์ดํฐ์ ์ค์ ์ ์ฅ ์์น, ๊ฐ ์ค๋๋ ์ ์ฒด ๋ฐ์ดํฐ์ ์ผ๋ถ๋ฅผ ์ ์ฅํ๋ฉฐ, ๋ ๋ฆฝ์ ์ธ ์๋ฒ๋ก ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค.
- Router (mongos)
- ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ ์ ํ ์ค๋๋ก ๋ผ์ฐํ : ํด๋ผ์ด์ธํธ์ ์ค๋ ๊ฐ์ ์ธํฐํ์ด์ค๋ก, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ ์ ํ ์ค๋๋ก ๋ผ์ฐํ ํ๋ ์ญํ ์ ํฉ๋๋ค.
- Config Servers
- ๋ฉํ๋ฐ์ดํฐ์ ์ค๋ ๊ตฌ์ฑ ์ ๋ณด ์ ์ฅ: ์ค๋ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์๋ฒ๋ก, ๋ฐ์ดํฐ ๋ถ๋ฐฐ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
-
์ค๋ฉ ํค๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋ถํ ํ ์ง ๊ฒฐ์ ํ๋ ์ค์ํ ์์์ ๋๋ค. ์ค๋ฉํค๋ ๊ท ๋ฑํ๊ฒ ๋ถํฌ๋ ๊ฐ์ ์ ํํด์ผ ํฉ๋๋ค. ์ค๋ฉ ํค๋ฅผ ์๋ชป ์ ํํ๋ฉด ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, 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
- WiredTiger ์คํ ๋ฆฌ์ง ์์ง(์ํธํ ํฌํจ)
- ์ธ๋ฉ๋ชจ๋ฆฌ ์คํ ๋ฆฌ์ง ์์ง
- 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