Client가 늘어날 경우 웹 서버나 DB서버에서 병목현상이 발생할 수 있으므로, 병목 지점별로 해결 방안 필요
stateless: 서버 쪽에 client 와 server의 연속된 동작 상태정보를 저장하지 않는 형태
성능향상을 위한 Scale Up, Scale Out
대부분의 서비스는 Read > Write (7:3, 8:2)
Master : Write
Slave 1,2,3 : Read
출처: 오라클
Master-Slave 구조
Transaction의 속성이 readOnly = true인 경우 Slave 데이터베이스에 Select query가 발생하게 해야 함.
따라서,
1. @Transactional(readOnly=true)인 경우는 Slave DB 접근
2. @Transactional(readOnly=false)인 경우는 Master DB 접근
조건 만족하면 됨
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에서 이미 제시해주고 있음
: MySQL 및 PostgreSQL과 호환되는 완전 관리형 관계형 데이터베이스 엔진
구조
생성
Spring Boot 실습
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/
구글링을 통해 잘 읽고 갑니다. 근데, 마지막에 Amazon aurora RDS 에서는 read-write Split 를 하셨나요? 궁금하네요. ^^
애플리케이션 레벨에서 분린를 하셨는지, 아니면 Amazon 에서 제공하는 proxy 를 통홰 하셨는지 아니면 이외의 방법으로 하셨는지 궁금하네요