RDBMS를 이용한 설계에 관해서 Query off Loading 과 샤딩에 대해서 이야기 해보겠다
Query off Loading
- Query off Loading는 DB의 성능 향상을 위한 기법
- 쓰기와 읽기 트랜잭션을 분리 하는 기법이다.
먼저 DB에는 Master DB와 Slave DB가 존재한다.
Master DB는 읽기와 쓰기가 가능하고 SlaveDB는 읽기만 가능하다. (Master DB는 주로 쓰기만 한다.)
Slave DB는 Master DB를 복제하는 DB라고 생각하면 좋을 것 같다.
Master DB는 쓰기만 허용하고 Master DB의 내용을 중간의 Staging DB라는 곳에 복사한다
그리고 Staging DB는 복제된 내용을 N개의 Slave DB로 복제한다.
애플리케이션은 DB에 대한 쓰기 로직과 일기 로직을 분리해서 구현 해야 하며 이 분리된 로직은
쓰기 DB로 접근하기 위한 DB연결과 읽기 DB로 접근하기 위한 DB연결을 이용해서 접근 한다.
일반적으로 이러한 연결을 커넥션 풀(Connection Pool)을 이용하여 관리한다
또한 읽기 DB의 경우에는 N개의 Slave DB로 부터 읽기 때문에 N개의 Slave DB에 대한 요청을 로드 밸런싱 해야 한다.
그러면 Staging DB는 무엇을 할까?
Staging DB는 Slave DB로 복제하기 위한 중간 경유지 역할이다.
Master DB에서 Slave DB는 바로 복제하게 되면 Master DB가 쓰기 트랜잭션 이외에 복제대한 부분을 처리해야 하기 때문에 성능이 저하 될 수 있기 때문에 이를 방지 하고자 중간에 Staging DB를 넣는다.
CDC(Change Data Capture) 기술을 이용하여 Master DB -> Staging DB -> Slave DB 복제를 한다.
DMBS는 공통으로 CUD와 같은 쓰기 관련 작업을 수행할 때 데이터를 실제로 저장하기 전에 해당 작업에 대한 요청을 백로그에 저장한다. (백로그는 일반적으로 로컬 파일이다.)
데이터 쓰기 전에 장애가 났을때 재시작하면서 이 백로그를 읽어서 복구를 위한 용도로 사용된다.
CDC는 백로그를 이용해서 데이터를 복제하는 방식이다.
샤딩
- 샤딩은 데이터 베이스의 용량 한계를 극복하기 위한 기술이다.
- 샤딩은 데이터를 여러 개의 DB에 나눠 담는 방법이다.
- 데이터를 분산하는 방식에 따라서 수직적 샤딩과 수평적 샤딩으로 나뉜다.
수직적 샤딩은 연속된 데이터에 대해서 범위별로 데이터를 나누는 방법 ex) 연령
수평적 샤딩은 연속된 키가 아니라 카테고리와 같은 종류에 따라서 데이터를 나누는 방법 ex) 국가
샤딩을 구현하는 방법
- DBMS단에서 샤딩을 지원하는 방법
- OR Mapper와 같은 DB접근용 프레임워크에서 샤딩을 제공하는 방법 코드 자체에서 지원하는 방법
- NoSQL에서 MongoDB의 경우 ver 1.6 부터 샤딩을 DB 수준에서 지원
- JAVA의 Hibernate의 경우 Hibernate Shard**라는 기능을 통해서 지원
샤딩이라는 것이 데이터를 분산 저장함으로써 시스템의 전체 용량을 늘릴 수는 있지만 애플리케이션의 복잡도가 올라가고 데이터가 편중 되는 것을 방지 하는 등 여러가지 요소를 고려한 후에 설계, 반영 해야한다.
이전 글
다음 글
이 글은 조대협의 서버사이드 대용량 아키텍처와 성능 튜닝 책을 참고하여 작성되었습니다.
이 글은 코드프레소 DevOps Roasting 코스를 수강하면서 작성한 글입니다.
'아키텍처' 카테고리의 다른 글
[조대협 대용량 아키텍처]전통적인 OLAP 방식의 분석 시스템 (0) | 2020.02.10 |
---|---|
[조대협 대용량 아키텍처]Analysis Layer (0) | 2020.02.10 |
[조대협 대용량 아키텍처]Persistent Layer - NoSQL (0) | 2020.02.09 |
[조대협 대용량 아키텍처]Persistent Layer - 파일 시스템 (0) | 2020.02.09 |
[조대협 대용량 아키텍처]Persistent Layer (0) | 2020.02.09 |