[HBase] Shard과 HBase Region의 구조

Shard와 HBase Region의 구조

img

일반적으로 샤딩이란 논리적 테이블을 수평적으로 파티셔닝하여 레코드를 논리적으로 분할하는 것인데, 데이터를 분산저장하기 위해서 사용한다.

각 데이터를 적절한 장소로 라우팅routing 하기위해서는 해시함수와 같은 규칙을 미리 정의해야 한다. 수평적 파티션에서 하나의 파티션 용량이 가득 찬 경우 리샤딩reshard 작업이 수행되는데 이는 경우에 따라 데이터의 저장구조가 변경 될(파티션 간 경계를 재설정, 데이터 수평적 재분배 등) 필요가 있음으로 리소스의 비용이 많이 든다. 이때는 I/O가 높아짐으로 데이터 update가 제대로 안 일어날 수도 있다.

Reshard 문제는 가상샤드(virtual shard)를 통해 어느정도 완화할 수 있다. 이것은 논리적 테이블을 매우 세부적으로 분할하고 실제 노드(서버) 수와 상관없이 virtual shard를 할당한다. 서버를 추가하는 경우 virtual shard를 재할당 하면 된다.

img

일반적으로 RDBMS에서 샤딩을 적용하였다면 DBA의 에포트가 많이 들어가게 된다. RDBMS에서는 확장성을 위한 이러한 작업이 비용이 많이 들기 때문에 DDI(Denormalization, Duplication, Intelligent key) 스키마를 특성으로 하는 NoSQL 솔루션(Hbase 등) 사용한다.

HBase의 Region은 HBase의 확장성 및 로드밸런싱 기본단위이다(like virtual shard). 하나의 region은 기본적으로 함께 저장된 인접한 row들이 존재한다. region이 너무 커지면 시스템에 의해 동적으로 분할되며, 필요에 따라서 저장 파일 수를 줄이기 위해 offline으로 합쳐지기도 한다(별도의 tool을 사용해야 한다). 최초의 table은 region이 단 하나 존재하지만 데이터를 추가함에 따라서 시스템의 설정된 region의 최대 크기를 넘지 않도록 모니터링 한다. 한계가 넘으면 중간 rowkey에서 둘로 분리되어 대략적으로 동일한 크기를 가진 두개의 region을 생성한다. region server는 여러개의 region을 가진다.

img

> 같은 region에는 연속된 rowkey의 값들을 가지고 있다. > 칼럼패밀리ColumnFamily는 store 단위로 저장되는데, rowkey를 기준으로 region server의 region 안에 나뉘어 저장된다.

- 빅데이터 논문에서는 region의 수를 서버당 10개에서 1000개 사이로 설정할 것을 권고하며각 region의 크기를 100MB에서 200MB 사이로 유지하는 것을 목표로 하라고 하였으나이는 2006년도의 H/W Spec임을 고려하면 10~1000개의 region을 각각 1GB ~ 2GB 정도로 설정하는 것이 적정할 것으로 보인다.

- region을 분할하고 운용하는 것은 다른 플랫폼에서 제공하는 것과 같은 자동샤딩AutoShard이다. 서버에 장에가 발생하면 재빨리 복구해 주고, 부하 및 고장난 경우에도 region을 이동할 수 있다. region의 분할은 매우 빠른데 압축작업이 분할된 리전을 별도의 파일에 비동기적으로 재작성 할 때까지는 단순히 원래 저장하고 있는 파일에서 접근이 되기 때문이다.

- Column family는 ‘columnFamily:qualifier’ 조합으로 표현되는데 column family에는 수 제한이 있지만 column 자체에 대해서는 제한이 없다. 비어있는 qualifier도 사용이 가능하지만 그것 또한 unique 하게 취급됨으로 사용에 주의를 해야 하며 특별한 이유없이는 이를 사용하지 않는 것이 좋다. column family의 수가 많은 경우 플러쉬flush 되고 컴팩션compaction 되는 동안에 column family 단위로 addressing이 이루어 짐으로 비효율적으로 I/O가 과도하게 발생한다.

* 출처 https://docs.microsoft.com/en-us/azure/architecture/patterns/_images/index-table-figure-6.png HBase: The Definitive Guide, Lars George