[개발자를 위한 Spanner 시리즈] Cloud Spanner 입문하기
Google Cloud Korea Team
Cloud Spanner는 클라우드 전용으로 설계되고 강력한 일관성을 제공하는 특별한 엔터프라이즈급의 글로벌 분산형 데이터베이스 서비스로서, 관계형 데이터베이스 구조와 비관계형 수평적 확장의 이점을 결합했습니다. 전형적인 비관계형 또는 NoSQL 데이터베이스의 장점인 확장성을 트랜잭션, SQL 쿼리 그리고 관계형 구조와 결합한 유일한 데이터베이스 입니다.
Spanner 동작 방식
그림을 보게 되면, 2개의 데이터베이스를 호스팅 하는 4개의 노드로 구성된 단일 리전의 Cloud Spanner 인스턴스가 있습니다. 노드는 Spanner의 컴퓨팅 단위입니다. 이러한 노드 서버는 읽기 및 쓰기/커밋 트랜잭션 요청을 처리 하지만 데이터를 저장하지는 않으며, 각 노드는 리전의 3개의 존에 복제됩니다. 데이터베이스 스토리지도 3개의 존에 복제됩니다. 하나의 존에 있는 노드들은 해당 존의 스토리지에 대한 읽기 및 쓰기를 담당합니다. 데이터는 Google의 분산 복제 파일 시스템인 Colossus에 저장이 되며, 데이터가 개별 노드에 묶여 있지 않기 때문에 로드를 재분산할 때 큰 도움이 됩니다. 노드 또는 존에 장애가 발생해도 나머지 노드에서 처리하기 때문에 데이터를 계속 사용할 수 있으며, 가용성을 유지하기 위해 수동으로 개입할 필요가 전혀 없습니다.
Spanner에서 고가용성 및 확장성을 제공하는 방법
데이터베이스의 각 테이블은 기본 키를 기준으로 정렬되어 저장됩니다. 테이블은 기본 키 범위로 나뉘며 이러한 분리를 Split이라고 합니다. 각 Split은 Spanner 노드별로 완전히 독립적으로 관리됩니다. 한 테이블의 Split 수는 데이터 양에 따라 다르며, 빈 테이블에는 Split이 하나 밖에 없습니다. Split은 데이터 양 및 부하에 따라 동적으로 다시 분산됩니다(동적 재샤딩). 하지만 테이블 및 노드가 3개의 존에 복제되는데 어떻게 분할이 가능할까요?
모든 것들은 3개의 존에 복제되며 Split 관리 역시 마찬가지입니다. Split 복제본은 여러 존에 걸쳐 있는 한 그룹(Paxos)에 연결되며, Paxos 합의 프로토콜을 사용해서 그룹 내의 존 중 하나가 리더로 결정됩니다. 리더가 해당 Split의 쓰기 트랜잭션을 관리하며 다른 복제본은 읽기에 사용될 수 있습니다. 리더에 장애가 발생하면 다시 합의를 통해 새 리더를 결정 하게 됩니다. 각각의 Split 별로 리더는 서로 다른 존이 선출 될수 있으므로, 모든 Cloud Spanner 컴퓨팅 노드에서 리더십 역할을 분산시킬 수 있습니다. 한 노드 내에는 리더인 Split 들과 다른 리더의 복제 Split들이 있을수 있습니다. Cloud Spanner는 Split, 리더 그리고 복제본의 분산 메커니즘을 사용해서 고가용성과 확장성을 모두 달성합니다.
Spanner에서 글로벌 일관성을 제공하는 방법
TrueTime은 여러 데이터 센터에서 모든 머신의 시계를 동기화하는 기술입니다. 이 시스템은 각각 서로의 장애 모드를 보완하는 GPS 및 원자 시계의 조합으로 되어 있습니다. 두 소스를 결합(다중 중복 옵션을 사용)하여 모든 Google 애플리케이션에 정확한 시간 소스를 제공합니다. 하지만 여전히 각 개별 머신에서 시간 드리프트가 발생할 수 있으며 30초마다 동기화 되더라도 서버 시계와 기준 시계가 2밀리초까지 차이가 날 수 있습니다. 시간 동기화를 통해 정정될 때까지 불확실성이 증가하여 드리프트가 톱니 모양의 그래프를 형성합니다. (적어도 컴퓨팅 영역에서) 2밀리초는 상당히 긴 시간이기 때문에 TrueTime에서는 시간 신호에 이러한 불확실성 값을 포함해서 제공합니다
Cloud Spanner를 시작하는 방법
2017년 출시된 이후 게임, 소매업, 소셜 미디어, 금융 서비스와 같은 업종의 고객들이 Cloud Spanner에 많은 관심을 보이며 이를 채택하여 운영 워크로드를 Cloud Spanner에서 실행하고 있습니다. 최근에는 세분화된 인스턴스 크기 조정에 대한 지원을 발표했는데 이는 소규모 또는 비운영 워크로드에 매우 유용할 수 있습니다. 그 밖에도 Cloud Spanner는 지속적 통합 및 지속적 배포(CI/CD)와 같이 경량 오프라인 환경을 지원하는 무료 옵션을 제공합니다.
Cloud Spanner 에뮬레이터가 바로 그 옵션입니다. 이 옵션을 사용하면 애플리케이션 개발자가 개발 및 테스트를 위해 Cloud Spanner의 인스턴스를 로컬에서 에뮬레이션할 수 있습니다.
Cloud Spanner 에뮬레이터 소개
Cloud Spanner 에뮬레이터는 GCP 프로젝트, 결제 계정, 심지어 인터넷 연결 없이도 개발자가 Cloud Spanner를 사용해서 애플리케이션을 빠르게 빌드하고 테스트할 수 있는 무료 환경을 지원합니다. 이 에뮬레이터는 일부 제한사항은 있지만 Cloud Spanner 운영 서비스와 동일한 API를 제공합니다. 에뮬레이터가 메모리에서 수행되기 때문에 다시 시작하면 데이터가 유지되지 않는다는 점에 유의해야 합니다. 다시 시작하면 모든 구성, 스키마, 데이터가 손실됩니다.
에뮬레이터는 로컬 개발 및 테스트 사용 사례에 사용됩니다. 예로, 알려진 상태로 기동후 테스트를 수행하고 새 상태를 확인한 후 종료하는 등이 되겠습니다. 에뮬레이터를 원격 GCE 인스턴스에 배포하여 공유 환경에서 학습, 개발, 테스트를 위한 데이터베이스로 사용할 수도 있습니다.
다만, Cloud Spanner 에뮬레이터를 성능 테스트에 사용해서는 안됩니다. 개발 및 테스트 환경에서 에뮬레이터를 사용할 수는 있지만 운영에 배포하기 전에 Cloud Spanner 서비스에서 수행하여 애플리케이션을 확인하는 것이 좋습니다
에뮬레이터의 지원 기능 및 제한사항에 대한 전체 목록은 GitHub의 README 파일을 확인하세요.
Cloud Spanner 에뮬레이터에 대한 자세한 소개는 이 게시물을 참조하세요.
Cloud Spanner 에뮬레이터 실행
사전 빌드된 Docker 이미지, 사전 빌드된 Linux 라이브러리, Bazel 또는 커스텀 Docker 이미지를 빌드 하는 등 여러 가지 옵션을 사용해서 에뮬레이터를 실행할 수 있습니다. 자세한 내용은 '에뮬레이터 로컬 배포/실행' 및 '에뮬레이터 원격 배포'를 참조하세요.
다음 게시물 예고
다음 게시물에서는 Cloud Spanner의 동작원리에 대해 알아봅니다. 기대해 주세요