MongoDB 트랜잭션

MongoDB (version : 4.2) 트랜잭션에 관하여 정리합니다.

MongoDB는 기본적으로 분산된 환경을 전제로 하기 때문에,
읽기 / 쓰기 작업에 필요한 데이터 동기화 수준을 설정할 수 있다.



분산 트랜잭션 (Distributed Transaction)

  • MongoDB 4.0 부터 다중 도큐먼트 트랜잭션에 대한 트랜잭션 지원
  • MongoDB 4.2 부터 Sharded Cluster에 대한 트랜잭션 지원
    (4.2버전부터 분산 트랜잭션과 다중 도큐먼트 트랜잭션은 동일한 의미로 사용됨)
  • 분산 트랜잭션을 이용하면 multiple operations, collections, databases, documents, shards에 대해 트랜잭션을 사용할 수 있다.
  • MongoDB Driver에서 4.2버전에 대한 업데이트가 적용되어야 한다.
  • 매 트랜잭션에 session 정보를 추가하여 트랜잭션에 대한 정보를 제공해야 한다.
  • multiple shards 에 쓰기작업을 하는 경우, 각 샤드에서 읽기 작업의 결과는 다를 수 있다.
  • 분산 트랜잭션은 단일 도큐먼트에 쓰기 작업보다 큰 비용을 동반한다.
    따라서 비정규화를 통한 효율적인 스키마를 구축하는게 우선이다.



Read Preference

  • 설정에 따라 Primary 또는 Secondary 노드에서 읽기 작업을 수행할 수 있다.
  • client-level 기본 설정은 Primary 노드로 읽기 작업을 전달한다.
    transaction-level read preference 가 설정되지 않으면, 트랜잭션은 session-level read preference를 사용한다.
    session-level read preference가 설정되지 않으면, 트랜잭션은 client-level read preference를 사용한다.
  • Primary 노드가 아닌 곳에서의 읽기 작업은 최신 데이터를 반영하지 못할 수 있다. (stale data)
    (MongoDB는 replica set으로의 데이터 sync를 비동기 방식으로 맞추기 때문)
  • primary, primaryPreferred, secondary, secondaryPreferred, nearest 같은 설정이 있다.



Read Concern

  • 여러 relica set 중에서 어떤 곳에서 데이터를 읽을 지 정할 수 있다.
  • 트랜잭션 내의 operations는 transaction-level read concern 을 사용한다.
  • 해당 값이 설정되지 않으면 transaction-level → session-level → client-level 의 우선 순위에 따라 설정된다.
  • client-level read concern의 기본 설정은 “local” 이다.
    (가장 최근 데이터를 가진 노드에서 읽기 작업을 수행한다. 이 데이터는 롤백이 될 가능성이 있다.)
  • local, majority, snapshot 과 같은 설정이 있다.
  • multiple shards에서 읽기 일관성을 원한다면 read concern snapshot을 사용해야 한다.
    latency가 중요한 애플리케이션의 경우에는 local 설정을 추천한다.



Write Concern

  • 쓰기 작업을 수행할 때 사용자 요청에 대한 응답을 반환하는 시점을 결정하는 옵션이다.
  • 트랜잭션은 쓰기 작업 commit 할 때, write concern을 사용한다.
  • 트랜잭션이 시작할 때, write concern을 설정할 수 있다.
  • transaction-level → session-level → client-level 우선순위로 적용된다.
  • w: 1, w: “majority” 같은 설정이 있다.
  • MongoDB 에서 write conflict 가 발생하면 (변경하려는 도큐먼트가 이미 Lock 걸린 상황), 즉시 업데이트 명령을 취소합니다. 이후 세션은 write 작업을 다시 시도하기 때문에 애플리케이션 단에서는 재시도 했는지 여부를 알 수 없다.
    재시도가 많아지면 CPU 사용량이 높아지고 DB 성능 저하가 발생한다.




※ 참고

MongoDB 4.2 공식문서
MongoDB Trasnaction Management 블로그

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Create your website with WordPress.com
Get started
%d bloggers like this: