Skip to content

리플리케이션 적용#49

Open
Ho-Tea wants to merge 7 commits intodevelopfrom
feature/48-리플리케이션

Hidden character warning

The head ref may contain hidden characters: "feature/48-\ub9ac\ud50c\ub9ac\ucf00\uc774\uc158"
Open

리플리케이션 적용#49
Ho-Tea wants to merge 7 commits intodevelopfrom
feature/48-리플리케이션

Conversation

@Ho-Tea
Copy link
Copy Markdown
Contributor

@Ho-Tea Ho-Tea commented Dec 31, 2023

🎯 What is this PR

Master/Slave구조의 리플리케이션 적용

리플리케이션을 적용하는 이유 3가지

  • 데이터 안정성 및 복구: 주 데이터베이스에 문제가 발생했을 때, 슬레이브 데이터베이스를 사용하여 데이터를 복구하고 서비스의 연속성을 유지할 수 있습니다.
  • 부하 분산: 해당 프로젝트의 경우 쓰기 쿼리보다는 읽기 쿼리에 빈도가 더 높다고 판단되어, 읽기 쿼리를 슬레이브 데이터베이스로 전송하여 마스터 데이터베이스의 부하를 줄일 수 있습니다. 이는 전체 시스템의 읽기 성능을 향상시키는 기대를 불러일으킵니다.
  • 백업: 실시간 또는 거의 실시간으로 데이터를 복제함으로써 지속적인 백업이 이루어집니다.

📄 Changes Made

새로운 EC2서버(ip : 3.35.156.24)를 구축하여 해당 서버의 docker 컨테이너를 2개 띄워 하나는 Master DB, 하나는 Slave DB 로 구성하여,
읽기 요청에 대한 부하를 분산시켜 전체 성능 향상을 도모

📸 Screenshot

image

성능 평가

  • 요청을 보내는 사용자의 수 : 1000명
  • 요청을 보내는 시간간격 : 0초
  • 반복 횟수 : 10
    위와 같이 설정했을 경우 아래와 같은 TPS를 갖게 되었고, 전체적으로 TPS가 높은것은 리플리케이션 적용 후로 보이며, 간혹 보이는 트랜잭션처리 수가 극도로 빠지는 구간은 로컬에서 테스트를 한것이기 때문에 보여지지, 특정되지 않은 예외사항들이 많을것으로 추측됩니다.
    네트워크 상의 예외도 간과할 수 없는 문제로 판단되지만, 전체적인 평균을 바라봤을 때 리플리케이션 적용을 하고 난 후에 TPS가 더 높은것으로 보여집니다.
image

Replication 적용 후

image

Replication 적용 전

image

🙋🏻‍ Review Point

  • 1개 이상의 Datasource 를 정의하면 스프링 부트에서 제공하는 AutoConfiguration 도움은 받을 수 없게 됩니다.
    그렇기 때문에 Master/Slave Datasource 를 코드로 설정해줘야 합니다.
  • TransactionSynchronizationManager 를 통해 Read / Write  타입을 판별 후 Datasource Type을 반환합니다.
  • RoutingDataSourceConfig 클래스에서는 LazyConnectionDataSourceProxy 객체를 사용하는 것을 볼 수 있습니다.
  • 스프링에서는 Transaction 생성 시점에 Datasource Connection 을 가져오기 때문에,
    항상 @Primary 가 붙은 Master Data 를 가져오게 될 것 입니다.
    따라서 Transaction 생성 시점이 아닌 실제로 쿼리가 발생하는 시점에 Datasource Connection 을 가져오기 위해서
    LazyConnectionDataSourceProxy 을 사용하였습니다

✅ Test Checklist

  • DataSource를 정상적으로 생성하는지
  • Read/Write에 따른 DataSource 분기

🔗 Reference

Issue #48

@Ho-Tea Ho-Tea added ⚙️ Setting 환경 세팅 ✅ Test 테스트 ✨ Feature 기능 개발 labels Dec 31, 2023
@Ho-Tea Ho-Tea added this to the 3차 개발 스프린트 milestone Dec 31, 2023
@Ho-Tea Ho-Tea requested a review from yooyouny December 31, 2023 07:15
@Ho-Tea Ho-Tea self-assigned this Dec 31, 2023
ddl-auto: update
show-sql: true
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

자바 클래스로 만들게되면 DB형식으로 알아서 언더스코어 넣어가며 만들어지지 않나요? 전략을 따로 설정해야하는 이유가 생긴건지 궁금합니다

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DB형식으로 알아서 언더스코어 넣어가며 만들어지지 않나요? -> 맞습니다!
전략을 따로 설정해야 하는 이유는 없습니다만, 새롭게 MasterSlave디비를 구축하면서 혹시나 하는 마음에 추가해주었던 것입니다!


@BeforeEach
void init() {
void init() throws NoSuchFieldException, IllegalAccessException {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DB가 분할되면서 해당 에러를 잡아줄 필요가 생긴건가요? 왜 모든 컨트롤러, 서비스에 해당 부분이 추가되는게 아니라 OrderController, StoreServiceTest에만 필요한건지? 궁금합니다

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 부분은 Reflection Test를 하므로써 생긴 예외처리여서 해당 Replication DB분할과는 무관합니다!

Copy link
Copy Markdown
Contributor

@yooyouny yooyouny left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 코드에서는 master, slave 빈을 등록하고 routing 빈에서 설정해주고 dynamic 빈에서 lazy로 라우팅 클래스를 등록하는 코드만 보이는것 같습니다.
PR에 현재 서비스에 리플리케이션을 적용하려는 목적, 이유와 부하테스트의 유의미한 결과(응답시간도 보긴하지만 외부영향을 많이 받아 TPS=초당트랜잭션처리수를 위주로 보는걸로 알고있습니다)도 함께 나타났으면 합니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 기능 개발 ⚙️ Setting 환경 세팅 ✅ Test 테스트

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

2 participants