안동민 개발노트 아이콘

안동민 개발노트

14장 : NoSQL과 분산 데이터베이스

분산 데이터베이스 기초

데이터를 여러 서버에 나누어 운영할 때 가장 먼저 만나는 기법이 레플리케이션(Replication)샤딩(Sharding)입니다. 레플리케이션은 같은 데이터를 복제해 읽기와 가용성을 보강하고, 샤딩은 데이터를 분할해 저장 용량과 쓰기 부하를 나눕니다. 대신 복제 지연, 장애 조치, 샤드 키, 분산 트랜잭션 같은 운영 비용이 함께 생깁니다.


분산 데이터베이스가 필요한 이유

분산 목적주로 쓰는 기법설명
읽기 확장레플리케이션읽기 요청을 복제본으로 분산
쓰기 확장샤딩데이터를 나누어 특정 서버에 쓰기 부하가 몰리지 않게 함
고가용성레플리케이션장애 시 다른 복제본을 기준점으로 승격
지역 분산멀티 리전 복제사용자와 가까운 리전에서 읽고, 쓰기 정책은 별도로 설계

레플리케이션

레플리케이션은 같은 데이터를 여러 서버에 복사하여 가용성과 읽기 성능을 높이는 기법입니다. 다만 복제본이 항상 즉시 같은 상태라는 뜻은 아니며, 동기화 방식과 읽기 설정에 따라 사용자가 보는 데이터가 달라질 수 있습니다.


Primary-Replica (기존 Master-Slave)

가장 흔한 레플리케이션 구조입니다. 하나의 Primary가 쓰기 기준점이 되고, Replica는 변경 로그를 따라가며 읽기 부하 분산이나 장애 대비에 활용됩니다. 기존 문헌의 Master-Slave라는 표현은 요즘 Source-Replica 또는 Primary-Replica로 바꾸어 쓰는 추세입니다.

장점주의점
읽기 부하를 Replica로 분산최신 읽기가 필요하면 Primary 또는 강한 읽기 설정 필요
장애 시 Replica 승격 가능비동기 복제에서는 lag와 rollback 가능성 존재
백업/분석 부하를 분리 가능쓰기 기준점은 여전히 Primary에 집중
구조가 비교적 이해하기 쉬움자동 failover와 클라이언트 재시도 설계 필요

복제 방식: 동기 vs 비동기

복제의 동기화 수준에 따라 데이터 일관성과 성능 사이의 트레이드오프가 달라집니다.


복제 지연(Replication Lag) 문제

비동기 복제에서 Primary와 Replica의 데이터가 일시적으로 다른 현상입니다. Replica 읽기는 빠르게 부하를 줄일 수 있지만, 방금 쓴 값을 반드시 즉시 읽어야 하는 업무에서는 read-after-write 보장이 깨질 수 있습니다.


Failover (장애 조치)

Primary 장애 시 적절한 Replica를 새로운 Primary로 승격하고, 클라이언트의 연결 경로를 다시 잡는 과정입니다. 선거와 승격이 끝날 때까지 쓰기가 멈출 수 있고, 비동기 복제에서는 마지막 일부 쓰기 처리 방식도 함께 고려해야 합니다.


Multi-Primary / Multi-Master

여러 노드 또는 리전에서 쓰기를 받을 수 있는 구조입니다. 쓰기 지연을 줄이거나 지역 가용성을 높일 수 있지만, 양쪽에서 동시에 같은 데이터를 수정하면 충돌이 발생하므로 충돌 해결 정책과 업무 규칙이 필요합니다.

비교Primary-ReplicaMulti-Primary
쓰기 경로Primary 중심여러 노드/리전에서 쓰기 가능
복잡도비교적 낮음충돌 해결과 수렴 정책 필요
충돌같은 Primary 안에서 통제동시 수정 충돌 가능
장애 대응선거와 승격 필요지역 장애에는 유리하지만 조율 필요
주요 사용일반 OLTP, 읽기 확장멀티 리전, 협업, 오프라인 동기화

샤딩

샤딩(Sharding)은 데이터를 여러 서버에 나누어 저장하는 기법입니다. 레플리케이션이 복사라면, 샤딩은 분할입니다. 단일 서버로 감당하기 어려운 저장량과 쓰기 부하를 나누지만, 샤드 키가 나쁘면 hot shard, scatter-gather query, cross-shard transaction 문제가 생깁니다.


샤드 키 선택

샤딩의 성패는 샤드 키(Shard Key) 선택에 크게 좌우됩니다. 좋은 샤드 키는 데이터가 고르게 퍼지고, 자주 실행하는 쿼리가 특정 샤드로 라우팅되며, 시간이 지나도 특정 범위에 쓰기가 몰리지 않게 합니다.


해시 기반 샤딩


범위 기반 샤딩


일관성 해싱

해시 기반 샤딩에서 샤드를 추가하거나 제거할 때 일관성 해싱(Consistent Hashing)은 데이터 재배치를 줄이는 대표 기법입니다. 다만 모든 제품이 일관성 해싱을 쓰는 것은 아니며, 예를 들어 Redis Cluster는 고정된 hash slot을 노드에 배분하는 방식을 사용합니다.


샤딩의 과제

샤딩은 강력하지만 여러 운영 과제를 수반합니다.


레플리케이션 + 샤딩 조합

실무에서는 레플리케이션과 샤딩을 함께 사용합니다.


합의 알고리즘

분산 시스템에서 여러 노드가 같은 순서와 같은 결정을 공유하도록 만드는 방법입니다. 모든 데이터 요청에 항상 합의가 들어가는 것은 아니지만, 리더 선출, 메타데이터 변경, 강한 복제, 분산 트랜잭션처럼 “하나의 기준점”이 필요한 곳에서 중요합니다.

알고리즘특징사용 제품/계열
Raft리더 기반, 이해하기 쉬운 로그 복제etcd, CockroachDB, TiKV 계열
Paxos합의 알고리즘의 이론적 근간Google Spanner, Chubby 계열
ZABZooKeeper의 원자 브로드캐스트 프로토콜Apache ZooKeeper
PBFT비잔틴 장애까지 고려일부 블록체인/허가형 네트워크

CAP 정리와 분산 DB

CAP 정리는 네트워크 분할이 생긴 상황에서 일관성(Consistency)과 가용성(Availability)을 동시에 완전하게 만족하기 어렵다는 관점입니다. 실무에서는 제품을 CP/AP로 고정해서 외우기보다, 장애 중 어떤 요청을 거절하고 어떤 읽기를 허용하는지, quorum과 복구 정책을 함께 봐야 합니다.


분산 DB 제품 비교


분산 데이터베이스 종합 정리

핵심 개념설명
레플리케이션같은 데이터 복사 → 읽기 확장, 가용성 보강
샤딩데이터 분할 → 쓰기 부하와 저장량 분산
일관성 해싱노드 변경 시 재배치 범위를 줄이는 해싱 기법
합의 알고리즘리더 선출, 로그 순서, 메타데이터 변경의 기준점
CAP 정리네트워크 분할 시 C와 A 사이의 장애 대응 선택
Failover장애 감지 후 기준 노드를 승격하고 경로 재설정
복제 지연비동기 복제에서 일시적 불일치와 rollback 위험
샤드 키데이터 분배와 쿼리 라우팅을 결정하는 설계 축

다음 절에서는 RDB와 NoSQL의 선택 기준을 다루겠습니다.