이번에 D2 Fest mini 프로젝트를 진행하면서, 대용량 아키텍처에 대해 처음으로 생각해보게 되었다. 서비스가 사용자가 많아지고 관리해야 될 데이터의 양이 많아 질 수록, 개발자는 보다 많은 짐을 얻게 된다. 어느 정도 몸짓이 커지면 어플리케이션단을 넘어서, 시스템 아키텍처를 고민하고 설계해야한다. 학부생때야 직접 서비스를 운영(그것도 아주 잘 나가는 서비스)해보지 않고서는 이런 고민을 할 일이 없다. 때문에 이번 공모전을 계기로 대용량 아키텍처를 공부하고 관련 내용을 기록으로 남겨보고자 한다. 개인적으로 회원 테이블에 대해, 휴면계정과 활성계정으로 파티셔닝을 적용해보면 하는 생각이 들었다.
휴면계정과 활성계정은 서로 간의 전환이 필요하다. 파티셔닝은 각 파티션 사이에 서로 이동이 없는 경우에 적합하다.
아래의 내용은 Mysql 기준이다.
Range Partiotioning
Partiotion Key의 연속된 범위로 파티션을 정의, 범위 기반으로 데이터를 여러 파티션에 균등하게 나눌 수 있는 경우, 파티션 키 위주로 검색이 자주 실행 될 경우 유용하다.
ex) 년별 데이터 : 2010년, 2011년 …..
CREATE TABLE employees (
id INT NOT NULL,
name VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
job_code INT NOT NULL,
store_id INT NOT NULL
) PARTITION BY RANGE (YEAR(hired)) (PARTITION p0 VALUES LESS THAN (2010) ,
PARTITION p1 VALUES LESS THAN (2011) ,
PARTITION p2 VALUES LESS THAN (2012) ,
PARTITION p3 VALUES LESS THAN MAXVALUE);
List Partitioning
Partiotion Key 값이 코드 값이나 카테고리와 같이 고정값일 경우 사용, 키 값이 연속적이지 않고 정렬 순서와 관계없이 파티션을 해야 할 경우 유용하다.
ex) 대륙별 데이터 : 한국 -> 아시아, 미국 -> 아메리카
CREATE TABLE employees (
id INT NOT NULL,
name VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
job_code INT NOT NULL,
store_id INT NOT NULL
) PARTITION BY LIST (job_code) (PARTITION p0 VALUES IN (3) ,
PARTITION p1 VALUES IN (1 , 9) ,
PARTITION p2 VALUES IN (2 , 6 , 7) ,
PARTITION p3 VALUES IN (4 , 5 , 8 , NULL));
Hash Partiotioning
Hash 함수결과의 n mode 값을 기준으로 파티션, Range나 List로 데이터를 균등하게 나누는 것이 어려울 때 사용
새롭게 파티션이 추가 될 경우, 파티션에 저장된 모든 레코드는 재배치 되야 함으로 많은 부하가 발생한다.
파티션 병합, 삭제, 분할 기능을 제공하지 않는다.
ex) Hash 함수를 기준으로 4개의 파티션을 나눔
CREATE TABLE employees (
id INT NOT NULL,
name VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
job_code INT NOT NULL,
store_id INT NOT NULL
) PARTITION BY HASH (id)
PARTITIONS 4;