1년 전 MongoDB 4.0 에서 복제셋(ReplicaSet) 내에서 트랜잭션을 지원하기 시작했습니다. MongoDB 4.2이에서는 해당기능을 샤딩(Sharding) 까지 확장했으며 이를 통해 MongoDB를 활용한 개발을 더욱 쉽게 만들었습니다. 스냅샷 격리(Snapshot Isolation), 쓰기에 대한 원자성 ( Write Atomicity ) 그리고 분산 커밋( Distributed Commit) 을 다룰 예정이며 , 분산 트랜잭션을 운영 업무에 적용하기 위해 필요한 모든 것을 배우게 될 것입니다.
4. 트랜잭션을 지원함으로써 개발이 쉬워집니다.
트랜잭션 상태에 대해 개발자가 걱정할 필요가 없음
단일 명령문이 실패할 경우 Rollback/Abort 가 자동 처리
읽기와 쓰기의 특정 시점에서 일관성 유지
5. def insertDocuments(s):
s.client.db.col.insert_one({'abc': 1}, session=s)
s.client.db.col.insert_one({'xyz': 999}, session=s)
with client.start_session() as s:
s.with_transaction(insertDocuments);
New API MongoDB 4.2!
New in MongoDB 4.2 - Cross Shard Transactions
12. 기존 JSON 기반으로 한 모델링은 여전히 유효
트랜잭션은 가장 일반적으로 많이 쓰는 작업이 아니어야 함
세션을 통해 모든 명령문을 실행하여야함
트랜잭션은 항상 중단 가능하므로 재시도 로직을 구현 하여야함
불필요한 스냅샷을 열어 두면 안됨
쓰기 작업 충돌을 처리하기 위해선 반드시 같은 Doucment 에 대해 쓰기 작업을 수행하고
있어야 함
DDL 은 현재 지원되지 않음
21. READ CONCERN = READ ISOLATION
Options: LOCAL, MAJORITY,
SNAPSHOT, LINEARIZABLE
흥미로운 점: ReadConcern Majority는
조회 결과를 가지고 오기 위해
노드간에 조정(Cooridnate) 를 할 필요가 없다.
25. 쓰기
트랜잭션 내부
쓰기 작업은 Document 에 대핸 변경을 시도할때 잠금 획득을 시도한다.
잠금 획득을 성공 못했을 경우 해당 작업은 취소되며 롤백 된다.
트랜잭션 외부
쓰기 작업이 잠금 획득을 시도 하는데 실패하면 exponential back off 를 사용하여 다시 시도 한다.
26. 읽기
쓰기 작업만 잠금 획득을 시도한다.
읽기 전용 트랜잭션이 수행되는 동안, 다른 트랜잭션이 Document 수정을 하게 되면 Stale
Read 가 가능해짐
Document 변경에 대한 트랜잭션이 실패하려면 동일한 Document 수정하고 있어야 한다.
29. 그렇다고 해서 대량의 트랜잭션이
무한정 가능한 것은 아닙니다.
WiredTiger 는 스냅샷 이후에도 여전히 이력을 유지해야 합니다.
트랜잭션은 트랜잭션 수행시간 동안 동일한 스냅샷을 생성합니다.
트랜잭션은 60초 이후에 자동으로 중단 됩니다. – 변경가능
transactionLifetimeLimitSeconds
30. 변경 가능한 샤드키 값
계층화된 스토리지: 저비용 스토리지 샤드에 오래된 Document 를 저장
글로벌-재분산 : Document 를 다른 지역으로 옮김
31. MongoDB 4.2 드라이버 사용
단일 샤드를 대상으로 하는 트랜잭션은 여러 샤드에 걸친 트랜잭션 보다
빠르게 수행됨
Best practice: 하나의 트랜잭션에 1,000 이하의 Document 를 수정
Arbiter 없음
청크 마이그레이션은 트랜잭션이 일어나는 동안 중지되어 트랜잭션이
끝난 이후 실행됨
Parting Wisdom
32. 무료 ▪ 온라인 ▪ 9의 챕터로 구성
지금 등록 하십시오! -
https://university.mongodb.com/courses/M042/about