Paritioning
큰 테이블이나 인덱스를 관리하기 쉬운 크기로 분리하는 방법
- 단점: 파티션 제약이있다.= 테이블과 인덱스를 별도로 파티션 할 수 없다.
1. Horizontal Partitioning
- 데이터 개수를 기준으로 나누어 partitioning 하는 방법이다. sharding이 horizontal partitioning 과 관련있다. 같은 테이블 스키마를 가진 데이터를 데이터베이스 여러개에 분산하여 저장하는 방법을 일컫는 용어이기 때문이다. 때문에 Sharding을 Horizontal Partition`이라고 볼 수도 있다.
2. Vertical Partitioning
- 테이블의 칼럼을 기준으로 데이터를 나눈다.
- 이미 정규화된 데이터를 분리하는 과정으로 생각해야한다.
- 자주 사용하는 칼럼을 분리하여 성능향상을 얻을 수 있다.
3. Sharding
- DBMS 한 개로 처리할 수 있는 데는 한계가 있으므로 *데이터베이스 여러 개를 사용**하는 방식으로 데이터 조회 한계를 극복해야 한다. 이를 위해 분산 환경을 고려해 만들어진 데이터베이스를 이용하는 방법도 있지만 범위 검색에 취약하거나 JOIN 연산을 사용할 수 없는 등 기능에 제약이 많다. *따라서 상대적으로 풍부한 기능을 사용하면서 데이터 확장을 꾀할 수 있는 방법은 RDBMS를 샤딩(sharding)하여 사용하는 것이다.**계속 증가하는 데이터에 장애 없이 효과적으로 대응할 수 있어야 하고 서비스마다 다른 데이터 특성과 모델에 어떻게 대처할 것인가가 샤딩 플랫폼의 핵심이다.
궁금증
-
서로 다른 데이터베이스에 있는 테이블들을 join 할 수 있다고...?? → 같은 데이터베이스엔진이면 가능
-
내가 찾는 데이터가 몇번샤드에 있는지 찾는거..는..? → 알고리즘에 따라 다르다
-
샤딩과 horizontal partitioning 의 비교
수평 분할(Horizontal Partitioning)이란 스키마가 같은 데이터를 두 개 이상의 테이블에 나누어 저장하는 디자인을 말한다. 가령 같은 주민 데이터를 처리하기 위해 스키마가 같은 ‘서현동주민 테이블'과 ‘정자동주민 테이블'을 사용하는 것을 말한다. 인덱스의 크기를 줄이고, 작업 동시성을 늘리기 위한 것이다. 보통 수평 분할을 한다고 했을 때는 하나의 데이터베이스 안에서 이루어지는 경우를 지칭한다.
이에 비해, 샤딩은 물리적으로 다른 데이터베이스에 데이터를 수평 분할 방식으로 분산 저장하고 조회하는 방법을 말한다. ‘주민’ 테이블이 여러 DB에 있을 때 서현동 주민에 대한 정보는 A DB에, 정자동 주민에 대한 정보는 DB에 저장되도록 하는 방식이다. 여러 데이터베이스를 대상으로 작업해야 하기 때문에 경우에 따라서는 (JOIN 등) 기능에 제약이 있을 수 있고 일관성(consistency)과 복제(replication) 등에서 불리한 점이 많다. 예전의 샤딩은 애플리케이션 서버 레벨에서 구현하는 경우가 많았지만 최근에는 이를 플랫폼 차원에서 제공한다.
- 샤딩의 한계
- 두 개 이상의 샤드에 대한 JOIN 연산을 할 수 없다.
- auto increment 등은 샤드 별로 달라질 수 있다.
- last_insert_id() 값은 유효하지 않다.
- shard key column 값은 update하면 안된다.
- 하나의 트랜잭션에서 두 개 이상의 샤드에 접근할 수 없다.