2018년 5월 12일 토요일

샤딩, 파티셔닝

Partitioning

파티셔닝은 데이터를 다수의 테이블로 쪼개는 행위를 뜻하는 일반적인 용어(term) 이다. 그리고 파티셔닝은 수직 파티셔닝과 수평 파티셔닝으로 구분된다. 수직 파티셔닝은 하나의 엔티티(table)에 저장된 데이터를 여러 개의 테이블로 분리하는 것을 의미하고, 수평 파티셔닝은 물리적으로 다른 데이터베이스에 데이터를 수평 분할하는 것을 의미한다. (스키마를 복제하고 샤드키를 기준으로 서버를 구분하는 방식.)마지막으로 샤딩은 수평 파티셔닝과 같은 의미로 사용된다.


Sharding

샤딩 (수평 파티셔닝)에 대해 더 알아보자. 샤딩은 서비스를 구성하는 특정 데이터가 서버 1대의 가용 범위를 넘어선다면 고려될 필요가 있다. 가장 기본적인 방법으로 데이터의 range와 서버의 개수를 고려해 0~10000번대로 분류되는 데이터는 하나의 샤드에 저장하고, 10001~20000번대로 분류되는 데이터는 다른 샤드에 저장하는 방식을 고려할 수 있다. 또는 지역 단위로 망원동 데이터는 A 서버에 저장하고, 합정동 데이터는 B 서버에 저장하는 방식을 고려할 수 있을 것이다. 마지막으로 일관된 해싱(consistent hashing) 알고리즘을 적용한 샤딩을 고려할 수 있다


Consistent Hashing

일관된 해싱은 메타 정보를 조회하지 않고 클러스터에서 키가 저장된 서버를 바로 찾아갈 수 있는 방법이다. 키의 해시 값을 구하고, 이 해시 값으로 서버를 찾는 방식인데 서버 목록을 ring 형태로 나열한 뒤 각 서버는 ring에서 각자 맡은 범위만 처리하는 방식이다. 중간에 서버가 추가되거나 삭제되는 과정에서도 일관된 해싱을 보장할 수 있어야 한다.


아마 초기 구현 단계에서 부터 데이터의 트래픽이나 볼륨이 예상 가능하다면 상대적으로 쉽게 샤딩을 디자인에(+stateless 한 구성) 반영할 수 있을 것이고, 그렇지 못한 상황에선 상당히 골치 아픈 일이 될 수 있다. (분산 환경을 고려하지 않았던 서비스 중간에 샤딩을 적용하는 등.) 샤딩을 고려하지 않은 채 디자인된 서비스에서는 join, 트랜잭션, 프로시져 등 데이터를 서버 단에서 처리하기 용이하도록 하는 기법을 사용했을 가능성이 높기 때문에 이러한 서버의 역할을 클라이언트로 내려주는 등의 노력이 필요하다.


댓글 없음:

댓글 쓰기