대용량 서비스 아키텍처의 Persistent Layer

24 October 2015

클러스터링

  • Fail Over 가능 : 특정 인스턴스 장애 시 다른 인스턴스들이 장애가 난 인스턴스의 메시지를 받아서 이어서 처리
  • 한 대의 서버로 처리할 수 없는 양의 메시지를 여러 대의 서버에서 분산 처리 가능

RDBMS에서의 성능 향상을 위한 아키텍처

Query off Loading

DB 트랜잭션의 CRUD 중 80% 이상은 SELECT임. INSERT/UPDATE/DELETE는 많지 않음. 따라서 조회 트랜잭션과 쓰기 트랜잭션을 분리하는 기법. 마스터 DB에는 쓰기 트랜잭션만을 허용하고, Slave DB에는 읽기만을 허용. 마스터 DB의 내용을 중간의 스테이징 DB로 복사. 그리고 스테이징 DB는 복제된 내용을 N개의 Slave DB로 복제. 이렇게 하려면 커넥션풀을 2개로 나눠야함. 또한 Slave가 여러대이므로 로드밸런싱 필요. 만약 마스터 DB가 복제를 직접 한다면 성능 저하를 유발할 수 있으므로 중간에 스테이징 DB를 넣는다.

샤딩(Sharding)

DB 용량 한계를 극복하기 위한 기술. 데이터를 여러대의 DB에 분산 저장함. 분산된 각 DB들을 샤드(Shard)라고 함. 데이터의 범위별로 나누는 수직적 샤딩, 데이터의 분류에 따라서 나누는 수평적 샤딩. 단 데이터가 어느 샤딩으로 쏠리는 현상이 생길 수 있음. 쏠리는 정도에 따라 각 샤드의 성능을 다르게 설계할 수 있음(CPU,메모리). 데이터 편중 현상에 대해 예측이 어려운 경우는 의미없는 키(Key값을 기준으로 해싱 등)를 이용하여 샤딩할 수 있음. DBMS 단에서 샤딩을 지원할 수도 있고, 맵핑 프레임워크를 이용할 수도 있다. 애플리케이션 코드 자체에서 지원할 수도 있으나 애플리케이션의 복잡도가 올라갈 수 있으며 데이터 편중 등 여러가지 요소를 고려하여 설계해야 한다.

NoSQL (Not Only SQL : Non-RDBMS)

빠른 성능과 대용량 데이터에 초점을 맞춘 데이터베이스. 데이터 모델은 단순하게 Key-Value 형태의 저장 구조를 가지며 데이터간의 관계 등은 지원하지 않는다. 오로지 단순한 구조의 데이터를 빠르게 읽고 쓰는데에 최적화가 되어있다. 일종의 유행처럼 NoSQL이 퍼지고 있지만 일반적인 어플리케이션에서는 NoSQL이 필요 없을 수 있다. RDBMS만으로 충분하고, 쿼리오프로딩과 샤딩의 조합으로도 충분하다. 아주 대용량의 서비스를 빠른 성능으로 제공할 때에만 NoSQL을 신중하게 고려해 볼 필요가 있다. 각 NoSQL DBMS마다 특성이 매우 다양하므로, 특성을 잘 파악하고 필요에 맞는 제품을 선정해야 한다.

NoSQL 공통 특징

  • 데이터 간의 관계를 정의하지 않음 (외래키, 조인, 등이 없음)
  • 데이터를 저장하고 키에 대한 Put/Get 만을 지원.
  • 따라서 Sorting, Join, Grouping, Range Select, Index 등에 대해 고민을 해야 한다.
  • 대용량 데이터 저장 가능
  • 서버 수십대를 연결하여 데이터를 저장 및 처리하는 분산형 구조를 가짐. 분산하여 저장하고, 데이터를 상호 복제하여 장애시에도 데이터 유실이나 서비스 중지가 없는 구조.
  • 고정되지 않은 테이블 스키마 . Key의 타입만 동일하고, 데이터를 저장하는 컬럼은 각 row마다 일관되지 않는다.
  • CAP 이론: 일관성(분산된 노드 중 어느 노드에 접근하더라도 데이터 값은 일관), 가용성(특정 노드 오류시 Fail over 처리). Partition Tolerance(노드 간 통신하는 네트워크 장애시 저항력). 이 3가지 중 2가지를 함께 사용.

NoSQL 분류

  • Key/Value: Value는 단순 값 한 개가 아니라 여러개의 컬럼들을 가질 수 있음. Map과 비슷하다고 생각하면 됨.. Redis.
  • Ordered Key/Value : Key/Value 구조와 유사하나 정렬하여 저장. 데이터를 항상 날짜순으로 order by하여 조회한다면? 아주 유리함. 카산드라.
  • Document Key/Value : Key/Value의 확장된 형태. Value의 데이터 타입으로 XML, JSON 등 구조화된 데이터 타입을 사용함으로써 계층 구조 표현 가능. 몽고DB..

References: 조대협님의 서버사이드 책

Java Garbage Collection MapReduce 기본 개념