HomeBlogGuestbookLab 

JDM's Blog

온갖 테스트 결과가 기록되는 이곳은 JDM's Blog입니다. :3

Hbase Region & RegionServer

Hbase에서 Region(이하 "리전")이라는 용어가 있습니다. Hbase에서 리전은 매우 중요한 용어 중 하나인데요. 간단하게 살펴보는 포스팅입니다. 자료의 출처는 Hbase - 66. Regions입니다.

Hbase Region

리전이란 테이블(table)를 위한 분산 및 가용성의 기본 요소 단위입니다. 그리고 컬럼패밀리(Column Family)마다 스토어(Store)를 포함하고 있습니다. 계층 구조는 다음과 같습니다.

┏━━━━━━━━━━━━━━━━━━━━━━━┓ * 좌측 다이어그램에서
┃Table                                         ┃   "…" 표시는 복수개를 뜻합니다.
┃┏━━━━━━━━━━━━━━━━━━━━┓  ┃
┃┃Region                                  ┃  ┃ * 트리구조로 보면 아래와 같습니다.
┃┃┏━━━━━━━━━━━━━━━━━┓  ┃  ┃   /Table
┃┃┃Store                             ┃  ┃  ┃      /Region
┃┃┃┏━━━━━━┓ ┏━━━━━━┓ ┃  ┃  ┃         /Store
┃┃┃┃MemStore    ┃ ┃StoreFile   ┃ ┃  ┃  ┃            /MemStore
┃┃┃┃            ┃ ┃┏━━━┓  ┃ ┃…┃…┃            /StoreFile
┃┃┃┃            ┃ ┃┃Block ┃…┃ ┃  ┃  ┃               /Block
┃┃┃┃            ┃ ┃┗━━━┛  ┃ ┃  ┃  ┃
┃┃┃┗━━━━━━┛ ┗━━━━━━┛ ┃  ┃  ┃
┃┃┗━━━━━━━━━━━━━━━━━┛  ┃  ┃
┃┗━━━━━━━━━━━━━━━━━━━━┛  ┃
┗━━━━━━━━━━━━━━━━━━━━━━━┛

다이어그램에서 보듯이 테이블은 여러개의 로우(Row)들로 구성되어 있는데 이것을 리전이라는 영역으로 구분을 하는 것입니다. 다시 말해, Hbase 테이블의 로우(Row)들을 수평으로 분할하고 이것을 하나로 묶은 것이 리전입니다.

Region Server

테이블의 로우를 나눠서 수평 분할한 것이 리전이라면 Region Server(이하 "리전 서버")는 이러한 리전을 가지고 있는 서버를 말합니다. 따라서 리전 서버는 리전을 관리하는 모체가 됩니다. 이러한 리전 서버는 DataNode에서 실행됩니다. 여기서 말하는 DataNode라는 것은 HDFS 블록을 저장하는 책임이 있는 주체를 말합니다.

Number of Regions

리전과 리전 서버에 대해서 잠깐 알아봤습니다. 하지만 고려해야할 사항이 하나 있는데 바로 리전의 개수입니다. Hbase에서 리전의 개수는 서버마다 20~200개 정도, 각 리전의 크기는 5~20GB 정도로 설계가 되어 있습니다.

통상적으로 여러가지 이유로 인해 리전의 숫자를 줄이고 유지하는 것을 원합니다. 일반적으로 리전 서버 마다 100개의 리전이 알맞다고 합니다. 이유는 Why should I keep my Region count low? 링크를 참조해주세요. 링크에서는 MSLAB의 크기, 메모리의 잦은 Flush, Master의 과부하등을 얘기하고 있습니다.

또 다른 문제로는 Map/Reduce의 작업 영역이 많아지므로 이것 또한 문제가 될 수 있습니다.

Region Assignment

리전을 리전 서버에 할당하는 방법을 알아봅시다.

Startup

Hbase를 시작하면 아래와 같은 순서로 리전을 할당합니다.

  1. Master가 시작되면 AssignmentManager를 호출합니다.
  2. AssignmentManagerhbase:meta에서 할당할 리전이 존재하는지 찾아봅니다.
  3. 만약 리전 할당이 유효하다면 할당은 유지됩니다. (유효라는것은 리전서버가 온라인인 상태를 말합니다.)
  4. 만약 할당이 유효하지 않다면 LoadBalancerFactory는 리전을 할당하기 위해 호출합니다. 로드밸런서는 리전 서버에 리전을 지정합니다.
  5. hbase:meta는 갱신됩니다. 갱신되는 내용은 리전 서버 할당과 리전 서버 시작 코드같은 것입니다.

Failover

만약 리전서버에 문제가 생기면 다음과 같은 순서로 처리합니다.

  1. 리전 서버가 다운되면 리전들은 즉시 사용 불가능으로 바뀝니다.
  2. 마스터는 리전서버가 다운됐다는 것을 감지합니다.
  3. 리전 할당은 유효하지 않은 것으로 간주되고 startup 시퀀스처럼 다시 할당합니다.
  4. 내부 쿼리들은 재시도하게 됩니다, 버리지 않습니다.
  5. 동작들은 새로운 리전 서버쪽으로 교체됩니다.

사견으로 기존 리전 서버가 사용 불가능이 되었을 때 기존 데이터들은 HDFS 상에 저장되어 있으므로 새로운 리전 서버는 단지 레퍼런스만 재구축한다면 데이터 이동없이 데이터를 복원할 수 있는 것으로 생각됩니다.

Reference

해당 부분에 대해 참고할 수 있는 블로그 포스팅 하나를 소개합니다. HBase - Who needs a Master?라는 포스트입니다. 2013년 글로 조금 오래되었지만 이미지가 명확하게 되어 있어 참고하면 좋을 것 같습니다.

또한 클라이언트가 필요한 데이터를 찾는 방법에 대해서도 기술이 되어 있습니다. 시간이 있다면 한번쯤 읽어보면 어떨까요?

Closing Remarks

간단하게 Hbase 리전과 리전 서버에 대해 알아봤습니다. :3