NoSQL에서 구글링을 하는 도중 샤딩(sharding)이라는 용어를 접하게 되어 알아본 내용을 공유합니다.

 

1. 샤딩( sharding ) 이란 무엇인가?

관계형 데이터베이스에서 대량의 데이터를 처리하기 위해서 데이터를 파티셔닝하는 기술이다. 샤딩은DBMS 레벨에서 데이터를 나누는 것이 아니고 데이터베이스 자체를 분할하는 방식이다. 따라서 어플리레이션 레벨에서 구현해야 한다.

간단하게 예를 들면, 전 세계의 고객 데이터를 저장하는 대형 데이터베이스를 분산한다고 할때, 미국 고객의 경우는 샤드A, 아시아 고객의 경우는 샤드B, 유럽 고객의 경우는 샤드C로 분할해서 저장할수 있다. 

 

2. 샤딩 및 전략

샤딩에서 데이터베이스를 분할하는 방법은 크게  각 방법마다 장단점과 주의할 점이 있으므로 서비스에 맞게 적절하게 선택하거나 조합하여 사용 한다.


2.1 Vertical Partitioning

    테이블 별로 서버를 분할하는 방식이다. 예를들면 사용자 프로필정보용 서버, 사용자 친구리스트용 서버, 사용자가 만든 컨텐츠( 사진같은것) 용 서버등으로 분할하는 방식이다.

    장점: 구현이 간단하고, 전체 시스템에 큰변화가 필요 없다.

    단점: 각 서버의 데이터가 점점 거대해지면 추가 샤딩이 필요해진다. ( 1천만명이1000장의 사진을 생성한다면 컨텐츠 서버에 또 샤딩이 필요할 것이다. )


  2.2 Range Based Partitioning

    하나의feature(또는table)가 점점 거대해지는 경우 서버를 분리하는 방식이다. 예를들면 사용자가 많은경우 사용자의 지역정보를 이용해서 user 별로 서버를 분리하거나, 일정데이터라면 년도별로 분리, 거래정보라면 우편번호를 이용하는 방식이다.

    주의점 : 데이터를 분할하는 방법이 예측가능해야 한다.


  2.3 Key or Hash Based Partitioning

    이방식은 웹2.0 사이트에서 기본 파티셔닝 방식으로 알려져있다. 엔티티를 해쉬함수에 넣어서 나오는 값을 이용해서 서버를 정하는 방식이다. 사용자ID가 숫자일 경우 나머지연산(module operation)을 이용하는 방법이다.

    주의점: 해쉬결과 데이터가 균등하게 분포되도록 해쉬함수를 정하는게 중요하다.

    단점: 서버의 수를 늘리기 위해서 해쉬함수를 변경하는 작업이 무지무지 비싼 작업이다.


  2.4 Directory Based Partitioning

    파티셔닝 메커니즘을 제공하는 추상화된 서비스를 만드는 것이다.(데이터베이스 액세스 코드와는 떨어져 있는)  샤드키를look-up 할수 있으면 되므로, 구현은DB와 Cache를 적절히 조합해서 만들수 있다.

 

레디스에서도 성능향상을 위한 스케일 아웃을 하기위하여  두 가지 기법을 제공한다고 하는데..
읽기 분산을 위한 복제(Replication)와 쓰기 분산을 위한 샤딩(Sharding)이 이에 해당되는데 앞으로 더 알아보아야 겠습니다.