밤빵's 개발일지
[TIL]20240926 데이터 복제(Replication)&샤딩(Sharding) 본문
분산시스템에 대해서 관심이 많아지고, 데이터베이스의 확장성이나 성능에 대해 공부하면서 데이터 복제(Replication)와 샤딩(Sharding)이라는 용어를 알게 되었는데, 두 개념이 무엇인지, 왜 중요한지 알아보기 위해 학습을 시작했다. 데이터베이스에서의 성능 최적화와 안정성은 서비스 규모가 커질수록 중요한 요소가 되고, 이를 위한 방법인 데이터 복제와 샤딩에 대해 이해가 필요하다고 생각했다.
▶ 데이터 복제(Replication)란?
데이터 복제는 하나의 데이터베이스를 여러 개의 복제본(Replica)으로 복사하여 유지하는 기술이다. 여러 개의 복제본을 통해 데이터를 분산시켜 여러 서버에서 읽기 요청을 처리할 수 있고, 이를 통해 시스템의 가용성과 읽기 성능을 향상시킬 수 있다.
▷동작 방식:
→ 마스터-슬레이브 복제(Master-Slave Replication):
데이터베이스는 하나의 마스터 노드에서만 쓰기 작업이 가능하고, 다른 슬레이브 노드들은 마스터에서 데이터를 복제하여 읽기 전용 작업을 수행한다. 읽기 부하가 큰 서비스에서 효과적이다.
→ 마스터-마스터 복제(Master-Master Replication):
여러 마스터 노드가 존재하고, 각 마스터 노드는 서로 데이터를 동기화하여 읽기와 쓰기 작업을 모두 처리할 수 있다. 이 방식은 데이터 동기화가 복잡해질 수 있지만, 수평 확장에 유리하다.
▷데이터 복제를 사용해야 하는 이유:
→ 높은 가용성(High Availability):
한 서버가 다운되더라도 다른 복제본이 있기 때문에 서비스 중단을 방지할 수 있다.
→ 읽기 성능 향상:
읽기 요청이 많은 경우, 여러 복제본에서 분산 처리하여 성능을 크게 향상시킬 수 있다.
→ 백업 용이성:
데이터를 여러 곳에 복제해두기 때문에 백업의 개념으로 사용할 수 있다.
▷예시 상황:
대규모 쇼핑몰 서비스를 운영한다고 가정하고, 수많은 사용자가 상품 검색과 조회를 진행한다고 했을 때 데이터베이스에 많은 읽기 요청이 몰리게 된다. 이 경우 마스터-슬레이브 복제를 통해 마스터 노드는 쓰기 작업에 집중하고, 여러 슬레이브 노드에서 읽기 요청을 처리하게 하면 성능이 크게 향상될 수 있다.
▶샤딩(Sharding)이란?
샤딩은 데이터베이스를 여러 개의 샤드(Shard)로 분할하여 저장하는 방법이다. 하나의 대규모 데이터베이스를 여러 개의 작은 데이터베이스로 나누어 저장하는 방식으로, 이를 통해 데이터가 너무 커져서 하나의 데이터베이스에서 처리할 수 없는 상황을 방지하고, 데이터베이스의 성능과 확장성을 높일 수 있다.
▷동작 방식:
→ 수평 샤딩(Horizontal Sharding):
동일한 스키마의 데이터를 여러 샤드에 나누어 저장하는 방식으로, 사용자 테이블의 데이터를 사용자 ID 범위에 따라 여러 샤드로 분배할 수 있다.
→ 수직 샤딩(Vertical Sharding):
테이블 자체를 분리하여 다른 샤드에 저장하는 방식으로, 사용자 정보는 하나의 샤드에, 주문 정보는 또 다른 샤드에 저장하는 방식이다.
▷샤딩을 사용해야 하는 이유:
→ 데이터 확장성(Scalability):
데이터를 여러 샤드에 나누어 저장하면, 각 샤드가 독립적으로 동작할 수 있기 때문에 데이터베이스의 용량 제한 없이 확장할 수 있다.
→ 성능 향상:
데이터가 분산 저장되기 때문에 각각의 샤드가 처리해야 하는 데이터 양이 줄어들어 성능이 향상된다.
→ 장애 격리(Fault Isolation):
하나의 샤드에 문제가 발생해도 다른 샤드에 영향을 미치지 않기 때문에, 장애 격리 측면에서 유리하다.
▷예시 상황:
만약 사용자 수가 수백만 명에 달하는 SNS 플랫폼을 운영한다고 가정했을 때, 모든 사용자의 데이터를 하나의 데이터베이스에 저장하면 성능 저하가 발생할 수 있다. 이 경우 사용자 ID 범위에 따라 데이터를 여러 샤드로 분리해 저장하면 각 샤드가 나누어 데이터를 처리하므로 성능이 개선될 수 있다.
데이터 복제(Replication)와 샤딩(Sharding)은 데이터베이스 확장성과 성능을 향상시키는 데 중요한 역할을 하지만, 각각 몇 가지 단점이 있다.
▶ 데이터 복제(Replication)의 단점
→ 쓰기 성능 저하:
데이터 복제에서는 쓰기 작업이 모든 복제본에 적용되어야 하기 때문에, 쓰기 작업이 많을 경우 성능이 저하될 수 있다. 특히 마스터-슬레이브 복제에서 쓰기는 오직 마스터 노드에서만 가능하기때문에, 쓰기 부하가 집중되면 병목 현상이 발생할 수 있다.
→ 데이터 일관성 문제:
여러 복제본 간에 데이터가 동기화되지 않을 경우, 일관성 문제(Consistence Issues)가 발생할 수 있다. 하나의 슬레이브 노드에서 읽은 데이터와 다른 슬레이브에서 읽은 데이터가 다를 수 있다. 이러한 데이터 불일치 문제는 특히 쓰기 작업이 빈번하게 일어나는 시스템에서 문제가 될 수 있다.
→ 관리 복잡성 증가:
복제본이 많아질수록 데이터 동기화와 시스템 관리가 더 복잡해진다. 복제본 사이의 데이터 일관성을 유지하는 것은 큰 도전이 될 수 있고, 장애가 발생했을 때 복제본 간의 복구 작업도 까다롭다.
→ 복제 지연(Lag):
마스터와 슬레이브 사이에서 데이터 동기화에 지연이 발생할 수 있다. 실시간으로 데이터를 동기화하지 않는다면, 슬레이브에서 읽은 데이터가 최신이 아닐 가능성이 있어 사용자 경험에 영향을 미칠 수 있다.
▶샤딩(Sharding)의 단점
→ 복잡한 설계 및 관리:
샤딩은 데이터를 여러 샤드로 나누는 작업이기 때문에, 샤딩 기준(예: 사용자 ID, 지역 등)을 어떻게 설정할지 설계가 복잡하다. 또한, 새로운 샤드를 추가하거나 데이터를 재분배해야 할 때 관리가 어렵고 시간이 많이 소요될 수 있다.
→ 데이터 일관성 유지 어려움:
여러 샤드에 데이터가 분산되면, 각 샤드 간의 데이터 일관성을 유지하기 어려울 수 있다. 특히 트랜잭션을 여러 샤드에 걸쳐 수행해야 하는 경우, 트랜잭션 일관성을 보장하기 위한 복잡한 처리가 필요하다.
→ 분산 트랜잭션의 어려움:
분산된 샤드 간의 트랜잭션을 관리하는 것은 어려운 과제이다. 여러 샤드에서 동시에 데이터를 업데이트하거나 읽어야 하는 경우, 분산 트랜잭션을 처리하기 위한 기술적 복잡성이 추가된다.
→ 운영 비용 증가:
샤딩을 도입하면 물리적 서버나 인프라 자원이 늘어나면서, 비용이 증가할 수 있다. 각 샤드에 대한 모니터링, 백업, 장애 복구 등을 관리해야 하므로 인프라 운영 비용과 복잡성이 더해진다.
→ 동적 샤딩 어려움:
처음에 잘못된 샤딩 키나 기준을 설정하면, 데이터를 재분배하는 작업이 매우 어렵고 시스템에 부담을 줄 수 있다. 샤드의 크기 불균형 문제도 발생할 수 있고, 이를 해결하기 위한 동적 샤딩 작업은 성능에 큰 영향을 미칠 수 있다.
▶데이터 복제와 샤딩의 차이점
데이터 복제와 샤딩은 모두 대규모 데이터베이스의 성능을 향상시키는 방법이지만, 그 목적과 방식이 다르다.
비교 항목 | 데이터 복제(Replication) | 샤딩(Sharding) |
목적 | 가용성 및 읽기 성능 향상 | 데이터 용량 분산 및 쓰기 성능 향상 |
데이터 분산 방식 | 동일한 데이터를 여러 복제본에 저장 | 서로 다른 데이터를 여러 샤드에 나누어 저장 |
장점 | 고가용성, 백업 용이, 읽기 성능 향상 | 데이터 확장성, 성능 향상, 장애 격리 |
단점 | 쓰기 부하가 높아질 수 있음, 데이터 일관성 문제 발생 가능 | 데이터 일관성 유지가 어려움, 복잡한 데이터 분배 알고리즘 필요 |
사용 사례 | 읽기 요청이 많은 서비스 (e.g., 상품 조회, 뉴스 사이트) | 대규모 데이터 저장 및 처리 (e.g., SNS, 대형 전자 상거래) |
▶ 데이터 복제와 샤딩의 통합 사용
대규모 서비스에서는 데이터 복제와 샤딩을 함께 사용하는 경우도 많다. 예를 들어, 데이터를 여러 샤드로 나누어 분산 저장하고, 각 샤드 내에서 복제를 적용해 읽기 성능을 높이는 통합 방식은 데이터베이스의 확장성과 성능을 극대화하는 데 도움이 된다.
▶결론
데이터 복제는 동일한 데이터를 여러 복제본에 저장하여 읽기 성능과 가용성을 향상시키는 방법이지만 쓰기 성능 저하와 데이터 일관성 문제가 발생할 수 있고, 샤딩은 데이터를 여러 샤드로 분리해 저장하여 성능을 높이고 확장성을 확보하는 방법이지만 설계와 관리가 복잡해서 분산 트랜잭션 관리가 어렵다. 두 기술은 각각의 장단점이 있으며, 서비스의 특성에 따라 적절히 선택하거나 통합하여 사용할 수 있다.
'개발Article' 카테고리의 다른 글
[TIL]20240928 RAG (0) | 2024.09.28 |
---|---|
[TIL]20240927 비동기처리와 멀티쓰레드 (0) | 2024.09.28 |
[TIL]20240925 서버 사이드 렌더링(SSR)과 클라이언트 사이드 렌더링(CSR) 비교 (0) | 2024.09.25 |
[TIL]20240924 H2 데이터베이스 사용법 (2) | 2024.09.24 |
[TIL]20240923 클린 코드(Clean Code)작성 원칙 (0) | 2024.09.23 |