Skip to main content

Bigtable 분석 Part 2

· 10 min read
Suyong Choi (Elon)
Full-Stack Engineer

이전 Part 에서는 Bigtable 의 개요와 Bigtable 의 Data model 에 대해 분석해 보았다. 이번 Part 에서는 Bigtable 을 구성하는 핵심 요소들 (building blocks) 에 대해 정리를 해보겠다.

Bigtable 의 Building Block

Bigtable 은 다음과 같은 building block 으로 구성되어 있다.

  • distributed GFS(Google File System)
  • Cluster Management System
  • SSTable
  • Chubby

하나씩 살펴보자.

1. GFS

GFS 는 구글에서 만든 분산 파일 시스템이다. GFS 는 Bigtable 에서 로그 파일과 데이터 파일을 저장하기 위한 데이터 저장소로 사용된다. GFS 는 다음과 같은 특징을 가지고 있다.

  • High Scalability, Availability: 메타데이터를 관리하는 Master 서버, 실제 chunk 데이터가 저장되는 다수의 Chunk 서버의 역할 분리로, 분산된 파일 시스템을 구현
  • Fault Tolerance: 각 청크 (chunk) 는 64MB 크기로 고정되어 있으며, 여러 청크 서버에 중복 저장
  • High Throughput: 클라이언트가 직접 청크 서버와 상호작용 하는 방식으로, 마스터 서버 병목을 줄임. 또한 손쉽게 서버를 확장가능한 구조
  • Optimization on Data structure: 큰 청크 단위 읽기로 Disk I/O 효율화, 블록 인덱스를 통한 빠른 검색, 메타데이터 캐싱

| ⁉️잠깐 CS 지식: 왜 큰 chunk 단위로 읽으면 Disk I/O 가 좋아지는가?

  • 디스크는 물리적으로 데이터를 읽어오는 장치이므로, 디스크의 물리적 위치에 따라 읽기 속도가 달라진다.
  • HDD, SDD 등 디스크에서 데이터에 접근할 때, 일정한 초기 오버헤드(seek time 등)가 발생한다.
  • 따라서 작은 chunk 단위로 읽으면, 매번 디스크의 물리적 위치를 이동해야 하므로 오버헤드가 커지는 반면, 큰 Chunk 단위로 읽으면 줄어든다.
  • 큰 chunk 단위로 읽어오면, 캐시 히트율이 높아져서, 디스크 I/O 가 줄어들게 된다.
  • 큰 chunk 단위로 읽어오면, Sequential I/O 의 장점이 극대화 되는 반면, 작은 chunk 는 Random I/O 의 단점이 부각 된다. (Sequential I/O vs Random I/O)

2. Cluster Management System

  • Bigtable cluster 는 여러 종류의 분산 어플리케이션이 실행되는 Shared Machine Pool 이다.
  • 이 cluster management system 은 task scheduling, resource allocation, machine monitoring, fault detection, recovery 등을 기능을 수행한다.

3. SSTable

SSTable(Sorted String Table) 은 Bigtable 에서 데이터를 저장할 때 사용되는 자료 구조이다. 간단히 말하면 key/value string pair 인데, key 를 기준으로 정렬된 table 이라 할 수 있다. SSTable 은 다음과 같은 특징을 가지고 있다.

  • key 는 중복을 허용하지 않으며 immutable 하다.
  • 64KB 단위로 chunking 되어 block 으로 저장된다.
  • 각 블록을 indexing 하는 Block index 가 각 SSTable에 저장되며, SST 가 open 될 때 메모리에 load된다.

기본 구조는 심플한데 정리하자면, SST 는 "key/value pair 형태의 구조이며, 64kb 단위로 chunk 가 만들어서져서 블록단위 indexing이 되겠구나" 라고 이해해볼 수 있겠다.

예시를 보자면, 다음과 같이 이름:값 쌍으로 이루어진 key/value pair 가 있고,

sst1출처: SSTable를 이용한 데이터 저장

Amelia, Lily, Neil 로 시작되는 각 Block으로 chunking 된다고 했을 때, index 는 아래와 같이 저장된다.

sst1출처: SSTable를 이용한 데이터 저장

메모리에 load 된 block index 는 각 블록이 다루는 key 로 정렬되어있어 binary search 가 가능하다. 이를 통해 찾고자하는 key 가 어떤 block 에 포함되는지 알아내서 single disk seek 으로 해당 블록을 읽어올 수 있다. 한번 block 을 disk 에서 읽어와 메모리로 load 하면, 해당 key 를 찾는 것은 binary search 를 하거나 iterator 를 통해 순차적으로 비교하며 찾을 수 있을 것이다.

여기까지가 기본적인 SSTable 의 구조와 개념이지만, 다른 자료들을 보면 아래와 같이 Filter Block, Meta Index Block 등 으로 구성된 SSTable 을 설명하는 도 찾아볼 수 있다.

sst1출처: SSTable

이는 google이 Bigtable 이후에 이를 베이스로 단일 노드 환경에 최적화 되도록 개량한 LevelDB 에서 기존 SST 의 최적화를 위해 개선한 구조로 보여진다. Bloom filter 등 RocksDB 에서도 자주 보이는 keyword 들이 등장하는데, 추후 LevelDB 를 정리할 때 다시 정리해보겠다.

4. Chubby

Chubby 는 구글에서 만든 분산 환경에서의 동기화, Lock 관리, 메타데이터 저장 등의 작업을 수행하는 Distributed Lock Service 로 분산 코디네이션(coordination) 서비스중 하나이다. "어? 이거 Zookeeper 아니야?" 라고 생각할 수 있는데, 코디네이션의 역할은 같지만, 합의 알고리즘 등 세부적인 내용이 다르다. 또한, Chubby 는 apache 오픈소스인 Zookeeper 보다 먼저 만들어진 서비스이기 때문에 Zookeeper 가 Chubby 의 영향을 받아 만들어졌다고 볼 수 있다.

Chubby 의 구조를 구체적으로 설명하려면, Paxos 알고리즘을 합의 알고리즘을 사용하고 5개의 replica 중 하나가 master 로 선출되며, atomic Read/Write 방식 등.. 다룰 내용이 꽤 많다. 이는 Bigtable 과 마찬가지로 별도의 논문이 하나 있을 정도로 정리가 필요할 것 같아 추후 따로 정리를 하는 거로 하고, 여기서는 Chubby 가 Bigtable 에서 다음과 같은 목적으로 쓰인다는 것만 이해해두자.

  • Bigtable 의 단일 활성 마스터 보장: Chubby 의 리더 선출 방식을 통해
  • 메타데이터 및 스키마 저장: column family, ACL 등 메타데이터를 chubby 에 저정하여, client 에서 참조가능하도록 함
  • Tablet 서버 탐지 및 관리: Tablet 서버의 등록, 상태 모니터링, 실패 후 종료 처리등 지원
  • 부트스트랩(bootstrap) 정보 제공: Bigtable 데이터의 초기 boostrap 위치(데이터 파일의 위치 등)를 Chubby 에 저장, 복구 시에 Chubby 에서 빠르게 정보를 읽어와 복구 가능

자, 여기까지가 Bigtable 을 구성하는 핵심 Building Block 들에 대한 간략한 정리이다. 나는 이를 정리하면서 GFS, Chubby, SSTable 등 이미 구글에서 만든 기술들을 잘 활용하여, Bigtable 이라는 멋진 아키텍처를 만들었다는 점에서, 구글의 기술력에 감탄하지 않을 수 없었다. 사실상, 구글의 관점에서는 회사 자체의 기술력을 다 zero-base 로 시작한 것이 다름없다. (물론, Chubby 에서는 갓-포트 형님의 Paxos 알고리즘 등 third-party techinq 을 활용하긴 하지만..)

다음으론 Tablet 을 관리하는 방식, 데이터를 압축하는 방식 등에 대한 구현을 집중적으로 분석해보고, 논문을 낼 당시엔 적용이 안됬지만 Future works 로 남겨둔 것으로 보여지는 Refinements (high performance, availability, and reliability 를 얻기위해 refactoring 이 필요한 구조들) 가 어떤 것들이 있는지 정리해보겠다.

References