본문 바로가기
Infra/MongoDB

MongoDB - (11) - 애플리케이션 설계(4)

by Inventer 2023. 4. 24.

연결된 포스팅이다 이전 글을 참고하라.

 

  1. 스키마 설계 고려 사항
  2. 데이터 embed 방식과 참조 방식 중 결정하기
  3. 최적화를 위한 팁  - (현재지점)
  4. 일관성 고려 사항
  5. 스키마 마이그레이션 방법
  6. 스키마 관리 방법
  7. 몽고 DB가 데이터 스토리지로 적합하지 않은경우

 

데이터 조작을 위한 최적화

애플리케이션을 최적화하려면 읽기와 쓰기 성능을 분석하여 어느 것이 병목을 일으키는지 먼저 판단해야한다.

 

읽기 최적화 : 올바른 인덱스를 사용하여 하나의 도큐먼트에서 최대한 많은 정보를 반환.

쓰기 최적화 : 보통 갖고 있는 인덱스 개수를 최소화하고 갱신을 가능한 한 효율적으로 수행

 

아주 강한 트레이드 오프를 갖고 있는 것이 느껴진다.

 

따라서 당신이 구현하고자 하는 애플리케이션의 Read Write비율을 미리 예측하고

이를 통해 Collection을 설계하는 것이 최선의 사용자 경험을 위한 방법일 것이다.

 

 

일관성 관리

애플리케이션은 지난 며칠간의 정확환 데이터가 필요할 수 있고,

혹은 반대로 실시간 거래를 수행한다면 최근 쓴 데이터에 즉각적으로 읽기를 수행할 수 있다.

 

이렇게 다양한 수준의 일관성을 얻는 방법을 이해하려면

몽고DB가 내부에서 무엇을 수행하는지 이해해야한다.

 

서버는 각 연결에 대한 요청 큐를 보관한다.

선입선출 방법이기에, 이전 요청을 전부 처리한 후 신규로 들어온 요청을 처리한다.

 

만약 셸을 두 개 열어서 작업한다면,

하나의 셸에서 삽입을 수행하면 다른 셸에서 발생하는 쿼리는 삽입된 도큐먼트를 반환하지 모샇ㄴ다.

 

그러나 단일 셸에서 삽입 작업 후에 쿼리하면 삽입된 도큐먼트가 반환된다.

 

이 동작은 손으로 복제하기 어려울 수 있지만 복잡한 서버에서는 교차 삽입 쿼리가 발생할 수 있다.

이러한 동작은 루비, 파이썬, 자바 드라이버를 사용할 때 염두해야하며

세 언어 모두 Connection Pooling을 사용하기 때문이다.

 

드라이버는 효율성을 위해 서버에 대한 연결을 열고 요청을 분산하기 때문이다.

자세한 내용은 여기에서 확인하자.

 

몽고 DB는 읽을 데이터의 일관성과 격리 속성을 제어하는 readConcern 옵션을 제공한다.

writeConcern과 결합하면 애플리케이션에 대한 일관성과 가용성을 보장할 수 있다.

 

 

스키마 마이그레이션

도큐먼트 버전 관리 패턴을 적용시킬 수 있는지를 고려해야한다는 것이다.

각 도큐먼트에 version 필드를 추가하여 관리하라.

 

스키마 관리

몽고 DB는 스키마 유효성 검사를 도입해 갱신 및 삽입 중에 유효성 검사를 허용한다.

기존 컬렉션에 유효성 검사를 추가하려면 validator 옵션과 함께 collMod 명령을,

새 컬렉션에 유효성 검사를 추가하려면 db.createCollection()을 사용할 때  validator 옵션을 사용하라.

 

몽고 DB는 validationLevel, validationAction 이라는 두 개의 옵션을 제공하는데,

위 중 level은 얼마나 엄격하게 유효성 검사 규칙을 적용할 것 인지,

Action은 비정상적인 도큐먼트를 오류와 함께 거절할지, 경고와 함께 허용할지를 결정한다.

 

몽고DB를 사용하지 않는 경우

관계형 데이터베이스의 이점인 "집합의 관계로서 스키마를 표현하고 JOIN 해야하는 경우"

몽고 DB보다 RDBMS를 쓰라고 권장한다.

 

댓글