회사에서 운영 중인 서비스의 Main Database를 AWS Document로 사용 중인데, 한 가지 문제가 발생하였다.
Read Prefrence를 AWS의 권장 설정 사항인 secondaryPreferred로 설정할 경우
쓰기는 기본 인스턴스(Primary)에 읽기는 복제본(Secondary)에 수행하도록 구성되어있다.
여기서 문제 발생하는데, Primary에 작성된 데이터가 실제 Replica들에 반영되는데 시간이 소요되어 아래 이미지와 같은 현상이 존재한다는 것이다.
물론 AWS에서 어느 정도 지연 속도를 보장해준다고 하지만 이를 위해 억지로 Delay를 넣어줄 수는 없는 노릇이라,
(확실하지는 않으나 100ms ~ 300ms 정도 보장해준다는 가이드를 본 것 같다.)
실제 서비스에서 이것때문에 이슈들이 하나 둘 씩 발생하기 시작했다.
Document DB와 호환되는 Mongo DB의 경우, Wirte Concern 설정을 DB 혹은 연결 Client에서 option을 수정하여 처리할 수 있는 듯 하지만, 실제 환경에서 테스트 및 아래 AWS 가이드를 뒤져본 결과,
AWS Document DB는 해당 설정을 변경하는 것을 허용하지 않는다고 한다...
(어떤 블로그에서 되는거마냥 글을 써놔서 3일동안 삽질을 엄청나게 했다 ㅡㅡ;; 이것이 직접 글을 쓰게된 계기..)
Amazon DocumentDB: How It Works - Amazon DocumentDB
With Amazon DocumentDB 3.6, storage costs are based on the storage "high water mark" (the maximum amount that was allocated for the Amazon DocumentDB cluster at any point in time). You can manage costs by avoiding ETL practices that create large volumes of
docs.aws.amazon.com
그래서 AWS 가이드와 StackOverflow를 뒤져가며 Research한 결과,
총 2가지 방안을 이 존재하는 것으로 보인다.
(AWS Document DB가 잘 안팔리는지 관련 문서나 질문이 잘 보이지 않는다..)
Write 즉시 수정된 내용을 Return 받기
이 방법은 Craete, Update 수행 시만 가능하며, 또 Single Result인 경우에만 가능한 방법이다.
아래와 같이 Update 수행 이후에 변경된 데이터를 받아오도록 Options 값을 넣어 Primary Instance에서 바로 조회해올 수 있다.
opts := options.FindOneAndUpdate().SetReturnDocument(options.After)
res := col.FindOneAndUpdate(ctx, bson.D{{"_id", _id}}, bson.D{{operator, bson.D{{"field", data}}}}, opts)
data := &Data{}
if err := res.Decode(data); err != nil {
return nil, err
}
(현재 필자는 go 개발 환경에서 설정한 설정 값이니 참고 바란다.)
다만 이 방법은, 위에 말했듯이 CRUD의 CU만 가능하며, UpdateMany, InsertMany와 같은 경우에도 사용이 불가한 듯 하니 참고 바란다.
(하지만, AWS의 권장 설정을 바꾸지 않고 사용할 수 있다는게 장점...)
Secondary가 아닌 Primary에서 Read 처리
말 그대로 설정되있는 Read preference를 변경하는 방법이다!
AWS에서는 primary, primaryPreferred, secondary, secondaryPreferred, nearest 이렇게 4가지를 지원하는데,
읽기 일관성을 우선시 하도록 primary 혹은 primaryPrefrred로 변경해주면 된다.
하지만 이는 AWS 권장 사항에 맞지 않는 방법이므로 (권장사항은 secondaryPreferred이다.),
읽기 일관성이 필요한 시나리오에만 해당 옵션을 적용시켜주는 것이 좋다.
(기본 client는 secondaryPreferred를 사용하고, 문제가 되는 부분만 primary 혹은 primaryPreferred를 사용)
아래 문서를 참고하면 좋다.
복제본 세트로 Amazon DocumentDB에 연결 - Amazon DocumentDB
large, xlarge 및 2xlarge 인스턴스에 대한 연결 수는 인스턴스 크기가 4,500개가 될 때까지 증가합니다. 4xlarge 인스턴스 이상의 경우 인스턴스당 최대 연결 수는 4,500개입니다. 인스턴스 유형별 제한에
docs.aws.amazon.com
혹시 관련 내용에 바르게 이해하지 못하여 곡해된 내용이 있다면 얼마든지 피드백 부탁드립니다!
'DB' 카테고리의 다른 글
Maria DB 프로시저 생성, 이벤트 스케줄러 등록(create procedure, event) (0) | 2021.07.23 |
---|---|
DB별 JDBC URL, Driver (0) | 2020.06.18 |