Couchbase Server Architecture

카우치베이스 서버는 대화형 어플리케이션을 위한 분산 NoSQL 문서 데이터베이스입니다. 카우치베이스의 스케일 아웃 아키텍처는 클라우드 또는 범용 하드웨어 상에서 구동되며 유연한 데이터 모델, 일관성 있는 고성능, 간편한 확장성과 무중단 24 x 365 가용성을 제공합니다.

상위수준 아키텍처

최상위 레벨에서 보면, 카우치베이스 클러스터의 각 노드는 동일하고 각각 ‘데이터 관리자’와 ‘클러스터 관리자’ 두 개의 주요 컴포넌트를 가지고 있습니다. 다른 중요한 아키텍처 요소는 점진적 인덱스와 문서 쿼리를 지원하는 강력한 맵 리듀스(Map Reduce) 엔진과 지리적으로 서로 다른 지역에 있는 데이터 센터 간 복제 기술입니다.

어플리케이션은 Java, .NET, PHP, Ruby, Phython, C , C++ 등 주요 프로그래밍 언어를 대부분 지원하는 카우치베이스 스마트 클라이언트 SDK를 사용해서 카우치베이스 서버 클러스터와 상호 작용을 합니다. 이때 SDK는 클러스터 토폴로지를 인지하고 있어 각 요청을 적합한 서버로 직접 전달합니다.

데이터는 지속적으로 클라이언트에 의해 해시되어 모든 서버 노드에 균일하게 분산 저장됩니다. 클러스터 맵은 각각의 노드에 어떤 데이터가 저장되어 있는지를 기록하고 언제 노드가 추가되고 다운되었는지 알고 있습니다.

만약 특정 서버가 고장났을 경우, 카우치베이스 서버는 해당 서버 장애를 감지하고 다른 서버에 있는 복제 문서(replica documents)를 활성화시킨 다음 새로운 클러스터 토폴로지를 반영하도록 클러스터 맵을 갱신합니다. 이때 스마트 클라이언트는 서버로부터 자동으로 새로운 클러스터 맵을 가져와서 별도의 어플리케이션 변경이나 다운타임 없이 다른 활성화된 서버로 요청을 전달합니다.

서버 아키텍처

카우치베이스 서버 클러스터의 모든 서버는 동일하게 ‘클러스터 관리자’와 ‘데이터 관리자’ 두 개의 컴포넌트를 가지고 있습니다. 이러한 아키텍처 구성으로 인해 단일 장애 접점(SPoF, Single Point of Failure) 없이 연속적으로 선형적인 스케일 아웃(scaleout) 확장이 가능합니다. 즉, 사용자는 버튼 클릭 한 번으로 어플리케이션 중단 또는 다운타임 없이 클러스터를 확장 할 수 있습니다. 카우치베이스 서버는 submilisecond (1/1000 ms 이하)의 어플리케이션 응답시간과 높은 처리량을 제공하는 고성능 데이터베이스입니다. 따라서, 단 몇 대의 서버로 수 많은 동시 사용자에게 놀라운 성능의 어플리케이션 경험을 제공할 수 있습니다.

클러스터 관리자

클러스터 관리자는 카우치베이스 클러스터의 모든 서버의 구성과 작동을 관리합니다. 복제(replication) 스트림 관리 및 재분배(rebalancing) 작업 등 내부 노드 간 작동(internode behavior)을 구성하고 관리합니다. 또, 클러스터의 측정 지표 집계, 합의 기능(consensus functions), RESTful 클러스터 관리 API를 제공합니다. 클러스터 관리자는 고장 허용 분산 시스템(Faulttolerant distributed system) 개발 및 운영 환경에서 이미 검증된 Erlang/OTP 언어로 개발 되었습니다. 서버 장애가 발생하면 클러스터 관리자는 노드 중단을 감지하고 복제 문서(replica documents)를 활성화 후 클라이언트 어플리케이션이 다운타임 없이 계속해서 작동 할 수 있도록 클러스터 맵을 재 갱신 합니다. 클러스터에 신규 서버가 추가되거나 기존 서버가 삭제 되면 클러스터 데이터를 재조정(rebalance)하여 모든 노드에 균일하게 데이터와 I/O가 분산되도록 합니다.

데이터 관리자

데이터 관리자는 데이터 저장 및 접근을 관리하는 역할을 담당합니다. 각 노드의 데이터 관리자는 해당 노드에서 각각 나누어져 관리하고 있는 샤드(shard)의 부분 집합의 활성 데이터 및 복제 데이터를 관리합니다. 총 1,024개의 샤드(shard)는 클러스터의 전체 노드에 각각 골고루 분산되어 있습니다. JSON 형식의 문서는 ‘버킷(Bucket)’이라고 하는 논리적인 개체에 저장됩니다. 클라이언트는 요청에 일치하는 샤드(shard)가 있는 노드와 직접 통신하여 해당 버킷에 저장된 문서에 접근합니다.

클러스터의 각 문서는 여러 개(최대 3개까지 가능)의 복제 사본을 가질 수 있습니다. 데이터 관리자는 무작위 읽기 및 쓰기 동작에 대해 데이터 부하 또는 크기에 상관없이 일관성있는 서브밀리세컨드의 대기 시간 보장을 위해 내장 객체 관리 캐시를 가지고 있습니다.

읽기 쓰기 동작은 맨 처음 메모리 내에 객체 관리 캐시로 접근 합니다. 만약 대상 문서가 캐시에 존재하지 않을 경우 디스크에서 가져옵니다. 문서의 업데이트는 처음에 인메모리(inmemory) 캐시에서 먼저 수행한 다음 추후 디스크에 최종 반영합니다. 세밀한 문서 수준 잠금(documentlevel locking)은 적은 수의 서버로 수 백만 명의 동시 사용자를 지원하기 위한 요청 처리량을 높여 줍니다.

데이터 관리자는 두 개의 “memcapable” 포트를 가지고 있어, 하나는 카우치베이스 스마트 클라이언트를 지원하고 나머지 하나는 프록시를 통해 memcached 클라이언트 라이브러리를 지원합니다. 이들 두 개의 포트가 있어서 카우치베이스 서버가 memcached를 대체할 수 있습니다.

스키마가 필요 없는 데이터는 클러스터에 인덱스와 쿼리를 수행하는 추가 전용(appendonly) 스토리지 엔진에 저장됩니다. 데이터 관리자의 대부분 코드는 C와 C++로 작성되었습니다.

인덱스와 쿼리

간단한 실시간 분석을 위한 어플리케이션은 증분 맵 리듀스 자바스크립트 쿼리를 사용하여 데이터의 부분집합을 쿼리 할 수 있습니다. 인덱스는 분산 방식으로 쿼리됩니다. 쿼리 요청은 각각의 다른 카우치베이스 서버로 보내어져 데이터를 가져온 다음 집계 결과를 클라이언트로 보냅니다.

XDCR 아키텍처

카우치베이스 서버는 클러스터 간 데이터 복제를 쉽게 할 수 있습니다. 재난 복구 또는 사용자 가까이에 있는 데이터센터에서 보다 빨리 데이터를 가져오기 위해서, 활성 데이터를 여러 개의 지역적으로 분산된 데이터 센터로 복제 할 수 있습니다. 데이터센터 간 복제(XDCR)와 클러스터 내에서 노드 간의 복제(Replication)는 동시에 진행됩니다. 아래 그림과 같이 XDCR 데이터센터 간 문서를 복제하는 동안에도 첫 번째 데이터 센터와 두 번째 데이터 센터 내의 클러스터 간 복제가 됩니다. 이때 두 곳의 데이터센터는 어플리케이션의 요청에 따른 읽기 및 쓰기를 계속해서 지원합니다.