본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
https://fastcampus.info/4n8ztzq
안녕하세요 :)
오늘은 "50일의 기적 AI 환급반_ 대규모 채팅 플랫폼으로 한 번에 끝내는 실전 대용량 트래픽 커버 완전판" 챌린지에 도전하는 마흔 네번째 날입니다.
마흔 세번째 날에는 채팅 프로젝트에 메시지 구간 요청 처리 기능 추가에 대해 배웠었는데요. 오늘은 과연 어떤 내용들을 배울 수 있을지 공부하고 포스팅 하도록 하겠습니다.
오늘 학습할 내용의 제목은,
Part 5. 모놀리틱 서비스 분해 > Ch 1. 데이터베이스의 고가용성과 확장성 확보를 위한 샤딩 >
02. Apache ShardingSphere를 사용하여 샤딩 구현
입니다.
🟢 Apache ShardingSphere를 사용하여 샤딩 구현
- 이번 글에서는 Apache ShardingSphere를 활용해 샤딩을 구현하는 과정을 소개합니다.
- 파트 3 챕터 1에서 만든 그룹 채팅 프로젝트를 기반으로 진행하며, 도커 기반 멀티 MySQL 구성과 샤딩 설정까지 다룹니다.
📦 프로젝트 준비
- 기존 프로젝트를 샤딩 스피어 적용용으로 프리뷰 샤딩 스피어라는 이름으로 변경
- Gradle 및 settings.gradle에서 프로젝트 이름 변경 후 리프레시
- 메시지 테이블의 PK는 오토 인크리먼트 값 사용 불가
- 이유: 샤딩 키는 데이터 삽입 전부터 알고 있어야 함
- 해결: 채널 ID 컬럼을 추가, NOT NULL 설정
🛠 엔티티 및 DTO 수정
- 메시지 엔티티에 채널 ID 추가
- 생성자, Getter, toString() 수정
- DTO에도 채널 ID 반영
- 테스트 시 시스템 에러 채널 ID 하드코딩: 임시로 채널 0번 사용
🐳 도커로 MySQL 노드 두 개 구성
- 기존 DB 1개 → DB 2개 구성
- 포트 설정:
- 노드1: 3306
- 노드2: 3307
- 볼륨 매핑:
- 노드1 → host/node1
- 노드2 → host/node2
- 도커 컴포즈 실행 후 두 개의 MySQL 노드 확인
⚡ ShardingSphere 설정
- Gradle 의존성 추가
- 기존 데이터소스 설정 삭제 → 샤딩 스피어가 대신 처리
- 리소스 폴더에 sharding.yml 추가
- channel_id 기반 모듈러 샤딩
- 짝수 채널 → 노드1, 홀수 채널 → 노드2
- JDBC 드라이버는 org.apache.shardingsphere.driver.ShardingSphereDriver 사용
- URL: jdbc:shardingsphere:classpath:sharding.yml
✅ 테스트 및 검증
- 서버 실행 후 DB 확인: 채널 ID 기준으로 데이터가 각 노드에 분산
- 테스트 시 채널별 메시지 확인:
- 1번 채널 → 노드1
- 2번 채널 → 노드2
- 3번 채널 → 노드1
- 멀티 스레드 환경에서도 샤딩 키 기준 데이터 분산 확인
💡 주의 사항
- 샤딩 스피어는 간단한 모듈러 샤딩은 쉽게 적용 가능
- 복잡한 샤딩이나 세부 옵션은 문서 참고 필요
- 실제 서비스 적용 시:
- 데이터 안정성
- 성능
- 지원 기능
등을 꼼꼼히 검토해야 함
- 이번 프로젝트는 로컬 테스트용 프리뷰 수준
- 샤딩 스피어를 활용하면 멀티 DB 환경에서 샤딩을 쉽게 구성할 수 있으며, 채널 ID 같은 샤딩 키를 기반으로 데이터 분산 처리 가능하며, 복잡한 설정이 필요할 때는 문서를 참고하여 안전하게 구성해야 한다는 것을 알 수 있었습니다.