ㅍㅍㅋㄷ

AWS DocumentDB(MongoDB) Replication 과 MongoEngine 설정 (Read Preference) 본문

IT/mongoDB

AWS DocumentDB(MongoDB) Replication 과 MongoEngine 설정 (Read Preference)

클쏭 2019. 5. 25. 18:04

 

 

DocumentDB 의 Replication

AWS DocumentDB 를 이용해 개발을 진행하면서, 

DocumentDB의 Replication 동작 방식을 테스트하며 몇가지 정리해 본다. 

 

DocumentDB의 Replication 은 기존 MongoDB의 Replica Set 과 동일한 구조를 갖고 있다.

따라서 기존 MongoDB 와 동일한 방식으로 이용 가능하고, SDK 또한 동일하게 사용 가능하다.

 

이번 포스팅에서는 AWS DocumentDB 사용시 Python SDK인 MongoEngine 에 대한 설정 방법과 

Read preference 설정 방법을 알아보려 한다.

 

Read Preference 란 무엇인가

Read Preference 란 MongoDB의 Replica Set 설정시 Primary 와 Seconday 노드에 대한 작업 처리 분산에 대한 설정이다. 

먼저 Replica Set 구조를 살펴보면, MySQL의 Replication 과 동일한 방식이다. 

 

모든 명령은 기본적으로 Primary 에서 처리하며 Secondary 는 Primary 에 기록된 데이터를 Sync 하며 유지하게 된다. 

[ MongoDB ReplicaSet ]

 

  하지만, 이러한 구조는 Client 가 Primary 하고만 데이터를 주고 받기 때문에 MongoDB 서버로 총 3대를 사용함에도 작업 분산 효과를 누리지 못하며, 오로지 Secondary 노드는 데이터 백업 용도로만 사용할 수 밖에 없다.

이러한 비효율적인 구조를 조금이나마 개선할 수 있는 방법으로, Read 작업에 대해서는 Secondary 에서 처리하도록 설정이 가능하다.

 

이것을 Read preference 라고 한다. 

Read preference는 5가지 방식을 지원하는데,

primary / primary preferred / secondary / secondary prefferred / nearest 가 있다.

각각에 대한 자세한 설명은 아래와 같다. 

 

 

 

1) primary

  

  모든 read 와 write 명령이 Primary 노드에서만 처리된다. 

  따로 read preference 설정을 하지 않았다면, primary 설정으로 처리된다. 

  모든 명령이 Primary 에서만 처리하기 때문에 부하 분산 효과는 없으며,  secondary 는 단지 백업 용도로 사용된다. 

 

  Multi-Document transaction 이 포함된 명령이 있는 경우는 primary 모드로만 사용 가능하다. 

 

2) primaryPreferred

 

  read 와 write 명령이 모두 Primary 에서 처리되는 점에서 1번의 primary 모드와 동일하다.

  하지만, primary 가 unavailable 상태인 경우, read 명령을 secondary 쪽으로 전달하여 처리한다. 

  primary 가 장애 날 경우, write 명령은 동작하지 않지만 read 명령은 secondary 에서 동작 할 것이므로 primary 모드 보다는 service availability 가 조금 더 개선된 형태라고 보면 된다. 

 

3) secondary

 

  모든 read 명령은 secondary 로 보내 처리하는 형태이다. 

  primary 의 경우 write 작업만 처리 하고 secondary 에서 모든 read 명령을 처리하므로 부하 분산 효과가 있다.

  하지만, primary 와 secondary 의 데이터는 asynchronous 하기 때문에 사용상 주의해야 한다. 

 

[ Secondary read reference ]

 

4) secondaryPreferred

 

  모든 read 명령은 secondary 로 보내 처리되는 점은 3번의 secondary 모드와 동일하다.

  하지만, secondary 멤버들이 모두 unvailable 한 경우 read 명령을 primary 로 넘겨 처리하게 된다. 

  secondary 모드 보다는 service availability 가 조금 더 개선된 형태라고 보면 된다. 

 

5) nearest

 

  read 명령의 경우 primary / secondary 상관없이 network latency 가 가장 적은 인스턴스로 보내 처리하는 방식이다. 

  write 명령은 다른 모드와 동일하게 primary 에서 처리한다. 

  network latency 는 maxStalenessSeconds 의 설정 값을 확인하여 예상 지연값보다 해당 값이 큰 노드를 제외하고 나머지 노드 중 random 하게  지정하게 read 명령을 처리하게 된다. 

 

 

 

MongoEngine 에서 read preference 설정

 아래 예제는 MongoEngine SDK 사용시, read preference 모드 중 secondary preferred 로 설정한 예이다. 

 DocumentDB 의 경우 replicaset 의 이름이 'rs0' 로 설정된다. 

# Add import read_preferences module
from mongoengine import *
from pymongo.read_preferences import ReadPreference

ssl_config = {
    'ssl': True,
    'ssl_ca_certs': 'rds-combined-ca-bundle.pem'
}

connect(
    'test',
    username='',
    password='',
    host='',
    port=27017,
    replicaset='rs0',                                       # Set replicatset
    read_preference=ReadPreference.SECONDARY_PREFERRED,     # Set read_preference options
    **ssl_config
)

 

read_preference 로 설정가능한 FLAG는 아래와 같다.

PRIMARY

PRIMARY_PREFERRED

SECONDARY

SECONDARY_PREFERRED

NEAREST

 

 

 

Reference 

 - https://docs.mongodb.com/manual/reference/read-preference/

 

 

Comments