Apache HBase 아키텍처

Apache HBase Architecture

Apache HBase는 “NoSQL” 데이터베이스이다. “NoSQL"은 데이터베이스가 기본 액세스 언어로 SQL을 지원하는 RDBMS가 아님을 나타내는 일반적인 표현이다. Apache HBase는 데이터베이스가 아닌 데이터 저장소이다. HBase는 클러스터에 상용 노드를 추가하여 선형 및 모듈식으로 확장할 수 있다. 노드를 20개에서 40개로 늘리면 HBase 클러스터에서 스토리지와 용량도 동시에 증가한다.

HBase 클러스터 아키텍처 HBase 클러스터 아키텍처

Apache HBase 구성 요소

HBase는 Master 서버와 Region 서버의 두 가지 유형의 서버로 구성된다.
Region 서버를 증설하는 것으로 간단하게 스케일 아웃 할 수 있는 구조가 되고 있다. HBase 의 데이터는 리전이라고 하는 단위로 분할되어 있어 리전의 취급 방식으로 서버의 종류가 나뉘어 진다.

마스터 서버 - HBase HMaster

Apache HBase HMaster는 RegionServers 모니터링, 장애 조치 처리 및 지역 분할 관리를 담당하는 HBase 클러스터의 중요한 구성 요소이다.

각 테이블의 데이터는 RegionServer가 관리하며, 전체 클러스터는 HMaster 관리한다.
HMaster는 HBase의 모든 데이터(리전)가 어느 Region 서버에 저장되어 있는지 메타 정보를 관리하는 서버이다.
Region 서버에 지역을 할당하고 Region 서버에 장애를 감지한다.

HMaster 기능은 아래와 같다.

  • RegionServer를 모니터링한다.
    • 리전 서버들을 조정
    • 리전의 시작을 관리
  • RegionServers 장애 조치를 처리한다.
  • 리전을 할당/허용하지 않는다.
  • 클러스터에 있는 모든 리전 서버들을 모니터링한다.
    • 관리 기능
    • 테이블의 생성, 삭제, 업데이트
  • 메타데이터 변경을 처리하는 데 사용된다.
  • 모든 메타데이터 변경에 대한 인터페이스를 제공한다.
  • 유휴 시간에 재로드 밸런싱을 수행하는 데 사용된다.
  • HMaster는 HBase 클러스터에 대한 정보를 보여주는 웹 사용자 인터페이스를 제공한다.

HBase HMaster

이러한 작업은 Master 서버 내에서 동작하고 있는 ZooKeeper라는 소프트웨어가 담당하고 있다.
ZooKeeper는 HBase 외에도 많은 분산 애플리케이션에서 사용되는 소프트웨어이다.

Region 서버 - HBase Region Server

RegionServer는 마스터 서버에서 할당된 실제 데이터 저장을 담당한다. Hadoop 클러스터와 마찬가지로 NameNode는 메타데이터를 저장하고 DataNode는 HBase와 유사한 방식으로 실제 데이터를 저장하고 mater는 메타데이터를 보유하며 RegionServers는 실제 데이터를 저장한다. RegionServer는 분산 클러스터 환경의 DataNode에서 실행된다.

RegionServer는 다음과 같은 작업을 수행한다.

  • 할당 제공된 regions(tables)을 처리한다.
  • 클라이언트가 수행하는 읽기 및 쓰기 요청을 처리한다.
  • 캐시를 HDFS로 플러시한다.
  • 영역 분할 처리를 담당한다.
  • HLog를 유지 관리한다.

클라이언트는 먼저 Master 서버(정확하게는 ZooKeeper)에 문의를 하여 대상의 데이터(리전)를 보존하고 있는 Region 서버의 위치를 알려준다.

그런 다음 해당 Region 서버가 클라이언트의 요청을 담당한다.
리전은 항상 단일 Region 서버에서 관리되며 읽기 및 쓰기를 위해 데이터 일관성을 유지한다.

Region 서버가 다운되면 할당 된 지역은 다른 Region 서버로 장애 조치된다. (이 작업은 Master 서버에서 수행)
그러나, 장애 조치가 완료될 때까지 클라이언트는 대상 리전에 읽고 쓸 수 없다.

HBase Region Server

RegionServer의 구성 요소

RegionServer의 구성 요소를 살펴보겠다.

WAL(Write-Ahead Logging)

WAL이란? 데이터 무결성을 보장하는 표준 방법으로, DB에서 사용하는 방법이다. WAL을 사용하는 시스템에서는 데이터 수정을 하기 전 WAL에 먼저 기록을 하게 되며, 이 기록을 이용해 어느시점에 장애가 발생했는지, 어디까지가 성공한 것이고 어디부터 이후 작업이 실행되어야 하는지에 대해서 알 수 있다.

postgreSQL, HBase MongDB 등 다양한 DB시스템에서 WAL 방식을 사용한다.

Apache HBase WAL은 편집 로그 파일이라고도 하는 중간 파일이다. HBase에 데이터를 읽거나 수정할 때 디스크에 직접 쓰는 것이 아니라 일정 시간 동안 메모리에 보관하는데, 이로 인해 시스템이 다운되면 모든 데이터가 지워지므로 이를 극복하기 위해 데이터를 메모리에 보관하는 것은 위험할 수 있으므리로 이 문제 극복하기 위해 Apache HBase에는 데이터가 먼저 메모리에 기록된 다음 메모리에 기록되는 Write-Ahead Logging 파일이 가지고 있다.

HFile

HFile는 HBase에 데이터를 저장하기 위한 포맷으로 Column Family 내에 속하며 Column Family는 여러개의 HFile를 가질 수 있다. Row 데이터가 물리적으로 저장되는 실제 파일이며, 데이터는 Key/Value 형식으로 저장된다. MemStore는 데이터가 충분히 차면 새로운 HDFS에 새로운 HFile을 만들어서 저장한다.
랜덤액세스를 최소화하는 구조로 이 과정은 매우 빠르게 이루어진다.

Store

HBase의 테이블에 대한 Column family에 해당한다. 여기에 HFile이 저장된다.

MemStore

MemStore는 주 메모리에 상주하며, 현재 데이터 작업을 기록하므로 데이터가 WAL에 저장되면 Region Server 메모리 저장소에 key/value 데이터를 정렬해서 저장한다. 이 데이터를 그대로 HFile에 저장한다. 하나의 Column Family당 하나의 MemStore가 존재한다.

Region

지역은 키를 기반으로 분할되고 RegionServers에서 호스팅하는 테이블의 분할이다.

클라이언트

클라이언트는 Java 또는 기타 언어로 작성하고 외부 API를 사용하여 실제 행 데이터를 관리하는 RegionServer에 연결할 수 있다. 클라이언트는 지역을 찾기 위해 카탈로그 테이블에 쿼리하고 지역이 발견되면 클라이언트는 직접 RegionServers에 접속하여 데이터 작업을 수행하고 빠른 검색을 위해 데이터를 캐시한다.

카탈로그 테이블

카탈로그 테이블은 모든 RegionServer 및 지역에 대한 메타데이터를 유지하는 데 사용된다.

HBase에는 두 가지 유형의 카탈로그 테이블이 있다.

  • -ROOT- 이 테이블에는 META 테이블의 위치에 대한 정보가 있다.
  • .META 이 테이블에는 모든 지역 및 해당 위치에 대한 정보가 포함되어 있다.

Zookeeper

Apache ZooKeeper는 HBase의 코디네이터와 같다. HBase는 주키퍼를 이용해서 클러스터를 구성하는 서버들의 상태를 관리한다. 구성 정보 유지, 이름 지정, 분산 동기화 제공, 서버 오류 알림 등과 같은 서비스를 제공한다. 클라이언트는 주키퍼를 통해 지역 서버와 통신한다.

Apache ZooKeeper는 HBase에 분산 동기화 및 그룹 서비스를 제공하는 분산 응용 프로그램을 위한 고성능 중앙 집중식 다중 조정 서비스 시스템이다. 클러스터 조정에도 불구하고 애플리케이션 로직에 사용자의 초점을 둔다. 또한 사용자가 마스터 서버와 연동할 수 있는 API를 제공한다.

Apache ZooKeeper API는 일관성, 순서 지정 및 내구성을 제공하며 분산 클러스터 시스템에 대한 동기화 및 동시성도 제공한다.

HBase 데이터 쓰기/읽기 과정

HBase에서 데이터를 읽고 쓰는 과정에 대해서 알아보도록 하자.

HBase 데이터 쓰기

HBase에서 데이터를 저장할 때는 두 가지 장소에 저장하게 되는데, WAL(Write Ahead Log)와 Region 서버의 MemStore에 데이터를 저장한다.

위의 두 가지 방법을 활용하여 정상적으로 쓰기 과정이 끝나는 것은 WAL과 Memstore에서 모두 변경이 일어난 시점이 된다.

HBase에 데이터 적재 요청이 오면 먼저 적절한 Region server을 찾게 된다. Region server를 찾아 Commit log를 추가 하고 메모리 내의 MemStore에 추가되게 된다. MemStore에 저장되어 있던 데이터는 설정되어 있는 설정값에 따라 가득차게 되면 HFile이라는 형태로 디스크에 Flush되며 메모리를 비우고 다시 요청을 기다리게 되며, WAL에도 이에 대한 기록을 하게 된다. MemStore flush는 hbase.hregion.memstore.flush.size 값을 넘기는 경우 발생하는데, 단위는 byte로 134217728(128MB)로 설정되어 있다.

MemStore는 Region 서버의 메모리 영역이며, 캐시와 같은 기능을 한다. 그리고, MemStore의 데이터가 일정량 모인 곳에서 디스크상에 HFile 로서 데이터를 내보내서 영속화한다.
그러나, HFile으로 내보내기 전의 데이터는 서버의 메모리(MemStore)에 저장되어 있기 때문에 서버가 다운되면 사라진다. 따라서, HBase는 HLog라는 데이터를 쓸 때 로그를 남기고 서버가 다운되면 HLog를 바탕으로 데이터를 복구 할 수 있다.

HBase 데이터 읽기

HBase에서 데이터를 읽는 과정은 앞에서 언급한 HBase 데이터 쓰기 과정에 대해서 이야기 했는데, 데이터를 읽어오는 과정도 비슷한 과정을 거치게 된다.

HBase에 요청이 들어오는 경우 먼저 MemStore를 살펴보게 되는데, MemStore에서 원하는 데이터를 찾으면 해당 데이터를 반환하게 된다. 그렇지 않은 경우 최근 Flush된 파일부터 오래된 순으로 쿼리를 만족하는 적합한 데이터를 발견하거나 더 이상 Flush 파일이 없을때까지 반복하게 된다.

참조




최종 수정 : 2024-01-18