본문 바로가기
mysql

샤딩 sharding

by ┌(  ̄∇ ̄)┘™ 2018. 12. 19.
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

댓글