개발과 기록의 조화

[MongoDB] 읽기 고려 (Read Concern) 본문

Database/MongoDB

[MongoDB] 읽기 고려 (Read Concern)

dlaudtjr03 2020. 2. 3. 15:48

해당 게시물은 학습 및 기록 목적으로 작성되었습니다. 사실과 다른 내용이 있을 수 있으며, 오류가 있거나 궁금한 점은 댓글이나 dlaudtjr07@gmail.com 으로 메일 주시면 감사하겠습니다.

 


읽기 고려(Read Concern)

읽기 고려(Read Concern)는 특정 개수 이상의 Replication (복제 : Slave) 에서 요청하는 데이터를 가지고 있어야 해당 데이터가 존재한다고 인정한 후에 읽기 기능을 제공하는 옵션입니다.

 

Option 설명
local

Replica set에 대한 읽기가 정상적으로 수행되었는지의 여부를 판단하지 않고 그대로 데이터를 리턴(롤백 될 수  있음)

Default : Primary 클러스터에 대한 읽기 작업 및 인과적 일관성에 의해 종속되어져 있는 Secondary 클러스터들에 대한 읽기 작업

available

기본적으로 local과 기능은 동일하지만, 샤딩 된 클러스터에 대한 읽기 작업인 경우 사용

majority 다중 문서 트랜잭션을 제외한 읽기 작업에 한해, 과반수의 Replica set들이 데이터를 읽는것을 허용함을 보장하는 옵션
linearizable

majority 옵션의 기능과 유사

Replica set에 쓰기 작업이 끝날때 가지 기다리고 난 후 읽기 데이터를 반환함

snapshot

다중 문서 트랜잭션 환경에서 사용 가능

local

말 그대로 local에서 사용할 때에 주로 사용됩니다. Replica set에 있는 데이터가 정상적으로 읽어졌는지에 대한 여부는 알 수 없습니다. 

 

available 

보통 샤딩된 클러스터는 위 local 옵션과 같이 인과적 일관성에 의해 순차적으로 데이터가 입력되기 위한 대기 시간이 필요 없습니다. 즉, 업데이트 된 메타데이터에 대한 샤드의 primary 클러스터나 구성 서버에 연결하지 않습니다. 하지만 샤드 클러스터에서 Chunk Migration이 진행 중일 때 읽기 작업을 수행한다면 Orphaned Document가 생성될 위험이 있습니다.

 

majority

해당 데이터가 들어가 있는 Replica set 중 과반수의 Replica set들이 데이터를 읽는 것을 허용해야만 해당 데이터 정보를 반환하는 옵션입니다. 

다중 문서 트랜잭션의 경우에는 '쓰기 고려의 majority' 트랜잭션 커밋의 읽기 기능만을 제공하고 , 다른 트랜잭션 작업 내부에서 읽은 데이터에 대해서는 보장하지 않습니다. (MongoDB는 단일 문서 단위의 트랜잭션만 지원되기 때문에, 여러 명령을 하나의 트랜잭션으로 묶어서 사용할 수 없습니다)

majority 옵션은 Replica set에서 진행중인 쓰기 작업과 관련없이 데이터를 바로 반환합니다. 성능상 유리한 이점이 있지만, 쓰기 작업 이전의 데이터를 반환할 수도 있는 단점이 따릅니다. 

 

linearizable

읽기 데이터를 반환 전에 Replica set에 쓰기 작업이 진행 중이라면, 해당 작업이 끝날 때까지 대기 후 결과 값을 반환합니다. 이는 곧 성능과 직결되는데, majority 옵션은 쓰기 작업과 관련없이 데이터를 바로 반환하는 반면, linearizable 옵션은 쓰기 작업 완료 후 데이터를 반환하므로 상대적으로 성능이 느립니다.

 

snapshot

인과적 일관성과 관련 없는 트랜잭션의 경우

 

에는 쓰기 고려의 트랜잭션 커밋 작업은 과반수 커밋된 데이터 스냅샷에서 읽도록 보장합니다.

 

인과적 일관성과 관련된 트랜잭션의 경우

 

에는 쓰기 고려의 트랜잭션 커밋 작업은 트랜잭션 시작 직전의 인과적 일과성을 제공하는 과반수 커밋된 데이터 스냅샷에서 읽도록 보장합니다.

 


 

해당 글은 코드프레소 DevOps Roasting 코스를 수강하면서 작성한 글입니다.

 

Comments