(MongoDB) Sharding (샤딩)
* 샤딩의 목적
1) 데이터의 분산 저장
하나의 서버에 빅 데이터를 저장, 관리하는것은 어렵다. 초당 발생하는 빅데이터를 디스크에 저장할때 발생하는 Write Scaling 문제는 애플리케이션의 성능 저하문제를 유발시키게 될 뿐 만 아니라 샤딩 시스템 전체의 성능 저하 현상을 유발
2) 빠른 성능
분산 처리는 여러 개의 프로세스가 여러 개의 CPU를 통해 동시 작업을 수생했을 떄 가장 이상적이라 볼 수 있다.
3) 데이터의 백업과 복구 전략의 일환
샤딩의 가장 대표적인 기능 중에 하나는 데이터의 분산 저장을 통한 시스템의 성능 향상이라고 볼 수 있다.
만약, 하나의 서버에 빅데이터를 저장, 관리 했을 때 서버의 장애 문제가 발생한다면 유실되어지는 데이터 양은 상상을 초월하게 될 것이고, 시스템을 복구하게 된다면 많은 시간과 비용이 요구 되어 질것이다.
==========================================================
1. 샤딩의 작동 방식
- 샤딩의 구성요소
샤드 클러스터는 샤드, mongos라우터, 설정서버로 구성된다.
* 샤드
몽고디비 샤드클러스터는 데이터를 하나 혹은 그 이상의 샤드에 걸쳐서 분산저장한다.
각 샤드는 MongoDB의 복제셋으로 클러스터 전체 데이터의 일부분을 저장한다.
*Mongos 라우터
각 샤드가 전체 데이터의 일부분만을 가지고 있다면, 그 일부가 어디있는지 알기 위한 인터페이스가 필요하다.
mongos 프로세스는 모든 읽기와 쓰기 요청읋 해당 샤드에 보내는 라우터이다.
그러나 mongos는 지속성이 없는 경량 프로세스이다. 애플리케이션이 실행되는 서버에서 실행됨으로써 각 샤드에 연결되게 된다.
*설정서버
mongos라우터가 지속성이 없기 때문에 샤드 클러스터의 상태를 어디선가는 유지하고 있어야 하는데, 그것이 설정 서버(config server)이다.
메타데이터를 지속적으로 유지한다.
<컬렉션에 대한 샤딩>
MongoDB의 샤딩은 범위 기반이다. 샤드된 컬렉션에서 모든 도큐먼트는 해당 키에 대해 어느 범위의 값에 속해야 한다는 것이다. 즉, 몽고디비는 샤드 키를 사용한다.
<청크(chunk)>
청크는 하나의 샤드에 있는 샤드 키 값의 연속적인 범위이다.
예를들어, homework라는 컬렉션에서 샤드데이터가 B와 C라는 두 샤드에 청크로 나뉘어져있다.
시작 끝 샤드
James carrot A
carrot dick B
dick damn A
1) 데이터의 분산 저장
하나의 서버에 빅 데이터를 저장, 관리하는것은 어렵다. 초당 발생하는 빅데이터를 디스크에 저장할때 발생하는 Write Scaling 문제는 애플리케이션의 성능 저하문제를 유발시키게 될 뿐 만 아니라 샤딩 시스템 전체의 성능 저하 현상을 유발
2) 빠른 성능
분산 처리는 여러 개의 프로세스가 여러 개의 CPU를 통해 동시 작업을 수생했을 떄 가장 이상적이라 볼 수 있다.
3) 데이터의 백업과 복구 전략의 일환
샤딩의 가장 대표적인 기능 중에 하나는 데이터의 분산 저장을 통한 시스템의 성능 향상이라고 볼 수 있다.
만약, 하나의 서버에 빅데이터를 저장, 관리 했을 때 서버의 장애 문제가 발생한다면 유실되어지는 데이터 양은 상상을 초월하게 될 것이고, 시스템을 복구하게 된다면 많은 시간과 비용이 요구 되어 질것이다.
==========================================================
1. 샤딩의 작동 방식
- 샤딩의 구성요소
샤드 클러스터는 샤드, mongos라우터, 설정서버로 구성된다.
* 샤드
몽고디비 샤드클러스터는 데이터를 하나 혹은 그 이상의 샤드에 걸쳐서 분산저장한다.
각 샤드는 MongoDB의 복제셋으로 클러스터 전체 데이터의 일부분을 저장한다.
*Mongos 라우터
각 샤드가 전체 데이터의 일부분만을 가지고 있다면, 그 일부가 어디있는지 알기 위한 인터페이스가 필요하다.
mongos 프로세스는 모든 읽기와 쓰기 요청읋 해당 샤드에 보내는 라우터이다.
그러나 mongos는 지속성이 없는 경량 프로세스이다. 애플리케이션이 실행되는 서버에서 실행됨으로써 각 샤드에 연결되게 된다.
*설정서버
mongos라우터가 지속성이 없기 때문에 샤드 클러스터의 상태를 어디선가는 유지하고 있어야 하는데, 그것이 설정 서버(config server)이다.
메타데이터를 지속적으로 유지한다.
<컬렉션에 대한 샤딩>
MongoDB의 샤딩은 범위 기반이다. 샤드된 컬렉션에서 모든 도큐먼트는 해당 키에 대해 어느 범위의 값에 속해야 한다는 것이다. 즉, 몽고디비는 샤드 키를 사용한다.
<청크(chunk)>
청크는 하나의 샤드에 있는 샤드 키 값의 연속적인 범위이다.
예를들어, homework라는 컬렉션에서 샤드데이터가 B와 C라는 두 샤드에 청크로 나뉘어져있다.
시작 끝 샤드
James carrot A
carrot dick B
dick damn A
각 개별 청크는 연속적인 범위를 나타내긴 하지만 이 범위들은 어느 샤드에도 존재한다.
중요한 것은 청크는 물리적이 아니라 논리적이다. 즉, 하나의 청크는 디스크 상에서 연속적이지 않다.
샤드 클러스터가 처음 셋업 될 때는 하나의 청크만이 존재하지만 다음 두 조건 중 하나를 만족하게 되면,
청크는 분할한다.
1. 청크가 64MB에 도달한다.
2. 10만 도큐멘트가 된다.
댓글
댓글 쓰기