[Spring Boot] DB Read-Write 분리(AWS RDS Aurora DB)

Soomin Kim·2022년 3월 30일
1

Spring Boot Project

목록 보기
2/2

☝🏼Why?

대용량 처리를 위한 서비스 구성

Client가 늘어날 경우 웹 서버나 DB서버에서 병목현상이 발생할 수 있으므로, 병목 지점별로 해결 방안 필요

Web 서버 확장

  • Web 서버가 stateless한 구조일 경우 다수의 Web 서버를 두어 부하 분산 시킬 수 있음

stateless: 서버 쪽에 client 와 server의 연속된 동작 상태정보를 저장하지 않는 형태

DB 확장

성능향상을 위한 Scale Up, Scale Out

  • Scale Up: 장비의 성능을 높여 성능향상
  • Scale Out: 장비의 개수를 늘려 성능 향상

DB Read/Write 분리, 분산

대부분의 서비스는 Read > Write (7:3, 8:2)

Master : Write
Slave 1,2,3 : Read

  • 1번서버 장애시 2번서버는 서비스를 하며 3번 서버는 서비스를 중단하고 1번서버 복구를 위한 DB복사를 진행
  • 서비스중인 DB에서 복사시 부하가 가중되므로 여분의 DB가 필요

Read/Write DB 분기 방식

  • DBProxy 서버를 이용
    - 프록시 서버가 쿼리를 분석하여 select시에는 read서버, 그 외에는 master 서버로 분기
    • MySQL Proxy, MaxScale ...
  • MySQL Replication JDBC Driver 사용
    - JDBC Driver상에서 내부적으로 readonly 옵션에 따라 Master/Slave 장비를 선택
    • 여러 문제점들이 도출되어 사용 안하는 걸 권장
  • Spring LazyConnectionDataSourceProxy + AbstractRoutingDataSource 사용
    - Spring에서 Transaction readonly 옵션을 사용하여 분기
    • AbstractRoutingDataSource: 여러 개의 DataSource를 하나로 묶고 자동 분기처리
    • LazyConnectionDataSourceProxy: 트랜잭션 시작되더라도 실제 커넥션이 필요한 경우에 데이터소스에 커넥션 반환


출처: 오라클

✌🏼How?

Master-Slave 구조
Transaction의 속성이 readOnly = true인 경우 Slave 데이터베이스에 Select query가 발생하게 해야 함.

따라서,
1. @Transactional(readOnly=true)인 경우는 Slave DB 접근
2. @Transactional(readOnly=false)인 경우는 Master DB 접근

조건 만족하면 됨

Spring transaction routing

read-write transaction - Primary node에 라우팅 : Primary Node에 연결되는 ReadWriteDataSource 정의
read-only transaction - Replica node에 라우팅 : Replica Node에 연결되는 ReadOnlyDataSource 정의

DataSource는
1. DB와의 연결을 위한 Factory의 역할로, Connection을 맺어주는 역할이다
2. Connection 객체를 생성하면 관리는 Connection Manager에게 위임한다
3. Transaction 관리자와 함께 활용되어 Transaction들을 처리한다

다양한 진입점을 통해 하나의 데이터베이스에 접근한다면 데이터베이스에 대한 부하가 점점 늘어남
-> 해결책: 트랜잭션 분리!!!

DataSource는 DB와의 연결을 맺어주고, DataSource Manager, Transaction Manager에게 위임하여 연결과 트랜잭션을 처리하는데,
이때 전략을 잘 짜서 활용하면 DataSource를 다양하게 맺어보고 Routing하는 전략을 통해 부하에 대한 분산을 실시할수있게됨
-> Spring에서 이미 제시해주고 있음

Aurora DB

: MySQL 및 PostgreSQL과 호환되는 완전 관리형 관계형 데이터베이스 엔진

  • Auto FailOver
  • 성능향상
  • 짧은 복제 지연
  • 무한 스토리지 (64TB)

구조

생성

Spring Boot 실습

  • Java
  • Gradle
  • MyBatis
  • AWS RDS Aurora DB

Q. Read write 분리할 경우 싱크 불일치 이슈 어떻게 해결?
A. Write 인스턴스에 쓰기 작업이 발생되면 수 초 이내로 read 인스턴스에 반영 됨.
write 인스턴스에 쓰기작업이 진행되고 read 인스턴스에 반영되기전 까지의 걸리는 시간이 매우 짧기 때문에 실시간성으로 이뤄짐.

출처
https://jsonobject.tistory.com/586
https://vladmihalcea.com/read-write-read-only-transaction-routing-spring/

https://jistol.github.io/architecture/2017/02/14/architecture-traffic-issue/

https://huisam.tistory.com/entry/routingDataSource

profile
개발자지망생

1개의 댓글

comment-user-thumbnail
2022년 8월 24일

구글링을 통해 잘 읽고 갑니다. 근데, 마지막에 Amazon aurora RDS 에서는 read-write Split 를 하셨나요? 궁금하네요. ^^
애플리케이션 레벨에서 분린를 하셨는지, 아니면 Amazon 에서 제공하는 proxy 를 통홰 하셨는지 아니면 이외의 방법으로 하셨는지 궁금하네요

답글 달기