Skip to main content Link Menu Expand (external link) Document Search Copy Copied

created at 2023-06-18

문제인식

현재 채팅서버 MSA 프로젝트로 확장성을 다양한 방법으로 증가하고 있습니다. 채팅서버 프로젝트에서 확장성 증가를 위한 구현 및 사용된 기술은 아래와 같아요.

확장성 증가를 위한 구현 및 사용된 기술

  • Spring-Cloud-Gateway 와 Eureka 를 통해 서버수평확장 용이하도록 구현
  • RebbitMQ 와 Config-Server 를 통해 .yaml 파일들을 모든 서버에 배포할 수 있도록 구현
  • Kafka 를 통해 토픽을 구독만 하면 자동으로 확장가능(Kafka 는 메세지 유실을 고려해서 3대의 broker로 설정)
  • Redis 로 하나의 API 요청에 대한 트랜젝션 처리를 담당
  • Docker-compose 를 통해 서비스 자동 실행 및 서버 다운 시 자동 restart

하지만! 서버를 수평적으로 확장한다고 해도 현재로써는 하나의 RDB 와 연결되어있게 됩니다. 즉, RDB 는 확장되지 않았던 것이죠. 그렇게 되면, RDB에 많은 트래픽이 몰리겠죠?

작업 github branch : feature/db-sharding

확장되지 않은 부분

img

해결책

그렇다면 하나의 RDB(Postgres)에 몰리는 트래픽을 어떻게 분산시킬 수 있을까요?

해결방법은 두 가지를 생각해봤어요.

  1. CQRS : 이 방법은 읽는 DB와 삽입 DB를 분리시키는 방법입니다
    • SELECT 쿼리를 위한 DB와 INSERT 쿼리를 위한 DB 를 분리시킵니다
    • 그리고 읽는 DB와 삽입 DB 이 두 DB를 단방향 동기화(삽입 DB -> 읽기 DB)시킵니다
  2. RDB 샤딩 : 이 방법은 데이터를 분할하여 저장하는 방식입니다
    • SELECT 쿼리를 수행하는 읽기 DB를 샤딩해서 분할하여 읽을 수 있도록 할거에요

결과로 삽입 DB는 분할되지 않지만, 읽는 부분에서의 리소스는 분할 가능하겠죠?