728x90
데이터가 한 서버로 감당하기 어려울 만큼 커지면(VLDB, Very Large DBMS), 데이터를 여러 서버에 나눠 저장해야 합니다. 이것이 샤딩(Sharding)입니다. 이 글은 샤딩의 개념과 종류를 정리하고, MariaDB의 Spider 스토리지 엔진으로 실제 샤딩을 구성한 실습을 담습니다.
샤딩 · 파티셔닝 · 복제, 무엇이 다른가
| 기법 | 방식 | 주로 향상되는 성능 |
| 파티셔닝(Partitioning) | 한 서버 안에서 테이블을 논리적으로 분할 | 관리·조회 효율 |
| 샤딩(Sharding) | 여러 서버(샤드)에 데이터를 물리적으로 분산 | 쓰기(Write) 성능 |
| 복제(Replication) | 같은 DB를 여러 대(마스터/슬레이브)로 복사 | 읽기(Read) 성능 |
한 줄 요약: 쓰기가 병목이면 샤딩, 읽기가 병목이면 복제입니다. 파티셔닝은 한 서버 내 분할이고, 샤딩은 서버 자체를 나눈다는 점이 핵심 차이입니다.
샤딩의 종류
- 수직(Vertical) 샤딩: 테이블 단위로 분할. 연령·성별 등 기준으로 데이터 성격에 따라 다른 샤드에 저장.
- 수평(Horizontal) 샤딩: 같은 테이블을 여러 조각으로 분할. 지역·국가별로 동일 구조를 나눠 담는 경우.
데이터를 어떤 규칙으로 어느 샤드에 보낼지(샤드 키 전략)도 여러 방식이 있습니다.
| 방식 | 기준 |
| 범위(Range) | 값 구간으로 (a–m / n–r / s–z) |
| 해시(Hash) | 해시 함수로 균등 분배 — 샤드별 크기가 비슷 |
| 리스트(List) | 특정 컬럼의 지정된 값 목록으로 |
| 컴포지트(Composite) | range-hash, range-list 등 조합 |
Spider 엔진으로 샤딩 구성하기
MariaDB의 Spider 엔진은 여러 백엔드 DB를 하나의 논리 테이블처럼 묶어 주는 샤딩 플랫폼입니다. 구성은 "스파이더 노드 1대 + 실제 데이터 노드 여러 대" 형태입니다.
1. 컨테이너 준비 (스파이더 1 + 데이터 노드 2)
docker pull mariadb:10.1
docker run -d -e MYSQL_ROOT_PASSWORD=sample --name=spider mariadb:10.1
docker run -d -e MYSQL_ROOT_PASSWORD=sample --name=sample1 mariadb:10.1
docker run -d -e MYSQL_ROOT_PASSWORD=sample --name=sample2 mariadb:10.1
# 각 노드 IP 확인 (서버 등록 시 필요)
docker inspect spider | grep "IPAddress"
docker inspect sample1 | grep "IPAddress"
docker inspect sample2 | grep "IPAddress"
2. 스파이더 노드에 Spider 엔진 설치
docker exec -it spider bash
mysql -u root < /usr/share/mysql/install_spider.sql
SHOW ENGINES; -- 목록에 SPIDER가 보이면 설치 완료
3. 데이터 노드(sample1, 2)에 접속 계정 생성
USE mysql;
CREATE USER 'spider-test'@'%' IDENTIFIED BY 'sample';
GRANT ALL ON *.* TO 'spider-test'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
4. 스파이더 노드에 백엔드 서버 등록
Spider가 접속할 데이터 노드 정보를 CREATE SERVER로 등록합니다.
CREATE SERVER sample1 FOREIGN DATA WRAPPER mysql OPTIONS(
HOST '172.17.0.x', DATABASE 'sampleDB',
USER 'spider-test', PASSWORD 'sample', PORT 3306);
CREATE SERVER sample2 FOREIGN DATA WRAPPER mysql OPTIONS(
HOST '172.17.0.y', DATABASE 'sampleDB',
USER 'spider-test', PASSWORD 'sample', PORT 3306);
SELECT * FROM mysql.servers; -- 등록 확인
5. 샤딩 테이블 생성
데이터 노드에는 일반 테이블을, 스파이더 노드에는 ENGINE=SPIDER + PARTITION BY KEY 테이블을 만들어 두 노드로 분산되게 합니다.
-- sample1, sample2 각각에서: 실제 저장 테이블
CREATE DATABASE sampleDB; USE sampleDB;
CREATE TABLE shardingTest (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
address VARCHAR(255) NOT NULL,
PRIMARY KEY(id)
);
-- spider 노드에서: 논리 샤딩 테이블
CREATE DATABASE sampleDB; USE sampleDB;
CREATE TABLE shardingTest (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
address VARCHAR(255) NOT NULL,
PRIMARY KEY(id)
) ENGINE=SPIDER COMMENT='wrapper "mysql", table "shardingTest"'
PARTITION BY KEY(id) (
PARTITION sample1 COMMENT='srv "sample1"',
PARTITION sample2 COMMENT='srv "sample2"'
);
동작 확인
스파이더 노드에서 데이터를 넣으면 id의 KEY 해시에 따라 sample1·sample2로 자동 분산됩니다.
-- spider 노드에서 INSERT
USE sampleDB;
INSERT INTO shardingTest(name, address) VALUES ('kim','seoul'), ('lee','busan'), ('park','jeju');
SELECT * FROM shardingTest; -- 전체가 합쳐져 보인다
이제 각 데이터 노드(sample1, sample2)에 직접 접속해 SELECT * FROM shardingTest를 해 보면, 데이터가 두 노드에 나뉘어 저장된 것을 확인할 수 있습니다.
정리
- 샤딩은 데이터를 여러 서버로 물리 분산해 쓰기 성능과 저장 한계를 확장한다.
- 파티셔닝(한 서버 내)·복제(읽기 확장)와 목적이 다르다.
- 분산 규칙은 range/hash/list/composite 중 선택한다.
- MariaDB에서는 Spider 엔진 + CREATE SERVER + PARTITION BY KEY로 샤딩을 구현한다.
728x90
'mysql' 카테고리의 다른 글
| 복제 Replication (0) | 2018.12.19 |
|---|---|
| show processlist 에 where 조건 사용하기 (0) | 2018.12.19 |
| 트랜잭션 Transcation, 락 Lock, 격리수준 IsolationLevel (0) | 2018.12.18 |
| 파티셔닝 Partitioning (0) | 2018.12.17 |
| Azure Linux VM에서 MySQL 성능 최적화 (0) | 2016.06.16 |
댓글