Distributed Relational Database

Scale up 만으로 데이터의 성능을 올리는데 한계

Scale-Out을 통해 DB 서버를 한대 늘림

샤딩을 이용해 데이터를 여러 DB에 분산할 수 있다. 그리고 샤딩된 각각의 데이터 단위를 샤드라고 함

샤딩(Sharding) : 데이터를 여러 데이터베이스에 분산하여 저장하는 기술

샤드(Shard) : 샤딩된 각각의 데이터 단위

수직 샤딩(Vertical Sharding) : 데이터를 수직으로 분할하는 방식(컬럼 단위)

  • article을 저장한다 하였을 때, article_id를 식별자로 사용하고 좌측 샤드에는 title/content 저장 우측 샤드에는 board_id/create_at 분산 저장한다.

  • 각 샤드가 적은 수의 컬럼을 저장하므로, 성능 및 공간 이점이 생긴다.

    • 만약 title/content만 필요한 경우 해당 DB만 조회하면 되기 때문이다.

    • 더 적은 데이터를 읽기 때문에(컬럼이 적으니까), 더 많은 row가 데이터베이스의 메모리 캐시에 올라갈 수 있다.

    • 공간 이점 : 하나의 데이터 페이지에 더 많은 row를 저장할 수 있게 된다. 다만 컬럼 수에 의해 제한되어 scale out을 무한히 할 수는 없다.

  • 하지만 데이터의 분리로 인해 조인 상황이나 트랜잭션을 관리하는게 복잡해질 수 있다.

수평 사딩(Horizontal Sharding) : 데이터를 수평으로 분할하는 방식(행 단위)

  • 좌측 샤드 article_id = 1~5000, 우측 샤드 article_id = 5001~10000으로 분산 저장

  • 성능 향상 (I/O 감소 및 병렬 처리): - 인덱스 크기 감소: 각 샤드는 더 적은 수의 로우를 가지므로, 인덱스의 크기가 훨씬 작아집니다. 특정 사용자를 찾기 위해 1억 건의 인덱스를 스캔하는 대신, 5,000만 건의 더 작은 인덱스를 스캔하므로 검색 속도가 매우 빨라집니다.

  • 쿼리 부하 분산: 쿼리가 여러 서버로 분산되어 단일 서버의 CPU 및 I/O 부하가 줄어듭니다.

  • 쓰기 경합 감소: 서로 다른 샤드에 대한 쓰기 작업은 병렬로 처리될 수 있어 Lock 경합이 줄어듭니다.

    • 공간 이점 (수평적 확장성):

      • 하나의 거대하고 비싼 서버에 모든 데이터를 저장하는 대신, 여러 개의 저렴한 서버를 추가하여 저장 공간을 거의 무한대로 확장할 수 있습니다. (Scale-out)

  • Range-based Sharding : 데이터를 특정 값(Shard Key)의 특정 범위에 따라 분할하는 기법 범위 기반 샤딩을 했을 때 article_id=100부터 30개 조회한다면 좌측 샤드에서 모든 데이터를 찾을 수 있다.

    • 다만 데이터가 6000개라면 , 좌측 샤드에만 5000개가 저장되는 데이터 쏠림 현상 발생

  • Hash-based Sharding : 데이터를 특정 값(Shard Key)의 해시 함수에 따라 분할하는 기법 hash_function = article_id -> article_id %2 라면? 좌측 샤드 article_id = 1, 3, 5, ... 우측 샤드 article_id = 2, 4, 6, ...

    • 따라서 균등한 분산을 위해 Shard Key, 해시 함수 필요함.

    • 균등하게 분산되지 않으면 , 데이터 쏠림 현상이 발생할 수 있다. 만약 Shard Key가 board_id 였다면 특정 인기게시판에 쓰인 게시물들이 쏠려서 저장되었을 것이다.

    • 그런데 이때 Shard Key가 article_id인 상황에서 게시판의 게시글 목록을 조회한다면? board_id를 바탕으로 모든 Shard에 대해 조회 요청을 해야 한다.

    • 따라서 시스템 특성에 따라 적절하게 Shard Key와 해시 함수를 선정해야 한다.

  • Directory-based Sharding(디렉토리 기반 샤딩) : 디렉토리를 이용하여 데이터가 저장된 샤드를 관리하는 기법 , 매핑 테이블을 이용하여 각 데이터가 저장된 샤드를 관리한다. 좌측 샤드 article_id = 1, 4 우측 샤드 article_id = 2, 3

    • 디렉토리 관리 비용은 있지만 , 데이터 규모에 따라 유연한 관리가 가능하다.

논리적 샤드 개념 : DB의 Router를 통해 클라이언트에서 정한 논리적 샤드를 DB에 실제하는 물리적 샤드들에 라우팅 해준다. 이렇게 함으로써 물리적 샤드들의 변경에도 클라이언트의 변경이 필요 없어진다. 예를 들어 클라이언트는 4개의 샤드로 인지하고 물리적 샤드는 2개 뿐이라 하더라도 라우터를 통해 4개를 각각의 실제 물리적 샤드 2개에 매핑해준다.

데이터 복제 : 특정 샤드에 장애가 생겼을 경우에 대비하기 위해 데이터베이스에 Primary(주 데이터), Replica(복제본)을 두어 관리한다.

  • 이러한 복제는 동기적 또는 비동기적으로 처리될 수 있다.

  • Synchronous(동기적) : 데이터 일관성을 보장하나, 쓰기 성능이 저하된다.

  • Asynchronous(비동기적) : 쓰기 성능이 유지되나, 복제본에 최신 데이터가 즉시 반영되지 않을 수 있다.

-> 고가용성(서비스 지속성), 데이터 유실 방지 및 데이터 백업(Replica 복제본 관리), 부하 분산(Replica로 요청분산) 등의 다양한 이점.

Last updated