분산 데이터베이스는 네트워크로 연결된 여러 서버(노드)에 걸쳐 데이터를 저장하며, 하나의 단일 논리적 데이터베이스로 관리됩니다. 분산 아키텍처는 수평적 확장(저렴한 범용 노드를 추가하여 용량 증가)과 자동 데이터 복제를 통한 고가용성을 가능하게 합니다. 주요 분산 아키텍처에는 두 가지가 있습니다. 하나의 노드가 모든 쓰기 작업을 담당하는 주/부(마스터/슬레이브) 방식과, 단일 병목 지점 없이 모든 노드에 데이터가 파티셔닝되는 공유 무인프라(shared-nothing) 방식입니다. 카우치베이스(Couchbase)는 자동 vBucket 기반 데이터 분산이 적용된 공유 무인프라 아키텍처를 사용하여, 탄력적인 확장성과 상시 가동 가용성이 필요한 애플리케이션에 자연스럽게 적합합니다.
주/보조 대 공유-나ッシング 아키텍처
| 차원 | 주/부 (마스터/슬레이브) | Shared-Nothing (마스터리스) |
| 데이터 소유권 | 기본(Primary)의 모든 데이터; 보조(Secondary)는 읽기 전용 복제본입니다 | 모든 노드에 분할된 데이터, 단일 소유자 없음 |
| 쓰기 확장성 | 제한됨: 모든 쓰기 작업은 하나의 프라이머리로 전달됨 | Linear: 쓰기가 모든 노드에 분산됨 |
| 읽기 확장성 | 좋습니다, 읽기 작업이 보조 서버에서 처리될 수 있다면요 | 우수함: 모든 노드에 분산된 읽기 작업 |
수평 확장
소수의 애플리케이션과 데이터를 위한 단일 데이터베이스 서버는 역사적으로 잘 작동해왔습니다. 그러나 대규모의 일반 사용자 기반에 노출될 경우, 이러한 서버의 용량을 늘리는 유일한 방법은 더 비싼 서버로 업그레이드하는 것뿐입니다.
용량을 늘리기 위해 데이터베이스 소프트웨어를 더 많은 메모리, 더 많은 디스크 공간, 더 많은 프로세서를 갖춘 다른 단일 머신으로 이전하세요. 이를 “수직적 확장(vertical scaling)”이라고 합니다. 이 접근 방식의 단점은 다운타임이 발생할 수 있다는 점입니다. 또한 단일 머신에서 얻을 수 있는 성능에는 한계가 있습니다.
안타깝게도 많은 데이터베이스, 특히 관계형 데이터베이스(RDBMS)는 분산 및 클러스터링되도록 설계되지 않았습니다.
하지만 분산 데이터베이스는 처음부터 탄력적 확장성을 지원하도록 만들어집니다. 더 많은 부하를 처리하기 위해 더 많은 리소스를 추가해야 합니까? 하나 이상의 추가 장에 데이터베이스 소프트웨어를 설치하고 이를 클러스터에 추가하기만 하면 됩니다.
그런 다음 필요할 때 클러스터에 저렴한 범용 장비를 추가하십시오. 더 이상 필요하지 않은 경우 제거하고 규모를 축소할 수도 있습니다.
주/보조 아키텍처
주/부(primary/secondary) 아키텍처에서는 지정된 “주(primary)” 서버가 존재합니다. 이 서버는 모든 데이터를 저장하고 모든 데이터 요청을 처리합니다. 하나 이상의 “부(secondary)” 서버가 있습니다. 이 서버들은 동기화 상태를 유지하고 데이터의 완전한 복제본을 저장하기 위해 주 서버로부터 데이터 업데이트를 받습니다.
주 서버가 오프라인 상태가 되면(다운되면), 나머지 서버들(그리고/또는 코디네이션 서버들)이 보조 서버 중 하나를 새로운 주 서버로 임명합니다.
아키텍트들은 전통적인 비분산형 데이터베이스에 고가용성을 제공하기 위해 이 패턴을 사용합니다. 그러나 이 아키텍처는 증가된 부하 문제를 해결하는 데는 큰 도움이 되지 않습니다. 이를 달성하기 위해, 샤딩 반드시 사용해야 합니다.
공유무관 분산 데이터베이스
공유무관(Shared-nothing) 아키텍처는 데이터를 “샤드”라고 보통 불리는 파티션으로 쪼개는 것을 포함합니다. 각 샤드는 클러스터 내의 개별 서버(노드)에 존재합니다. 예를 들어, 300개의 레코드와 3개의 노드가 있다면 각 노드는 (이상적으로) 100개의 레코드를 저장하게 됩니다. 추가되는 각 노드는 데이터를 더욱 분할하고 필요에 따라 부하를 계속해서 분산시킬 수 있습니다.
클러스터는 또한 고가용성을 유지하기 위해 노드 간에 샤드를 복제합니다. 예를 들어, 노드 1에 활성 샤드 A가 포함되어 있다면 노드 2에는 복제본 샤드 A가 포함되는 식입니다.
그런 다음, 노드 3이 오프라인 상태가 되면 클러스터는 분산 데이터베이스 클러스터 전체를 온라인 상태로 유지하기 위해 샤드 C의 복제본을 활성 상태로 승격시킵니다.
관계형 데이터베이스의 본질은 개별 데이터 행들을 긴밀하게 결합된 테이블 안에 함께 저장하는 것입니다. 이로 인해 분산 SQL 데이터베이스는 구현이 어려워집니다. 이것이 바로 클러스터링, 고가용성, 그리고 복제 기능이 매우 중요할 때 조직들이 종종 NoSQL을 선택하는 이유입니다. NoSQL은 테이블 외에는 존재할 수 없는 엄격하게 결합된 데이터를 포기하는 대신, 클러스터 내의 어떤 샤드에도 존재할 수 있는 독립적인 데이터와 교환합니다.
분산 데이터베이스 예시
사용하는 분산 데이터베이스에 따라 샤딩은 완전히 자동일 수도 있고, 계획하고 유지 관리하는 데 상당한 노력이 필요할 수도 있습니다.
인기 있는 두 가지 NoSQL 분산 데이터베이스와 그 차이점에 대해 살펴보겠습니다.
카우치베이스가 데이터를 분산하는 방법: vBucket
카우치베이스는 공유나싱(shared-nothing) 클러스터의 노드들에 데이터를 분산하기 위해 vBucket(가상 버킷)이라는 개념을 사용합니다. 하나의 버킷은 1024개의 V벅스 기본적으로. 각 vBucket은 활성 vBucket(기본 복사본) 및 다른 노드의 하나 이상의 복제본 vBucket으로서 노드에 할당됩니다. 클러스터 매니저는 모든 SDK 클라이언트가 중앙 라우터나 프록시 없이 요청을 올바른 노드로 직접 라우팅하는 데 사용하는 vBucket 맵을 유지 관리합니다.
댓글 남기기
댓글을 달기 위해서는 로그인해야합니다.