서비스의 형태가 다양해지고 커지면서 최소 천만건 이상의 데이터를 처리하고 저장하는 VLDB(Very Large Database) 형태가 되었다. 이로 인해 응답/처리 속도의 저하, 장애 증가, 비용 증가 등의 이슈들이 발생하게 됐다. 이에 대한 해결 방안으로 대표적으로 Table 레벨에서는 Partitioning, DB 레벨에서는 Sharding 기법들을 사용하고 있다.
Table을 분할하여 가용성, 관리용이성, 성능을 향상시키기 위해 사용한다.
정규화(Nomalization)된 Table에서 Column의 사용 빈도에 따라 추가적으로 분할하는 방식이다. Table이 변경되며, 조회 시에 Table Join에 대한 비용이 발생한다.
데이터를 특정 기준에 따라 분할한다. 데이터가 있는 Partition을 찾기 위한 비용이 발생한다.
데이터의 범위를 지정하여 분할한다.
Hash 함수를 활용해 분할한다.
특정 값으로 데이터를 분할한다.
Partitioning을 해도 효과적으로 관리하기 힘든 경우 Sub-Paritioning을 추가하여 분할한다.
ex) Range-Hash, Hash-List
DB를 확장하는 방법은 Partitioning과 동일하게 수직과 수평 2가지 방식이 있다. 수직으로 확장하는 것은 Scale-Up을 의미한다. Sharding은 수평적으로 확장하는 방식으로 Scale-Out된 DB Node들에 데이터를 분할하여 각 Shard Node에 저장한다.
Sharding은 데이터 분할 방법과 이로 인한 이점들은 Partitioning과 비슷하나 DB를 물리적으로 분산시켜 크기를 줄이고, 트래픽 부하 분산을 목표한다 점에서 다르다.
Sharding은 잘못 설계될 경우 데이터가 소실되거나 부하의 불균형이 발생할 수 있다. 또한 구현이 복잡하기 때문에 DB 이전 구조로 되돌리기가 어렵다. 그러나 서비스의 규모가 커질 것을 예상해서 Sharding될 가능성을 어느정도는 고려하여 설계해야 한다.
Partitioning과 동일하게 정규화(Nomalization)된 Table에서 Column의 사용 빈도에 따라 추가적으로 분할하는 방식이다. Table이 변경되며, 물리적으로 분리되었기 때문에 Join이 불가능하다.
범위를 기준으로 Shard Node를 특정한다.
해시 함수를 통해 Shard Node를 특정한다.
Shard Node 정보를 가진 Table을 통해 Shard Node를 특정한다.