Database

[DB] Database의 샤딩(Sharding)

프로그래민 2022. 2. 8. 20:41
반응형

샤딩이란

샤딩(Sharding)을 알기전 우선 샤드의 사전적 의미를 보면 조각 또는 파편을 의미한다. 즉, 데이터베이스에서의 샤딩(Sharding)한 테이블의 row들을 여러 개의 서로 다른 테이블, 즉 파티션으로 물리적으로 분리하는 것이다. row들을 여러 개의 서로 다른 테이블로 분해하는 것이기 때문에 한 테이블을 Horizontal Partitioning 했다고 볼 수 있다.

Vertical Partitions and Horizontal Partitions

샤딩은 보통 전체 데이터베이스 하나의 테이블에 전부 들어가기 힘든 데이터가 등장하고 DBMS가 테이블을 관리하기 힘들어짐에 따라 적용하게 된다. 데이터베이스를 샤딩하게 되면 기존에 하나로 구성될 스키마를 다수의 복제본으로 구성하고 각각의 샤드에 어떤 데이터가 저장될지를 샤드키를 기준으로 분리하게 된다.

주로 applicaton level에서 실행되며 어떤 샤드로 읽기와 쓰기를 전송할지를 정의하는 코드를 가지게 된다. 다만 어떤 데이터베이스에서는 내장된 샤딩 기능이 있어서 database level에서 실행될 때도 있다.

 

샤딩의 장단점

장점

  • Scale-Out이 가능
  • 스캔 범위를 줄여서 쿼리 반응 속도를 빠르게 함
  • 장애가 샤드 단위로 발생함

단점

  • 프로그래밍 복잡도가 증가
  • 데이터가 한 쪽 샤드로 몰릴 경우(Hotspot), 샤딩이 무의미 해짐
  • 잘 못 사용할 경우 risk가 큼
  • 한번 샤딩 사용시 샤딩 이전의 구조로 돌아가기 힘듬

샤딩은 위와 같이 프로그래밍, 운영적 복잡도가 높아지는 단점이 있습니다. 따라서 가능하다면 샤딩을 피하는 방법을 사용하는 것이 좋습니다. 대표적인 방법으로는 데이터베이스 서버의 Scale-Up, Read의 부하가 클 경우 Cache 사용 및 Database Replication, 테이블의 일부 컬럼만 주로 사용할 경우 Vertical Partitioning 등의 방법이 있습니다.

 

여러가지 샤딩 방식

데이터를 어떻게 나뉘어진 데이터베이스에 분산시키고, 이렇게 분산된 데이터를 어떻게 읽어올 것 인지는 샤드키(shard key)를 어떻게 정하는지에 따라 달라진다. 최대한 샤드들에게 균일하게 분산하는 것이 좋은데 그러기 위해선 다음과 같은 방법들이 있다.

Hash Sharding

Algorithm Sharding

데이터베이스의 id를 hashing 샤딩하는 방식이다. 즉 간단히 하면 샤드키를 id%num을 하여 정하는 방식이다. 다만 한번 나눌 갯수를 정해놓으면 수정하지 못한다는 단점이 있고, 단순한 hashing 방식이기에 데이터가 저장되는 공간적 효율에 대한 고려는 따로 할 수가 없게 된다.

Dynaminc Sharding

Dynaminc Sharding

이름대로 Dynamic하게 샤딩하는 방식이다. 즉, 일종의 Locator Service를 통하여 샤드 키를 정하는 방식이다. Locator Service를 한번 거쳐서 샤드키를 얻기 때문에 확장에 유연한 방식이다. 하지만 데이터의 재배치등에 있어서 Locator Service도 변환해야하기 때문에 Locator에 의존적인 단점이 있다.

Entity Group

Entity Group

위의 key-value 방식인 Hash Sharding과 Dynaminc Sharding과는 다르게 동일한 파티션에 관련 엔티티를 저장하여 단일 파티션 안에서 추가 기능을 제공하는 방식이다. 즉, 관련된 데이터에 대해 하나의 샤드를 이용하는 방식이다. 하나의 물리적인 샤드를 사용하기에 쿼리진행시 효과적이며 응집도가 높아진다는 장점이 있다. 하지만 다른 샤드와 관련된 쿼리를 사용하게 된다면 샤드를 사용 안했을 때 보다 성능이 더 떨어질 수 도 있다는 단점이 있다.

 

 

출처

https://www.digitalocean.com/community/tutorials/understanding-database-sharding
https://velog.io/@matisse/Database-sharding%EC%97%90-%EB%8C%80%ED%95%B4
https://sophia2730.tistory.com/entry/Databases-Database-Sharding%EC%83%A4%EB%94%A9
https://nesoy.github.io/articles/2018-05/Database-Shard
반응형

'Database' 카테고리의 다른 글

[NoSQL] Redis란  (2) 2021.07.03
[DB] HikariCP의 옵션  (0) 2021.03.31
[DB] Database Connection Pool이란  (0) 2021.01.04