몽고DB

From CS Wiki
Revision as of 16:47, 11 September 2024 by 파네라 (talk | contribs) (새 문서: '''MongoDB''' MongoDB는 NoSQL 데이터베이스로, 데이터를 문서(Document) 형태로 저장하는 비관계형 데이터베이스다. BSON(Binary JSON) 형식으로 데이터를 저장하며, 스키마가 고정되어 있지 않고 유연하게 데이터를 다룰 수 있다. == MongoDB의 역사 == 2007년에 10gen이라는 회사에서 처음 개발되었고, 2009년에 공개되었다. 이후 MongoDB Inc.로 사명을 바꾸고, 계속해서 성능과 기능을 개...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

MongoDB

MongoDB는 NoSQL 데이터베이스로, 데이터를 문서(Document) 형태로 저장하는 비관계형 데이터베이스다. BSON(Binary JSON) 형식으로 데이터를 저장하며, 스키마가 고정되어 있지 않고 유연하게 데이터를 다룰 수 있다.

MongoDB의 역사

2007년에 10gen이라는 회사에서 처음 개발되었고, 2009년에 공개되었다. 이후 MongoDB Inc.로 사명을 바꾸고, 계속해서 성능과 기능을 개선해왔다. MongoDB는 현재 클라우드 기반 데이터베이스 서비스인 MongoDB Atlas도 제공한다.

MongoDB의 특징

  1. 스키마 유연성: 데이터가 문서 기반으로 저장되기 때문에 스키마가 유연하여, 구조가 다른 데이터를 같은 컬렉션에 저장할 수 있습니다.
  2. 수평적 확장성: MongoDB는 샤딩을 통해 데이터베이스를 여러 서버에 분산하여 처리할 수 있습니다.
  3. 고성능: 대규모 데이터 처리와 고속 쓰기/읽기 성능을 제공합니다.
  4. BSON 형식: JSON과 유사한 바이너리 포맷을 사용해 데이터 크기를 줄이고, 다양한 데이터 타입을 지원합니다.
  5. 풍부한 쿼리 기능: 복잡한 쿼리를 지원하며, 인덱싱 및 집계 기능을 통해 효율적으로 데이터를 조회할 수 있습니다.
  6. 복제 및 고가용성: MongoDB는 복제를 통해 데이터의 가용성과 내구성을 보장합니다.

MongoDB 데이터 구조

  1. 데이터 저장 형태: MongoDB는 데이터를 BSON 포맷으로 저장하고, JSON 형태로 조회할 수 있어 직관적이다. 예를 들어, e-커머스 애플리케이션에서 제품 정보를 { "name": "Laptop", "price": 1200, "specs": {"cpu": "i7", "ram": "16GB"} } 형태로 저장할 수 있다.
  2. 쿼리 예시: MongoDB는 복잡한 쿼리를 지원한다. 예를 들어, 사용자의 주문 내역을 필터링할 때 db.orders.find({ "user_id": 12345, "status": "delivered" })와 같은 쿼리로 데이터를 조회할 수 있다.

샤딩

MongoDB의 샤딩은 데이터베이스가 커지면서 한 서버에 데이터를 모두 저장하기 어려운 경우, 데이터를 여러 서버(샤드)로 분산 저장하는 방법이다. 샤딩을 통해 MongoDB는 수평적 확장을 가능하게 하며, 대규모 데이터를 처리하는 애플리케이션에서 성능을 유지하는 데 유리하다. 예를 들어, 대규모 온라인 상거래 시스템에서 `order_id` 필드를 샤드 키로 설정해 주문 데이터를 분산시킬 수 있다. 고객이 주문을 할 때, Mongos가 적절한 샤드에 주문 데이터를 저장하고, 나중에 그 데이터를 조회할 때도 빠르게 해당 샤드로 접근해 결과를 가져올 수 있다.

MongoDB의 샤딩은 대규모 데이터를 처리하는 시스템에서 필수적인 기능이지만, 샤드 키와 클러스터 구성을 잘못 설정하면 성능이 떨어질 수 있으니 신중한 설계가 필요하다.

샤딩의 주요 개념

  • 샤드(Shard)  
    • 각 샤드는 데이터의 일부를 저장하는 독립적인 MongoDB 서버다. 샤드는 서로 다른 데이터를 저장하며, 각 샤드는 자신이 처리할 데이터에만 책임이 있다. 이는 수평적 확장을 가능하게 하며, 데이터가 늘어남에 따라 새로운 샤드를 추가할 수 있다.
  • 샤드 키(Shard Key)
    • 데이터를 여러 샤드에 나눠 저장하기 위해서는 기준이 필요하다. 이 기준이 되는 것이 바로 샤드 키이다. 샤드 키는 컬렉션 내의 특정 필드로, MongoDB는 이 키를 기준으로 데이터를 분산시킨다. 샤드 키를 잘못 선택하면 데이터가 고르게 분산되지 않아 성능 저하가 발생할 수 있다.  
      • 예를 들어, `user_id` 같은 필드를 샤드 키로 사용하면 사용자가 고르게 분산될 수 있지만, 날짜 필드를 샤드 키로 사용하면 특정 날짜에 쏠림 현상이 발생할 수 있다.
  • Config 서버
    • 샤딩을 관리하는 데 필요한 메타데이터(샤드 구성, 샤드 키 등)를 저장하고, 클러스터의 상태를 관리하는 서버다. Config 서버는 샤드의 위치와 데이터를 어떻게 분배할지에 대한 정보를 저장하며, 클러스터에 필수적인 요소다.
  • 몽고스(Mongos)  
    • Mongos는 샤드 클러스터에서의 라우터 역할을 한다. 클라이언트는 Mongos를 통해 데이터베이스에 접근하며, Mongos는 적절한 샤드로 요청을 라우팅한다. 클라이언트는 MongoDB가 샤딩되어 있다는 것을 알 필요 없이, Mongos가 데이터 요청을 각 샤드에 전달하고 결과를 취합한다.

샤딩의 장점

  • 수평적 확장
    • 데이터나 트래픽이 많아질 경우, 더 많은 샤드를 추가하여 데이터베이스의 크기나 처리 능력을 확장할 수 있다. 이는 서버 성능을 개선할 수 있는 경제적 방법이다.
  • 성능 향상
    • 여러 서버에 데이터가 분산되므로, 한 서버에서 처리할 데이터 양이 줄어들어 성능이 향상된다. 샤딩을 통해 읽기/쓰기 작업이 병렬로 처리되며, 큰 쿼리도 여러 샤드에 분산되어 더 빠르게 처리될 수 있다.
  • 높은 가용성  
    • 샤딩과 복제를 함께 사용할 경우, 데이터 손실 위험이 줄어들고 가용성이 향상된다. 샤드 중 하나에 장애가 발생해도 다른 샤드들이 계속 작동할 수 있다.

샤드 키 선택 시 고려 사항

  • 균형된 데이터 분배  
    • 샤드 키는 데이터가 고르게 분산될 수 있도록 설계해야 한다. 특정 샤드에 데이터가 몰리면 그 샤드가 과부하가 걸리며 성능이 저하된다.
  • 쿼리 효율성  
    • 샤드 키는 자주 사용되는 쿼리에 영향을 줄 수 있다. 예를 들어, 특정 필드에 대해 자주 검색하는 경우, 그 필드를 샤드 키로 사용하면 검색 속도가 빨라질 수 있다. 그러나 적절하지 않은 샤드 키는 쿼리 성능을 저하시킬 수 있다.