
MongoDB Read/Write Traffic 분산하기
2021년 5월 MongoDB 관련 이슈 해결 과정을 적어봅니다. 문제점 한국그린데이터에서는 MongDB Atlas를 이용 중입니다. Dev, Prod DB를 두고 Dev 개발 환경에서 필요한 데이터를 Prod DB로 부터 주기적으로 Data dump해오고 있습니다. 그런데 Data dump 주기 마다 API 호출이 느려지는 현상을 격게 되었습니다. 그래서 MongoDB Atlas에서 Query metric을 확인해 보니, Secondary Node에는 전혀 traffic이 안가고 Primary에서 모든 것을 처리하고있었습니다. Mongo DB를 Read, Write DB를 나눠서 관리 해야됩니다. 일반적으로 Read 보다 Write가 더 많은 리소스를 차지 하는데, 이것을 분리해서 관리할 경우 Write로 인해 리소스 부족이 발생하지 않아 Read를 보다 쾌적하게 이용할 수있습니다. 해결 과정 CQRS 개념 확인 → 지금 우리가 원하는게아니었습니다. 우리가 원하는 건 단순 Read / Write 트래픽분산입니다. 예전 RDS로 개발 시에는 Read / Write DB 설정을 별도로 해서사용했었습니다. NestJS, NodeJS에서 MongoDB Read / Write 트래픽 분산으로 검색 해봤습니다. Read Preference 가 나오긴 했지만, 개념이 잘 이해가 안가서 우선은넘겼습니다. 몽고 디비 인 액션 p.363에 있는 복제 세트 (Replica Set) 관련 내용을 보면서 개념을이했습니다. 책에서도 결국 말하고 있는게 Read Preference 설정으로 할 수 있다는 내용이 쓰여있었습니다. Replica Set 구성방법 Primary, 2 Secondary (MongoDB Atlas에서 제공하는방식) Primary, Secondary, Arbiter Read Preference (읽기선호도) primary 기본 설정. 유일하게 일관성이 보장됨 모든 Read 작업을 Primary에서 실행 Read 작업을 포함하는 multi-document 트랜잭션의 경우 반드시 Primary 설정으로 해야 됩니다. 그래야 모든 작업이 동일한 노드의 데이터로 작업할 수있습니다. primaryPreferred 대부분의 경우에는 Primary에서 Read 작업을 진행하고, 이용이 불가능한 경우에만 Secondary에서 진행합니다. secondary 모든 Read 작업을 Secondary에서 실행 secondaryPreferred 대부분의 경우에는 Secondary에서 Read 작업을 진행하고, 이용이 불가능한 경우에는 Primary 에서진행합니다. nearest Primary, Seconday 상관 없이 지정한 latency threshold에 부합한 곳에서 Read 작업을실행 해결책 기본적으로 Replica Set을 구성할 때 최소 3개의 노드가필요합니다. MongoDB Atlas에서는 Primary, 2 Secondary를 사용중입니다. Primary는 Read/Write 모두 가능, Secondary는 Read만가능합니다. mongodb+srv로 시작하는 주소를 주면 알아서 Replica Set 전체에 대한 정보를 주고, 거기에서 Primary, Secondary를 구분해서 Read/Write를 실행합니다. readPreference 설정을 통해서 Primary는 Write만 하고 Secondary는 Read만 하게 할 수있습니다. 코드에 적용 우리가 원하는 secondaryPreferred 였습니다. mongoose를 이용하여 해당 설정을적용했습니다. /** * Mongoose 설정 */ export const options: MongooseModuleOptions = ( readPreference: 'secondaryPreferred' ) 적용 결과 Primary의 경우 적용, DB를 사용하는 모든 서비스에 해당 설정을 적용하지 않아서 확연한 차이는 볼 수없습니다. Secondary의 경우는 적용 전에는 전혀 없던 Query 요청이 적용 후에는 발생하고 있는 것을 볼 수있습니다. 이것을 적용한 덕분에 Write 작업이 Read 작업에 전혀 영향을 주지 않게되었습니다. 참고 https://docs.mongodb.com/manual/replication/ https://docs.mongodb.com/manual/core/read-preference/ https://docs.mongodb.com/manual/core/read-preference-mechanics/#replica-set-read-preference-behavior https://github.com/Automattic/mongoose/issues/4670 MongoDB Read/Write Traffic 분산하기 was originally published in GreenDataKR on Medium, where people are continuing the conversation by highlighting and responding to this story.
