[CockroachDB] Architecture Overview

Architecture Overview

CockroachDB는 확장성과 일관성을 모두 갖춘 데이터베이스를 만들기 위해 설계되었다.

Goals of CockroachDB

  • 고도로 자동화되어 있고 추론하기 쉬운 시스템
  • 대규모 배포에서도 일관성 제공
    • 분산 트랜잭션을 활성화하고 일관성 문제와 stale read 문제로 인한 고통을 제거
  • 특정 플랫폼이나 프로바이더에 종속되지 않은 환경 유연성
  • SQL 지원

Overview

아래 두 명령어로 머신을 실행시킨다.

  • cockroach start--join 플래그와 같이 실행시켜 통신할 수 있는 다른 머신을 알린다.
  • cockroach init으로 클러스터의 일회성 초기화를 수행한다.

Cockroach DB가 초기화되면 PostgreSQL고 호환되는 SQL API를 통해 Cockroach DB와 상호작용한다. 클러스터의 모든 노드가 대칭적으로 동작하기 때문에 어느 노드에나 SQL을 보낼 수 있으며 이를 통해 Cockroach DB를 로드밸런서와 쉽게 통합할 수 있다.

SQL RPC를 수신한 노드는 이를 분산 트랜잭션 KV Store에서 작동하는 연산으로 변환시킨다. 이런 RPC가 클러스터를 데이터로 채우기 시작하면 Cockroach DB는 클러스터의 노드에 데이터를 알고리즘적으로 분배하기 시작해 데이터를 range라고 하는 청크로 분할한다. 각 range는 생존 가능성을 보장하기 위해 기본적으로 최소 3개의 노드에 복제된다. 이렇게 하면 어떤 노드가 다운되더라도 사용할 수 있는 데이터 사본이 남아있게 된다.

  • 읽기 및 쓰기 서비스를 지속적으로 제공
  • 데이터를 다른 노드에 일관되게 복제

노드가 직접 처리할 수 없는 읽기 또는 쓰기 요청을 받으면 해당 요청을 처리할 수 있는 노드를 찾아서 해당 노드와 통신한다. 그렇기 때문에 사용자는 클러스터에서 데이터의 특정 부분이 어느 노드에 위치해 있는지 알 필요가 없으며 Cockroach DB가 이를 추적해 각 노드에서 대칭적인 읽기 / 쓰기 동작을 수행할 수 있다. 이런 구조 덕분에 로드밸런서와의 통합이 쉬워진다.

Range 내 데이터에 대한 모든 변경은 합의 알고리즘에 의존해 range 내 복제본의 대다수가 변경을 커밋하는데 동의하도록 한다. 이것이 바로 어떤 노드와 통신하든 상관없이 애플리케이션에 일관된 읽기 및 쓰기 기능을 제공할 수 있는 Cockroach DB의 격리 방식이다.

궁극적으로 데이터는 데이터의 타임스탬프를 추적할 수 있는 스토리지 엔진을 사용해 디스크에서 쓰거나 읽는다. 이를 통해 SQL 표준 인 AS OF SYSTEM TIME절을 지원해 일정 기간 동안의 기록 데이터를 찾을 수 있게 한다.

Layers

고수준에서 Cockroach DB는 클라이언트의 SQL 문을 KV 데이터로 변환해 노드에 분산하고 디스크에 기록한다. Cockroach DB의 아키텍처는 여러 개의 레이어로 나타나며 각 레이어는 상재거으로 불투명한 서비스로서 바로 위와 아래의 레이어와 상호작용한다.

Layer Order Purpose
SQL 1 Translate client SQL queries to KV operations.
Transactional 2 Allow atomic changes to multiple KV entries.
Distribution 3 Present replicated KV ranges as a single entity.
Replication 4 Consistently and synchronously replicate KV ranges across many nodes. This layer also enables consistent reads using a consensus algorithm.
Storage 5 Read and write KV data on disk.

Database terms

Consistency

트랜잭션이 허용된 방식으로만 영향을 받는 데이터를 변경해야 한다는 조건. Cockroach DB는 ACID 의미론과 CAP 정리에서 이야기하는 일관성의 정의를 가진다.

Isolation

트랜잭션이 동시에 실행 중인 다른 트랜잭션의 영향을 받을 수 있는 정도. 가장 가능한 높은 격리 수준인 SERIALIZABLE 격리 수준을 제공하며 모든 커밋된 트랜잭션이 마치 각 트랜잭션이 한 번에 하나씩 실행되는 것과 동일한 결과를 갖도록 보장한다.

Consensus

트랜잭션의 커밋 또는 중단 여부에 대한 합의에 도달하는 과정. Raft 합의 프로토콜을 사용해 range가 쓰기 요청을 받으면 해당 range의 복제본을 포함하는 노드의 쿼럼이 쓰기를 승인한다. 즉, 일부 노드가 오프라인 상태일지라도 데이터가 안전하게 저장되고 대다수의 노드가 데이터베이스의 현재 상태에 동의한다는 의미다.

쓰기가 합의를 얻지 못하면 클러스터 내의 일관성을 유지하기 위해 앞으로의 진행에 중단이 발생한다.

Replication

데이터의 복사본을 생성 및 배포하고 이런 복사본이 일관성을 유지하도록 함. 모든 쓰기가 커밋된 것으로 간주되기 전에 데이터 복사본의 쿼럼으로 전파되도록 요구한다.

Transaction

ACID 의미론의 요구 사항을 충족하는 데이터베이스에서 수행하는 일련의 작업.

Transaction contention

  • 동일한 데이터에 쓰기를 시도하는 다른 동시성 또는 최근 트랜잭션으로 인해 트랜잭션이 완료될 수 없는 경우. 이를 잠금 경합이라고 한다.
  • 현재 실행 중인 모든 트랜잭션 중에서 직렬화 가능한 순서로 배치할 수 없기 대문에 트랜잭션이 자동으로 다시 시도된다. 이를 직렬화 가능성 충돌이라 한다. 자동 재시도가 불가능하거나 실패하면 트랜잭션 재시도 오류가 클라이언트에 발생해 클라이언트 애플리케이션이 트랜잭션을 다시 시도해야 한다.

애초에 이런 문제들은 트랜잭션 경합을 줄이기 위한 조치를 취해야 한다.

Multi-active availability

합의 기반 고가용성 개념으로, 클러스터의 각 노드가 저장된 데이터의 하위 집합에 대한 읽기 및 쓰기를 처리할 수 있다. 이는 액티브 노드가 요청 트래픽의 100%를 수신하는 active-passive 복제 및 모든 노드가 요청을 수락하지만 일반적으로 읽기의 최신성과 속도를 보장할 수 없는 active-active 복제와 대조적이다.

CockroachDB architecture terms

Cluster

하나의 분산형 SQL 데이터베이스 서버로 작동하는 상호 연결된 Cockroach DB노드 그룹이다. 노드는 공동으로 트랜잭션을 구성하고 워크로드 및 데이터 스토리지의 균형을 재조정해 성능과 내결함성을 최적화한다.

각 클러스터에는 고유한 권한 계층 구조가 있으므로 특정 클러스터에서 사용자와 역할을 정의해야 한다.

Node

개별 인스턴스다. 하나 이상의 노드가 클러스터를 구성한다.

Range

모든 데이터(테이블, 인덱스 등)와 거의 모든 시스템 데이터를 KV pair의 ordered map에 저장한다. 이 키 공간은 range라고 하는 연속된 청크로 나뉘며 모든 키는 하나의 range에서 찾을 수 있다. SQL 관점에서 테이블과 보조 인덱스는 처음에 단일 range에 매핑되며 range의 각 KV pair는 테이블의 단일 row 또는 보조 인덱스의 단일 row를 나타낸다. Range의 크기가 default range size에 도달하면 range는 두 개로 분할된다. 이 프로세스는 테이블과 인덱스가 계속 증가함에 따라 계속 나타난다.

Replica

노드의 저장된 range의 복제본이다.

Leaseholder

“Range lease”를 보유하는 복제본이다. 이 복제본은 range에 대한 모든 읽기 및 쓰기 요청을 수신하고 조정한다.

대부분의 테이블 및 쿼리 유형에서 Leaseholder는 읽관된 읽기를 제공할 수 있는 유일한 복제본이다.

Raft protocol

분산 시스템에서 현재 상태에 동의하도록 보장하는 합의 프로토콜.

Raft leader

각 range에서 쓰기 요청의 리더 역할을 하는 복제본이다. 리더는 쓰기 요청을 커밋하기 전에 raft 프로토콜을 사용해 raft log 기반으로 대다수의 레플리카가 동의하는지 확인한다. Raft 리더는 거의 항상 leaseholder와 동일한 레플리카다.

Raft log

레플리카가 동의한 range에 대한 시간 순서대로 기록되는 쓰기 로그다. 이 로그는 각 복제본과 함께 디스크에 존재하며 일관된 복제를 위한 range의 진실 소스다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2024/01/07/Cockroach/architecture-overview/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.