샤딩과 파티셔닝
DB 보안 회사를 다니고 있고 대규모의 서비스가 기본인 현 시대에 파티셔닝과 샤딩에 대해 많이 들었지만 자세히 알지는 못했다.
이번기회에 한번 정리를 해보자.
#파티셔닝
파티셔닝은 퍼포먼스, availability, maintainablity를 목적으로 논리적인 데이터를 다수의 엔티티로 분할하는 행위를 뜻한다. 대부분의 DBMS에서 지원하지만 Mysql 5.1 미만에서는 지원하지 않는다. 샤딩 또한 이 파티셔닝의 한 종류이다.
수평 파티셔닝 (horizotal partitioning, Range Based Partitioning)
샤딩과 동일한 의미를 가지며 스키마를 다수의 복제본을 구성하고 각각의 샤드에 샤드키를 기준으로 데이터를 분리하는 것을 말한다. DBA가 데이터의 패턴과 저장공간을 잘 알고 샤드키를 선정하여 분할한다.
수직 파티셔닝 (vertical partiioning) - 샤딩
하나의 엔티티에 저장된 데이터의 양을 쪼개는것이 아닌 컬럼을 분할한다. (보안상의 이유나 포퍼먼스의 이유)
관계형 데이터베이스에서 대량의 데이터를 처리하기 위해서 데이터를 파티셔닝 하는 기술이다. DBMS 레벨에서 데이터를 나누는 것이 아니고 데이터베이스 자체를 분할하는 방식으로 어플리케이션 레벨에서 구현해야한다.
Key or Hash Based Partitioning
엔티티를 해쉬함수에 넣어서 나오는 값을 이용해서 서버를 정하는 방식. (사용자의 ID가 숫자로만 이루어져 있는 경우에는 나머지 연산을 이용한다.)
주의 : 해시결과 데이터가 균등하게 분포되도록 해시함수를 정해야한다. (해시함수를 바꾸는 것은 거의 불가능에 가깝기에 균등하게 나눌 수 있는 해시함수 선정이 중요하다.)
Directory Based Partitioning
파티셔닝을 제공하는 특정 서비스를 만드는 것을 의미한다. DB와 cache를 적절히 조합해서 만들거나 샤드키를 조절하는 방법등 여러가지가 있다.
#샤딩시 고려사항
- 데이터 재분배
-> 샤딩을 진행 한 DB의 물리적인 용량한계와 성능한계가 왔을 경우 적절하게 shard수를 scale-up 작업을 늘릴 수 있도록 설계해야한다. (확장고려)
- 샤딩으로부터 데이터 조인
-> 샤딩된 데이터베이스간에 조인이 불가능하기 때문에 어느정도의 데이터 중복은 감안해야 한다.
- 파티셔닝 잘 구현하기
-> 샤딩의 기준이되는 샤드키를 잘 정하거나 hash의 경우 함수를 잘 선택해야 한다.
- 샤드된 DBMS들의 트랜잭션 문제
-> XA와 같은 Global Transaction을 사용하면 샤딩된 데이터베이스간에 트랜잭션이 가능하나 성능저하의 문제가 있다.
- Global Unique Key
-> 샤딩에 경우 DBMS에서 제공하는 auto-increment를 사용하면 key가 중복될 가능성이 있기 때문에 application 레벨에서 key 생성을 담당해야 한다.
- 데이터 축소
-> Table 단위를 가능한 작게 만들자.
출처 : http://theeye.pe.kr/archives/1917
출처 : http://genesis8.tistory.com/21
'데이터베이스' 카테고리의 다른 글
[공유] store procedure를 사용하는 이유 (0) | 2018.07.13 |
---|