빅테이블
더 많은 작업
- Bigtable; 구글 빅테이블
- 구글이 만든 대규모 구조화 데이터용 분산 저장 시스템. 행 키·컬럼 키·타임스탬프로 값을 찾는 희소하고 정렬된 다차원 맵이다
빅테이블은 구글이 2006년 OSDI(Operating Systems Design and Implementation)에서 발표한 논문 "Bigtable: A Distributed Storage System for Structured Data"(Fay Chang 외)로 설계가 공개되었다. 논문에 따르면 빅테이블은 수천 대의 범용 서버에 걸친 페타바이트 규모까지 확장되도록 설계되었고, 웹 인덱싱, 구글 어스, 구글 파이낸스 등 많은 구글 서비스가 데이터를 저장했다. 이 서비스들은 데이터 크기(URL에서 위성 이미지까지)와 지연 시간 요구(대량 일괄 처리에서 실시간 서비스까지)가 서로 매우 달랐는데, 빅테이블 하나로 이를 감당했다.
빅테이블은 관계형 데이터베이스처럼 완전한 관계형 모델을 제공하지 않고, 대신 단순한 데이터 모델로 클라이언트가 데이터 배치와 형식을 직접 조절할 수 있게 한다. 이런 구조는 이후 HBase를 비롯한 와이드 컬럼(wide-column) 계열 NoSQL 데이터베이스의 원형이 되었다. 현재 구글은 같은 이름의 관리형 서비스(Cloud Bigtable)를 Google Cloud에서 제공한다.
논문은 빅테이블을 다음과 같이 정의한다.
- 빅테이블은 희소하고(sparse), 분산되고(distributed), 영속적인(persistent) 다차원 정렬 맵(multidimensional sorted map)이다. 맵은 행 키, 컬럼 키, 타임스탬프로 색인되며, 맵의 각 값은 해석되지 않은 바이트 배열이다.
| 요소 | 설명 |
|---|---|
| 행 키(row key) | 임의의 문자열. 데이터는 행 키의 사전 순서로 정렬되어 저장된다. 한 행 키 아래의 읽기·쓰기는 원자적이다. |
| 컬럼 패밀리(column family) | 관련된 컬럼 키를 묶은 단위이자 접근 제어의 단위. 데이터를 넣기 전에 먼저 만들어야 하며, 테이블당 수는 적게(많아야 수백 개) 유지하고 잘 바꾸지 않는다. |
| 컬럼 키 | 패밀리:한정자(family:qualifier) 형식으로 쓴다. 패밀리 안의 컬럼 수에는 제한이 없다. |
| 타임스탬프 | 같은 셀에 여러 버전을 저장하고 이를 구분하는 64비트 정수. 빅테이블이 마이크로초 단위 실제 시각으로 붙이거나 클라이언트가 직접 지정한다. 최근 n개 버전만 남기거나 일정 기간 안의 버전만 남기도록 가비지 컬렉션을 설정할 수 있다. |
논문의 예인 웹테이블(Webtable)은 뒤집은 URL(예: com.cnn.www)을 행 키로 쓰고, 웹 페이지 내용을 contents: 컬럼에 가져온 시각을 타임스탬프로 하여 여러 버전 저장한다. 다른 페이지가 이 페이지를 가리키는 링크는 anchor: 패밀리에 링크한 사이트 이름을 한정자로 하여 저장한다. URL을 뒤집으면 같은 도메인의 페이지가 행 키 순서상 서로 붙어 저장되어 한꺼번에 읽기 좋다.
- 테이블은 행 키 범위로 나뉘며, 각 범위를 태블릿(tablet)이라 한다. 태블릿은 분산과 부하 분산의 단위다. 테이블은 처음에 태블릿 하나로 시작해 커지면 자동으로 나뉘며, 기본적으로 태블릿 하나가 약 100~200MB가 된다.
- 시스템은 클라이언트 라이브러리, 마스터 서버 하나, 여러 태블릿 서버로 이루어진다. 마스터는 태블릿을 태블릿 서버에 배정하고 서버의 추가·이탈을 감지하며 부하를 맞춘다. 태블릿 서버는 맡은 태블릿의 읽기·쓰기를 처리한다.
- 태블릿 위치는 B+ 트리와 비슷한 3단계 계층(Chubby 파일 → 루트 태블릿 → METADATA 태블릿 → 사용자 태블릿)으로 찾는다.
- 쓰기는 먼저 커밋 로그에 기록한 뒤 메모리의 정렬된 버퍼인 memtable에 넣고, memtable이 커지면 SSTable 파일로 내려 쓴다. SSTable은 키에서 값으로 가는, 정렬되고 변경할 수 없는 영속 맵이다.
빅테이블은 구글의 다른 인프라 위에 만들어졌다.
| 구성 요소 | 빅테이블에서의 역할 |
|---|---|
| GFS | 로그와 SSTable 데이터 파일을 저장하는 분산 파일 시스템 |
| Chubby | 가용성 높은 분산 잠금 서비스. 활성 복제본 5개 중 하나가 마스터로 선출되며, 팍소스(Paxos) 알고리즘으로 복제본의 일관성을 유지한다. 빅테이블은 Chubby로 마스터가 항상 하나만 있도록 보장하고, 태블릿 위치의 시작점, 스키마 정보, 살아 있는 태블릿 서버 목록을 관리한다. |
| 클러스터 관리 시스템 | 작업 스케줄링, 공유 서버의 자원 관리, 서버 장애 처리와 상태 감시 |
Google Cloud 문서에 따르면 현재의 Cloud Bigtable은 태블릿을 구글의 파일 시스템인 Colossus에 SSTable 형식으로 저장한다.
| 항목 | 관계형 DB | 빅테이블 |
|---|---|---|
| 데이터 모델 | 스키마가 정해진 테이블과 관계 | 행 키·컬럼 키·타임스탬프로 색인되는 희소 정렬 맵 |
| 스키마 | 컬럼을 미리 정의 | 컬럼 패밀리만 미리 정의하고 컬럼은 자유롭게 추가 |
| 빈 값 | 빈 칸도 자리를 차지 | 값이 없는 셀은 저장하지 않음(희소) |
| 트랜잭션 | 여러 행·테이블에 걸친 ACID 트랜잭션 | 단일 행 트랜잭션만 지원 |
| 질의 | SQL, 조인 | 행 키 조회와 범위 스캔 중심 |
| 확장 | 주로 수직 확장 | 서버를 늘리는 수평 확장 |
- 데이터 모델의 세 축(행 키, 컬럼 키, 타임스탬프)과 "희소하고 분산된 영속적 다차원 정렬 맵"이라는 정의를 기억한다.
- 행 키 순서로 정렬되고, 행 범위 단위인 태블릿으로 나뉘어 분산된다. 단일 행 단위의 원자성만 보장한다.
- 빅테이블은 GFS에 데이터를 저장하고 Chubby를 잠금 서비스로 쓴다. 오픈 소스 대응물은 HBase(HDFS, 주키퍼)이다.
- 빅테이블과 HBase는 컬럼 패밀리 기반 NoSQL 저장소의 대표 사례로 나온다.