본문 바로가기

아키텍처

[조대협 대용량 아키텍처]Persistent Layer - RDBMS

RDBMS를 이용한 설계에 관해서 Query off Loading샤딩에 대해서 이야기 해보겠다

 


Query off Loading
  • Query off Loading는 DB의 성능 향상을 위한 기법
  • 쓰기와 읽기 트랜잭션을 분리 하는 기법이다.

 

먼저 DB에는 Master DBSlave 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**라는 기능을 통해서 지원 

샤딩이라는 것이 데이터를 분산 저장함으로써 시스템의 전체 용량을 늘릴 수는 있지만 애플리케이션의 복잡도가 올라가고 데이터가 편중 되는 것을 방지 하는 등 여러가지 요소를 고려한 후에 설계, 반영 해야한다.

 

 

이전 글

Persistent Layer

 

[조대협 대용량 아키텍처]Persistent Layer

PerSistent Layer는 처리할 데이터를 저장하는 공간이다. 전통적으로 관계형 데이터베이스 (RDBMS) 파일 시스템 등 주로 사용하고 데이터 구조가 디렉터리 구조일 경우는 LDAP를 사용한다 대용량의 데이터를 Key/V..

alsyean.tistory.com

다음 글

Persistent Layer - 파일 시스템

 

Persistent Layer - 파일 시스템

파일 시스템은 일반적인 파일 시스템이다. 파일 시스템의 구조 SDK 운영 체제 계층 파일 시스템 스토리지 하드웨어 SDK 프로그래밍 언어에서 지원되는 파일 시스템 접근용 API C의 fopen, JAVA의 java.io.*의 파일..

alsyean.tistory.com

 


더보기

이 글은 조대협의 서버사이드 대용량 아키텍처와 성능 튜닝 책을 참고하여 작성되었습니다.

이 글은 코드프레소 DevOps Roasting 코스를 수강하면서 작성한 글입니다.