엄범


* 파티셔닝 = 단편화

 

저장해야 하는 정보가 많은 대규모 시스템의 경우 하나의 DB에 모든 정보를 저장해서는 제대로 된 응답성을 기대할 수 없다.

read가 많이 발생하든, write가 많이 발생하든 DB 저장하는 정보가 많을 수록 스캔 속도도 느려지고, 요청이 많은 경우 큐에 작업이 쌓이면서 응답도 느려진다.

 

그래서 DB를 여러대 운용해서 응답을 좀 분산해보자, 라는 생각을 하게 되는데, 가장 쉽게 생각해 볼만한건 Master DB의 데이터를 복제한 Slave DB를 두고, read를 분산하는 것이다. 스캔 속도는 그대로겠지만 요청을 분산할 수 있다.

그러나 이런 방법은 write가 발생할 때 마다 Master에 쓰고 이를 Slave로 동기화해주어야 하니 write는 분산할 수 없다.

 

그래서 아예, 분산 DBMS는 DB가 가지고 있는 테이블을 분할해서 나눠가지는 방법을 사용한다. 이 것이 파티셔닝(단편화)이다.

 

파티셔닝은 크게 수평 단편화와 수직 단편화로 나눌 수 있다.

RAID와는 다르다. RAID는 DB와 독립적인 개념으로 디스크를 여러 개 사용하는 거고, 이 여러개의 디스크가 결국 논리적으로는 하나의 디스크 처럼 보이게 하는 기술이다. 즉, DB에서 사용할 때는 하나의 DBMS 내에서 디스크를 여러 개 사용하는거라고 볼 수 있다. 반면 파티셔닝은 DB를 여러 개로 분산하는 것이다. DB는 현재 디스크가 RAID인지는 모를 수 있고, partitioning에 대해서는 반드시 알 수 밖에 없다.

 

수평 단편화 = 샤딩 (sharding = horizontal partitioning)

샤딩은 결국 테이블을 수평으로 쪼개는 것이기 때문에, 어떤 DB에 해당 데이터가 있을지 찾아갈 수 있어야 한다. 요청 마다 모든 DB를 뒤질 수는 없으니까.

해당 데이터가 존재하는 DB를 잘 찾아갈 수 있도록 Key를 잘 설계하는 것이 중요하다.

2019/01/18 - [DB] - 확장성 해싱 VS 선형 해싱 : Shard key

 

수직 단편화 ( vertical partitioning )

일반적으로 엔티티를 분리할 때 처럼, 컬럼을 나눠 새로운 테이블로 만들어서 나눠갖는 것.

이렇게 나누는 경우는 보통 어떤 컬럼이 빈번하게 참조될 때다. 왜냐면 한 row가 작아서 상대적으로 여러 row가 캐시에 올라갈 수 있고, 이는 즉 해당 컬럼의 여러 데이터가 캐시에 올라갈 수 있다는 말이 되어 Hit rate가 좋아진다.