7장 NoSQL

NOSQL의 특징과 최근 공개된 데이터 저장소의 데이터 분산이나 확장방법과, 정합성(Consistency) 혹은 가용성(Availability)을 어떻게 보장하는지 확인 및 클라우드 데이터 서비스에서는 이런 속성등이 어떻게 서비스 되는지 살펴봄

관계형 데이터 관리시스템은 ACID 속성에 집중해 데이터를 안전하게 저장하고 정합성을 보장하는데 주목적이 있음

  • 원자성(Atomicity) : 트랜잭션과 관련된 작업들이 모두 수행됐는지, 아니면 모두 실행이 안됐는지를 보장하는 능력
  • 일관성(Consistency): 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성이 있는 데이터베이스 상태로 유지함
  • 고립성(Isolation): 트랜잭션을 수행할 때 다른 트랜잭션의 연산 작업이 끼어들지 못하게 보장함
  • 지속성(Durability): 성공적으로 수행된 트랜잭션은 영원히 반영돼야함

최근 인터넷과 하드웨어 발전으로 인해 검색서비스, 소셜 네트워크 서비스, 데이터웨어하우징 같은 다양한 서비스가 출현
이런서비스들은 데이터에 대해 강한 수준의 정합성이나 견고성보다는 손쉬운 확장성, 시스템 확장과정이나 장애상황에서도 서비스를 유지할수 있는 고가용성, 낮은 비용 등을 요구함

이런 속성을 BASE로 표현하며 BASE에 맞는 새로운 데이터 관리시스템이 출현하게 됨

  • Basically Available: 언제든지 접근할수 있어야 하는 속성
  • Soft state: 특정시점에서는 데이터 일관성이 보장되지 않는 속성
  • Eventually consistent: 일정 시간이 지나면 데이터의 일관성이 유지되는 속성

결국 확장성, 고가용성 제공해야 하지만 표준 SQL이나 엔터티 간의 관계을 지원하지 않는 데이터 관리 시스템이 등장하게 됐으며, 이런 데이터 관리시스템을 NoSQL이라고함

NoSQL개요

2000년대 접어들면서, 데이터는 급속도로 증가했으며, 글로벌하게 웹서비스를 제공하는 구글, 야후, 페이스북 등과 같은 업체에서 관계형 데이터베이스만으로는 서비스를 효율적으로 제공할수 없다는 것을 인식하고 서비스의 요구사항에 부합되는 데이터 저장소를 별개로 개발해 사용하기 시작함

관계형 데이터베이스는 그 자체적으로 대규모의 데이터를 저장하기 위해 스케일아웃 (Scale-out) 방식으로 확장하기 어려움
구글, 야후, 페이스북 같은 인터넷 서비스 업체들은 이들 서비스가 저장중인 대용량의 데이터는 고가의 솔루션에 저장할 수준의 고가용성을 요구하지 않은 경우가 많으며, 저가의 스토리지나 분산파일 시스템등을 이용함
수억~수십억건 이상의 데이터에 대해 조인(join)같은 연산이 불필요하며, 강한 데이터 정합성보다는 필요에 다라 데이터를 복제해서 안정적으로 보관하고, 장애상황에도 즉시 데이터를 조회할수 있는 저장소가 필요함
수십억건 이상의 데이터를 저장하고 있는 테이블에 대해 인덱스를 재구성, 칼럼의 추가등과 같은 작업은 시스템이 운영중인 상황에서는 현실적으로 불가능함

  • 따라서 인덱스와 데이터가 분리돼 별도로 운영
  • 스키마에 대한 정읟 자유롭거나 스키마 자체가 없는 요구사항도 추가됐음

h3.CAP이론
분산환경에서 데이터 관리 시스템을 구성할 경우 CAP이라는 이론이 있음


 * 정합성(Consistenecy) : 모든 클라이언트는 항상 동일한 데이터를 보장받는 속성
 * 가용성(Availability) : 분산 시스템에서 가용성은 네트워크 단절 상황에서도 장애가 발생하지 않는 노드는 모든 요청에 대해 정해진 시간내에 응답을 해야 한다는 속성
 * 단절내성(Partition Tolerance) : 네트워크가 단절된 상태에서도 시스템의 속성(정합성 이나 가용성)을 유지해야 한다는 속성
                                  시스템이 단절내성을 갖으려면 노드 사이에 전송되는 메시지가 전달되지 않는 상황에서도 시스템에 제공하려는 정합성이나 가용성을 지원해야 함
                                  분산환경에서는 네트워크상에 서버들이 분산배치되기 때문에 이 속성이 반드시 포함해야 하는 속성임

CAP이론은 "적절한 응답 시간 내의 세 가지 속성을 모두 만족시키는 분산 시스템을 구성할수 없다" 라고 정의한 이론

MySQL의 복제Replication 기반 마스터슬레이브 구성에 대해 CAP속성을 분석
MySQL의 마스터-슬레이브 구성에서 쓰기 연산은 그림 7.2에서와 같이 마스터 서버에서만 처리하고 읽기연산은 마스터와 슬레이브 모두에서 처리함
이런구성에서 마스터에 장애가 발생하면 쓰기연산에는 가용성을 지원하지 않고 분산구성도 아니기 때문에 일기 연사만 고려해봄

클라이언트에서 Insert , Delete , Update 같은 데이터의 수정연산은 MySQL의 마스터 서버로만 접속하고, 읽기연산은 슬레이브로만 접속한다고 가정함


 * 정합성: 그림 7.2에서 네트워크가 정상적인 경우에 클라이언트는 슬레이브 1, 슬레이브 2 어떤서버에 접속하더라도 동일한 데이터를 읽을수있음, 따라서 데이터 정핪성을 만족함
 * 가용성: 동일한 데이터가 여러개의 슬레이브 노드에 저장돼 있기 때문에 특정 슬레이브에 장애가 발생하더라도 클라이언트는 읽기 연산을 수행할 수 있다. 따라서 가용성을 만족시킨다.
 * 단절내성: 그림 7.2와 같이 네트워크가 단절되면 클라이언트1, 클라이언트2 모두 데이터 조회가 가능함
             하지만 네트워크가 단절된 이후 데이터 수정이 발생하면 슬레이브 1 과 슬레이브 2의 데이터가 다른 버전을 갖게 돼
             클라이언트1 , 클라이언트2에서 조회하는 데이터가 다를수 있다.
             네트워크 상태에서 데이터 정합성을 만족시킬수 없음

따라서 MySQL의 마스터-슬레이브 구성에서

  • 읽기연산은 AP 속성만 제공함
  • 읽기/쓰기 모두에 대해서는 CA만 제공함 (단절이 되면 쓰기 연산에서는 가용성을 만족 시킬수 없기 때문임)

관계형 데이터베이스는 정합성과 가용성에 초점이 맞춰져 있음

h3.NoSQL의 특징과 구분

NoSQL의 범주로 분류 하는 기준

  • 관계형 데이터 모델이 아닌 키-값 또는 키-값을 응용한 데이터 모델
  • 안정적이고 고가의 하드웨어가 아닌 다수의 값싼 하드웨어 이용
  • 데이터는 분산된 노드에 파티션, 복제돼 저장
  • 데이터 정합성에 대한 요구사항보다는 단절내성에 대한 요구사항이 더 중요
  • 2단계 커밋 (2 phase commit) 수준의 트랜잭션보다는 정족수 Quorum 기반의 트랜잭션을 선호
데이터모델설명
키-값 모델가장 단순한 데이터 모델로, 키와 바이너리 타입의 값을 저장하는 구조
칼럼 모델데이터는 칼럼에 저장되며 테이블, 칼럼등과 같이 스키마가 존재하는 모델
문서 모델데이터의 저장 단위가 문서가 되면, 하나의 문서내에는 여러 개의 필드와 필드에 대응하는 값이 존재함
그래프모델그래프에 있는 노드(node) 와 엣지 (Edge)를 저장하고 이를 쉽게 내비게이션할 수 있는 모델

NoSQL 솔루션 분류

데이터모델솔루션
키-값memcached, Dynamo, Volemort , Tykyo Cabiner, Redis
칼럼Google Bigtable , Cloudata, HBase , Hypertable , Cassandra
문서MongoDb , CouchDB
그래프Neo4j, FlockDB, InfiniteGraph

h4.NoSQL의 특징, 분류
데이터를 여러 서버에 배치하는 경우 데이터 분산을 어떻게 하느냐에 따라 크게 메타데이터 방식, P2P방식으로 분류


* 메타데이터 방식 : 데이터의 배치정보가 중앙집중적인 데이터 서버나 마스터 서버에 저장돼 있으며, 클라이언트는 데이터연산을 위해
                    메타데이터나 서버를 경유해 실제데이터를 처리할 서버로 접속하는 방식
                    - 장점: 데이터 배치에 대한 정보를 중앙에서 관리하기 때문에, 관리하기 편하며 맵리듀스 등가 결합하기 쉬움
                    - 단점: 데이터를  관리하는 서버나 관리 데이터에 문제가 발생하면 전체 데이터에 접근할수 없다는 점
                    예) 빅테이블(Bigtable) , 몽고DB(MongoDB) 등이 이런방식 사용
                   
* P2P방식 : 별도의 메타 정보가 없으며, 해시함수를 이용해  특정 키를 서비스하는 서버를 찾는방식
            - 장점: 메타 정보나 이를 관리하는 서버가 없기때문에, 장애가 지역적인 키 영역에만 나타남
            - 단점: 저장된 데이터를 이용해 분석 작업을 하는 경우 메타데이터 방식보다 어려움


데이터 저장방식에 따른 분류


* 데이터 파일을 분산 파일 시스템에 저장하고 데이터 관리 시스템에서는 논리적인 관리만 담당하는 방식
  - 데이터의 복제, 장애발생 시 복제본의 재생성 등은 분산파일 시스템 제공하는 기능을 이용
  - 예) 빅테이블(big table) , 클라우데이터(Cloudata) , Hbase
* 데이터 관리시스템 자체적으로 데이터 파일을 저장하는 방식
  - 데이터 관리 시스템 자체적으로 복제, 장애 시 복구등에 대한 기능을 모두 처리함
  - 예) 빅테이블이나 빅테이블을 모방한 솔루션을 제외한 대부분의 솔루션이 이런 방식으로 구현돼 있음

NoSQL을 사용할때에는 구축하려는 시스템의 적합한 솔루션인지 판단하기 위해 다음 항목을 비교 검토해야함

  • 데이터 복제여부: 저가의 하드웨어를 사용하기 때문에 데이터는 반드시 복제돼야 함
  • 특정서버 장애시 데이터 연산 수행가능 여부: 저가 하드웨어 사용하기 때문에 일부서버에서 장애가 수시로 발생할 수 있다는 가정하에 솔루션을 검토해야함
    특정서버에 장애가 발생한 경우에도 데이터 연산은 수행가능해야 하며, 장애가 발생한 서버를 새로운 서버로 교체한 후 투입시에도 쉽게 추가가능해야함
  • 데이터 모델: 데이터 모델이 시스템의 요구사항에 부합해야함
  • 데이터 구조: NoSQL솔루션에 저장할수 있는 데이터 규모가 쉽게 확장 가능한 구조인 지 확인
  • 관리의 편의성: 대부분 분산된 여러서버에 배치돼 운영하므로, 서버를 구성하거나 추가/삭제 작업이 편리해야함

대부분 분산 시스템으로 구성되기 때문에 데이터 모델뿐만 아니라 데이터 분산, 클러스터 맴버쉽, 장애대응 등 다양한 분산 이슈를 해결해야 하므로 구현 자체가 복잡한 경우가 많음
문서가 부족해 사용하기 어려움

NoSQL을 이해하려면 해당 오픈소스의 이론적 배경을 설명하는 논문등을 충분히 이해하고 접근하는것이 좋음
예) HBase는 빅테이블 논문 , 카산드라(Cassandra)는 다이나모(Dynamo)논문 등..

구글 빅테이블

빅테이블

  • 구글에서 개발한 분산 데이터 관리 시스템으로, 수백내지 수천대의 값싼 하드웨어 장비를 이용해 페타(Peta) 바이트 이상의 구조화된 데이터(semi structered data)를 저장할수 있음
  • 데이터 모델: 분산돼 있는 다차원으로 정렬된 됌
    • 모든 데이터는 로우키(row key) , 칼럼 키(column key ) , 타임스템프(timestamp)로 정렬돼 있음
    • 값에는 바이트 배열을 저장할수 있음
    • 데이터 모델을 구성하는 주요 엘리먼트는 열(row) , 칼럼패밀리(Column Family) , 타임스템프(TimeStamp)등이 있음
  • 하나의 테이블에 저장된 데이터는 로우 키로 유일하게 식별되며, 읽기/쓰기 연산은 하나의 열단위로 원자적으로 처리함
  • 하나의 아주큰 테이블을 로우 키의 영역을 이용해 파티셔닝하며, 파티셔닝된 단위를 테블릿(Tablet)이라 부름
  • 하나의 태블릿은 특정서버에 의해 서비스 되며, 하나의 서벗는 수천개의 테이블을 서비스함

파티셔닝 범위, 서비스 서버 등과 같은 파티셔닝에 대한 정보는 하나의 루트 테블릿과 다수의 메타 테블릿에 저장
루트 테블릿을 서비스하는 서버의 정보는 zookeeper 와 같은 역할을 하는 chuby (distributed lock service)에 저장되며,
루트 테블릿에서 하나의 열에는 하나의 메타 tablet에 대한 정보 (tablet 이름, 최대 row key, 서버 정보)를 저장
메타 테블릿에서 하나의 열에는 사용자 테이블에 있는 하나의 테블릿에 대한 정보를 저장.
특정 row key를 서비스하는 사용자 테이블의 테블릿과 테블릿 서버를 찾기 위해 chuby -> 루트 테블릿 -> 메타 테블릿 순으로 찾는다.

하나의 빅테이블 클러스터는 하나의 마스터 서버와 다수의 테블릿 서버로 구성된다.
마스터 서버는 마타 정보 같이 클러스터 관리에 필요한 정보를 갖고 있지 않기 때문에 마스터 장애 시에도 데이터 서비스는 영향을 받지 않는다.
마스터 서버는 테블릿을 할당하거나, 테블릿 서버가 클러스터에 추가/제거되는 것을 감지하고, 테블릿 서버의 부하 분산과 구글 파일 시스템에 저장된 파일에 대한 가비지 컬렉션을 수행한다.
테블릿 서버는 테블릿을 관리하고 클라이언트로부터 데이터 읽기/쓰기 요청을 받아 처리하며,하나의 테블릿 서버는 수천 개까지 테블릿을 서비스하고, 하나 테블릿 크기는 100~200MB이다.

빅테이블은 구글파일 시스템, 맵리듀스, 처비 등과 같은 구글 내부의 분산 플랫폼 이용함

구글 파일시스템은

  • 하둡파일시스템의 기본 설계를 제공한 파일 시스템
  • 파일의 랜덤쓰기 기능을 제공하지 않기 때문에 이미 저장된 파일을 수정하는 것이 불가능함
  • 파일시스템의 이런 제약때문에 빅테이블은 메모리기반(in-memory) , 디스크기반(On-Disk) 데이터 관리시스템의 속성을 모두 갖고 있음
    • 빅테이블의 쓰기 연산은 데이터 파일을 직접 수정하지 않고 메모리에만 쓰기 연산의 내용을 기록함
    • 메모리 크기가 일정 크기에 도달하면 메모리의 내용을 파일 시스템에 저장함
    • 쓰기연산은 메모리에서만 발생하기 때문에 테블릿 서버에 장애가 발생한 경우 데이터 복구를 위해 모든 쓰기 연산처리시 구글파일시스템
      에 커밋로그를 저장한 후 메모리에 저장함
  • 빅테이블은 구글 파일시스템을 데이터 파일이나 커밋로그 저장용으로 사용함
    • 구글파일시스템은 하나의 파일을 3개의 복제본을 갖고 있기 때문에 추가적인 백업이 필요없음
    • 수천노드 이상으로 확장할수 있는 확장성과 복제본 간의 정합성 제공
  • 빅테이블에 저장된 데이터에 대해 대규모 분석작업이 필요한 경우 맵리듀스 플랫폼을 이용하며, 분산처리단위는 테블릿임
  • 처비는 분산 락 서비스를 제공하는 시스템으로
    • 빅테이블에서는 루트메타 정보를 서비스하는 테블릿 서버의 위치 정보, 테이블 스키마 정보등을 저장
    • 여러 마스터 서버가 동시에 실행 중일때 유효한 마스터 서버를 선출함
    • 테블릿 서버의 장애상황 감지함
  • 하나의 처비의 셀은 5개의 노드로 구성 되면 , 노드간에 모든정보는 동기화 돼 마스터 정보에 대해 SPOF지점을 없애는 역확을 수행함
  • 빅테이블은 구글 파일시스템을 이용함을써 정합성을 보장하지만 네트워크 단절상황에서 가용성을 지원하지 않음
  • 사용서비스) Google Earth, Google Finance , Google Analytics , Personalized Search 등 서비스 적용

h2.HBase

HBase는 빅테이블과 동일한 기능과 확장성을 갖는 분산 데이터 관리를 목적으로 개발된 아파치 파운데이션의 오픈소스 프로젝트임
HBase도 데이터 파일 저장소로 하둡파일 시스템을 사용하고 클러스터 관리를 위해 주키퍼를 이용함

HBase 시스템 구성도

HBase는 아래의 3개로 구성됨

  • 마스터서버(Master)
    • 테이블생성, 삭제 등의 작업을 위해 사용되며, 이중화 구성이 가능함
      • 마스터 서버의 역활이 단순히 테이블 관리 역활을 수행하지만 , 마스터 서버에 장애가 발생할 경우 클라이언트 라이브러리에도 에러가 발생
  • 리젼서버(HRegionServer)
    • 실제 데이터 서비스를 제공하는 서버
    • HBase에서는 빅테이블과 클라우데이터에서 테블릿에 해당하는 테이블이 분리된 단위를 리젼(Region)이라고함
    • 하나의 리젼서버는 n개의 리젼을 관리함
    • 리젼은 메모리 기반과 디스크 기반의 저장소를 가짐
      • 메모리에 있는 데이터는 서버 중지시 유실을 방지 위해 HLog 객체가 관리하는데, 실제파일은 하둡 파일 시스템에 저장됨
      • 하둡파일시스템에 저장된 파일은 불변(immutable)파일로, 한번생성된후 저장된 파일은 추가하거나 변경할수 없음
      • 파일시스템에 이런 제약으로 인해 HBase의 커밋 로그는 변경연산을 수행한 즉시 파일시스템에 저장하는 것이 아니라 주기적으로 파일시스템 저장됨
  • 클라이언트 라이브러리

데이터 모델

  • HBase의 데이터 모델은 빅테이블의 데이터 모들을 그대로 사용함
  • 칼럼 패밀리는 데이터의 종류를 구분하는 묶음의 단위를 나타냄
  • 하나의 열을 가진 하나의 칼럼 패밀리에는 n개의 데이터를 저장할 수 있음
  • 칼럼명은 데이터에 태깅을 하는 개념과 비슷하게 사용됨

설치

  • HBase 설치 전에 준배해야 하는 사항 : 자바, 하둡, ulimit설정등
  • http://hbase.hadoop.org 사이트에서 최신버전 다운로드
  • HBase디렉토리
    • bin:실행명령
    • conf: 환경설정
    • lib: 라이브러리
    • logs: 로그 디렉토리

HBase 환경설정

 
$ cd $HBASE_HOME
vi conf/hdfs-env.sh
#항목 중 JAVA_HOME
export JAVA_HOME=/usr/java/default
export HBASE_MANAGES_ZK=false

  • HBASE_MANAGES_ZK 항목은주키퍼 서버를 별도로 실행시킨 서버를 사용할 것인지, HBase자체적으로 주키퍼를 실행시킬것인지 여부를 설정하는 항목
    • ture:HBase에서 주키퍼를 실행함 , 주키퍼를 한대만 실행하기 때문에 주키퍼에 장애가 발생할 때 대응할수 없음
    • false: 이전에 설정된 zoo.cfg 의 환경정보를 conf/hbase-site.xml에 입력함

실햄모드


* 단독모드(Standalone Mode): 데이터 저장소로 하둡 로컬파일 시스템을 이용함
                              즉, 하둡 파일 시스템을 실행할 필요가 없으며, 지금까지 설정된 내용에서 HBASE_MANAGES_ZK=ture로 설정해 실행하는 모드
                              주키퍼, 마스터 서버, 리전 서버가 하나의 서버에서 실행함
* 가상분산모드(Peseudo Distributed Mode): 단독모드와 유사하지만 데이터 파일을 하둡 파일시스템에 저장함
* 완전분산모드(Fully Distributed Mode): 모든 서버가 분산돼 실행되고, 주키퍼도 별도의 클러스터 구성을 사용함

단독모드와 가상분산모드는 테스트용으로만 사용함, 실제운영환경에서는 사용하지 않음

 
- 가상분산모드 설정 (conf/hbase-site.xml)
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://localhost:9000/hbase</value>
    <description>..</description>
  </property>

  <property>
    <name>dfs.replication</name>
    <value>1</value>
    <description>..</description>
  </property>

hbase.rootdir 설정값은 : 데이터 파일이 저장되는 하둡파일 시스템의 클러스터 정보와 디렉토리를 지정함
dfs.replication 설정값은: 리플리케이션 개수를 지정함 (완전분산 모드 이값을 3으로 설정)


- 완전분산모드 설정 (conf/hbase-site.xml)
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
    <description>The mode the cluster will be in. Possible values are
      false: standalone and pseudo-distributed setups with managed Zookeeper
      true: fully-distributed with unmanaged Zookeeper Quorum (see hbase-env.sh)
    </description>
  </property>
  <property>
    <name>hbase.zookeeper.property.clientPort</name>
    <value>2181</value>
    <description>Property from ZooKeeper's config zoo.cfg.
    The directory where the snapshot is stored.
    </description>
  </property>
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>zk_server01,zk_server02,zk_server03</value>
    <description>The directory shared by RegionServers.
    </description>
  </property>


  • 리젼서버 목록 지정(conf/regionservers)
 
server02
server03
server04

리젼서버의 목록은 클러스터 시작시 리젼서버에 ssh를 접속해 실행시키는 용도로만 사용하고 운영중인 클러스터에서는 사용하지 않음
환경모두 설정했으면 프로그램을 모든 리젼서버로 배포하고 bin/start-hbase.sh 명령을 실행

  • 로그는 logs 디렉토리에 저장되면 실행 중 문제가 발생하는 내용은 로그파일에 나타나므로 확인해 대응함
  • 설치가 완료되었으면, 웹관리 도구와 쉘을 통해 정상적으로 설치되었는지 확인 (웹 관리도구 접속 Port: 60010)

HBase는 CLI기반 쉘을 제공하며 실행가능한 명령표
http://wiki.apache.org/hadoop/Hbase/Shell

 
./bin/hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.90.4, r1150278, Sun Jul 24 15:53:29 PDT 2011
이제 cf 컬럼 패밀리를 가진 test 테이블을 만듭니다.

hbase(main):001:0> create 'test', 'cf'
0 row(s) in 0.5790 seconds
이제 자료들을 삽입하겠습니다.

hbase(main):002:0> put 'test', 'row1', 'cf:a', 'value1'
0 row(s) in 0.2530 seconds
hbase(main):003:0> put 'test', 'row2', 'cf:b', 'value2'
0 row(s) in 0.0340 seconds
hbase(main):004:0> put 'test', 'row3', 'cf:c', 'value3'
0 row(s) in 0.0350 seconds
첫번째 삽입은 row에 value1을 값으로 가진 컬럼 cf:a을 삽입하는 것입니다. 컬럼들은 콜론을 기준으로 컬럼 패밀리 전치사 cf와 콜론 뒤의 컬럼 수식자 접미사 a식으로 구성되어 있습니다.

이제 스캔을 해봅시다.

scan 'test'
ROW                   COLUMN+CELL                                              
row1                 column=cf:a, timestamp=1316337980526, value=value1       
row2                 column=cf:b, timestamp=1316337990551, value=value2       
row3                 column=cf:c, timestamp=1316338000426, value=value3       
3 row(s) in 0.1210 seconds
하나의 값을 가져오는 것은 아래와 같습니다.

get 'test', 'row1'
COLUMN                CELL                                                     
cf:a                 timestamp=1316337980526, value=value1                    
1 row(s) in 0.0380 seconds
지우기 위해서는 disable과 drop을 합니다.

hbase(main):007:0> disable 'test'
0 row(s) in 2.0620 seconds
hbase(main):008:0> drop 'test'
0 row(s) in 1.1100 seconds
종료합시다.

예제프로그램

HBase 클라이언트 API는

  • 테이블 관리하는 HBaseAdmin
  • 데이터 연산을 수행하는 HTable, 그리고 연산별 클래스(Get, Put 등)로 구성돼 있음

데이터 저장을 위해서는 Put객체를 이용함

  • Put객체는 저장할 열 하나당 하나의 객체를 만듬, Put객체에 칼럼패밀리를 지정하고 칼럼 데이터를 추가함
  • 칼럼데이터는 컬럼명 과 컬럼값 임

데이터 조회하는 방법은 두가지가 있는데 Get 연산자과 Scan연산자임

  • Get: 특정 열의 데이터를 조회하는 연산
  • Scan: 특정범위의 열을 스캔하는 경우 사용하는 연산 (실시간 처리에서도 사용가능함)

배치 데이터 처리

HBase는 단순히 실시간 데이터 서비스만이 아니라 저장된 데이터를 맵리듀스와 같은 분산 병렬프레임워크를 활용해 분석할수 있는 기능을 제공
HBase는 리젼을 이용해 맵리듀스 작업에서 분산 처리되는 단위는 리젼임

  • 리젼의 메타 정보를 이용해 작업을 분리하고
  • 데이터를 스캔해 map() 메소드로 전달하는 등의 맵리듀스 프레임워크와 연동하는 클래스를 기본적으로 제공함

코드예제) 클라우데이터에서 만든입력 테이블의 로우, 칼럼을 바꿔 다른 테이블에 저장하는 'Inverted Job'을 HBase용으로 구현
맵리듀스 실행을 위한 환경 설정부분은 기존의 맵리듀스 프로그램과 유사 하지만 대신 입/출력을 하둡파일시스템이 아닌 HBase테이블이용함

  • (1)입력에 대한 설정을 함
    • 테이블명, 스캔옵션을 제공할 스캔객체, 매퍼클래스, 매퍼의 출력 키-값의 타입을 지정
  • (2)리듀스 관련 설정을 함
  • (3)매퍼의 구현을함
  • (4~5) 리듀서를 구현함

클라우데이터, HBase 모두 분산 파일 시스템 위에서 운영되는 데이터 저장 솔루션으로, 실시간 처리뿐만 아니라 저장된 데이터를
이용해 분석 작업을 처리하는데에 최적화 됐다고 할 수 있음

두 솔루션 모두 메모리에 임시로 데이터를 보관하고 분산 파일스시템으로 저장하는 개념이기 때문에
다음과 같은 상황에서는 성능이 저하되거나 병목현상이 발생할 가능성이 높으므로 이런상황을 고려해 시스템을 구성하고 튜닝해야함

  • 분산 파일시스템에 부하가 집중되거나 성능이 좋지 않는 경우
  • 메모리에서 파일시스템으로 저장하는 속도에 비해 put요청이 많은 경우

h2.카산드라(Cassandra)
h3.다이나모(Dynamo)

  • 아마존에서 개발한 키-값 쌍을 저장할 수 있는 분산데이터 관리 시스템
  • 다이나모는 쇼핑카트, 사용자정보, 제품 카달로그 등과 같은 키-값 기반의 고가용성이 필요한 업무에 주로 사용함
  • 고가용성을 위해 데이터를 여러 노드에 복제하고, 쓰기 연산에서는 복제본 간의 정합성을 보장하지 않고, 읽기 연산 처리시 복제본 간의 버전충돌을 처리함

다이나모의 설계원칙

  • 점진적인 확장성(Incremental scalability): 한번에 하나의 스토리지 노드를 추가하며, 노드 추가시 시스템에서 제공하는 기능이나 시스템 자체에 최소한의 영향만 미치게함
  • 대칭성(Symmmetry): 단순한 시스템 구성과 관리의 편의를 위해 클러스터의 모든 노드는 동일한 역확을 수행함
  • 분산(Decentraluzation): 중앙집중적으로 관리되는 데이터나 이를 관리하는 서버는 존재하지 않음
  • 이질성(Heterogeneity): 사양이 다른 서버들로 클러스터를 구성할수 있음

다이나모는 데이터분산 배치를 위해 P2P(peer-to-peer) 분산기법을 이용함

  • 초기의 P2P기술은 비구조화된(unstructured)네트워크 구성을 사용함으로써 네트워크오버헤드나 중앙집중관리 방식에서의 장애상황 등과 같은 단점이 있음
  • 최근의 P2P기술은 구조화된(structured)P2P라고 하면 데이터의 hash(k)와 클러스터에 참여하는 노드의 hash(node id) 의 값을 동일한 주소 공간으로 매핑해 관리하는 DHT(Distributed Hash Table)알고리즘을 사용함

다이나모는 DHT기법을 이용해 데이터를 파티셔닝함

  • DHT를 이용함으로써 노드의 추가/삭제 시 키에 대해 일관된 매핑결과를 보장받을수 있음
  • 매핑정보도 부분적으로만 변경되기 때문에, 클러스터에 부하를 주지 않음

DHT(Distributed Hash Table)
데이터와 서버를 동일한 주소 공간에 배치함으로써 데이터의 키 값과 분산환경에서의 서버 ID는 동일한 해시함수로 동이란 주소공간에
데이터와 노드를 배치함

DHT방식은 중앙집중적인 관리가 없어도 데이터를 관리하는 서버를 찾는 룩업에 성능이 좋으며
클러스터에 참여하는 서버의 추가와 제거가 자동으로 이뤄질 수 있게 구성할수 있음
하지만 해시함수를 이용한 유일한 키 값에 의존하기 때문에 복잡한 쿼리의 사용이 힘들다
(DHT 알고리즘으로는 Chord, CAN, Pastry, Tapestry 등이 있음 , 설명은 Chord로함)

DHT는 키 공간 분할(keyspace partition)과 오버레이 네트워크(overlay network)로 구성됨
- 키 공간 분할: 분산된 키를 어떻게 배치시킬 것인가를 결정하는 사항
                데이터에 hash(key)값을 이용해서 키 영역을 파티셔닝시킴
- 오버레이: 네트워크 물리적인 서버와 연결과 상관없이 논리적인 서버간의 연결관리와 키를 담당하는 노드를 찾아가는 매커니즘을 제공함
            특정키를 서비스하는 노드를 찾아가는 라우팅 알고리즘을 제공함

클러스터에 참여하는 서버는 hash(서버ID)결과로 반환되는 값을 이용해 자신이 관리해야 하는 키영역을 결정함
N1 서버는 hash(N1)보다 크거나 같고 hash(N2)보다 작은 값의 영역을 담당함
그림과 같은 서버 구성에서 'key1'을 관리하는 서버는 hash(key1)값에 의해 결정되며, 'key1'은 N1서버가 관리함

다이나모는 데이터 신뢰성을 위해 데이터를 여러 노드에 복제함
데이터의 복제는 클러스터에서 키에 매핑되는 노드와 매핑된 노드 다음에 위치하는 노드에서 '복제본 수 - 1개'의 노드에 저장함
데이터 복제는 낙관적(optimistic) 정책을 사용함

  • 낙관적정책: 복제본이 저장되지 않더라도 쓰기 연산을 정상적으로 처리하고 백그라운드 작업을 통해 복제본을 유지시키는 정책
    • 특정노드에 장애나 네트워크 단절상황이 발생해도 쓰기 연산을 처리할수 있는 가용성을 보장함
    • 낙관복제본 간의 데이터 일관성에문제가 발생하며 복제본간의 일관성을 맞추기 위해 두가지 전략을 갖고 있음
      • 첫번째: 다이나모 시스템 내부적으로 처리하는 방법으로 마지막 저장된 데이터를 최종버전으로 저장함
      • 두번째: 애플리케이션에서 처리하는 방법
        애플리케이션에서 get(key)연산을 이용해 데이터 조회하면 버전이 여러 개 있는 경우 여러개 버전과 이들에 대한 정보를 가진
        컨텍스트를 전달함 -> 애플리케이션은 내부 정책에 따라 저장할 데이터를 생성한후 put(key, context, object)연산을 호출해 데이터를 저장함

다이나모의 기본 요구 사항은 쓰기 연산에 대한 고가용성이지만 N,R,W라는 세가지 파라미터를 이용해 성능/가용성/내구성(durability)의 수준을 설정함

  • N값: 최종적인 복제본의 개수를 나타내고
  • R,W 값: 읽기/쓰기 연산에서 성공적으로 처리돼야 하는 복제본의 개수를 나타냄
    N값이 크면 내구성이 증가, W값이 1이면 하나의 노드만 존재하는 경우에도 스기를 보장하므로 성능과 가용성은 증가하지만 복제본 사이의 정합성이 떨어짐
    기본구성에서는 N, R, W값은 (3,2,2)dla

다이나모 CAP속성

  • 하나의 노드가 유효할때까지 데이터 서비스가 가능하기 때문에 고가용성 지원함
  • 서비스 중단없이 데이터 파티셔닝을 지속적으로 수행할수 있음
  • 이벤추얼 정합성(Eventual Consistency)정책으로 인해 정합성은 완벽하게 지원하지 않음

다이나모는 소스는 공개되지않았지만 Scalaris, Project Voldmort , Ringo등과 같은 다이나모 개념을 구현한 오픈소스 프로젝트가 있음

카산드라는 다이나모 같은 P2P 네트워크 환경에서 구조화된 데이터 저장소를 제공하는 시스템을 페이스북에서 개발해 아파치 오픈소스로 공개함

카산드라 시스템의 구성

카산드라는 빅테이블의 데이터모델, 메모리기반/디스크 기반의 컴팩션 처리 기법과 다이나모의 일관성 해싱(consistent hashing)기법을 혼합해 구성한 시스템

  • 빅테이블 : 메타 테이블을 이용해 데이터의 파티셔닝 정보를 별도로 관리
  • 카산드라 : 일관적 해싱 기법을 이요하고 있기 때문에 메타정보가 없음(별도의 마스터서버가 없고, 모든서버가 동일한 기능을 수행)

각 노드는

  • 데이터를 관리하는 기능과 클라이언트로부터 요청을 받아 데이터를 서비스하는 기능을 수행
    • 클라이언트의 요청을 받은 서버는 자신이 갖고 있는 라우팅 정보를 이용해 해당키를 서비스하는 노드를 찾으며, 이노드를 코디네이터(coordinator)라고함
    • 코디네이터는 복제본에 대한 읽기,쓰기 처리를 수행하고 처리가 완료되면 클라이언트로부터 요청받은 노드에 처리 결과를 전송함
    • 클라이언트로부터 요청받은 노드는 처리 결과를 클라이언트에 전송함

카산드라는 P2P기반이기 때문에 클라이언트에서 클러스터의 정보를 찾이가 여러운 구조이므로, 별도의 네이밍 서비스를 사용함

  • 도메인 네임서버를 이용하는 방법
  • L4같은 로드 밸런서를 이용하는 방법

카산드라의 시스템 속성은 기본적으로 가용성과 단절내성(partition Tolerance)을 보장함

  • 다이나모: N,R,W 파라미터의 값을 변경함에 따라 다른 속성을 보장할수 있음
  • 카산드라: 현재버전에서는 N=R과 같은 요청을 하지 못하기 때문에 AP속성만 보장함

데이터 모델

카산드라는 관계형 데이터 모델은 지원하지 않으며, 기본적인 데이터 모델은 빅테이블의 데이터 모델과 비슷함
차이점은 두가지 타입의 패밀리를 제공함


"Column" 은 name(이름), value(값), timestamp(시간) 을 가지고 있습니다.
"Column Family" (타입이 같은 Column 의 모임, 이하 CF) 은 RDBMS 의 Relation(비공식: Table) 과 비슷한 의미를 가지고 있습니다. 특이하게도 CF 는 바로 Column 을 하위 구조로 가질 수도 있고 Column 의 모임인 Super Column 을 하위 구조로 가질 수 있습니다.
"Keyspace" 는 CF의 모임입니다. 예를 들자면 "사람", "음악" 이 Keyspace 고 사람 또는 음악이 가지는 다양한 특징을 구분지어 놓으면 CF 가 되는 것이지요.
"Cluster" 는 최상위 개념으로 이러한 Keyspace 의 모임입니다.

데이터 분산

카산드라 서버는 최초 서버 시작시 storage-conf.xml 설정파일의 Partitioner 와 InitialToken값을 이용해 서버에서 서비살 데이터 범위를 결정함

  • InitialToken: 서버의 키 영역을 임의의 값으로 할것인지 InitialToken에서 정
  • Partitoner: 데이터 저장할대 어떻게 배치시킬것인가에 대한 옵션
    • RandomPartitioner: 사용자가 입력한 키 값을 해시 함수를 이용해 변환한 값으로, 저장할 서버를 결정함
      인접한 키를 가진 데이터도 서로 다른 서버에 저장함
    • OrderPreservingPartitioner: 사용자가 입력한 키 값을 그대로 사용해 서비스 하는 서비스 하는 서버를 찾아감
      인접한 키를 가진 데이터는 동일한 서버에 저장함
    • CollatingOrderPreservingPartitioner: OrderPreservingPartitioner와 동일하지만 키의 바이트 순서가 아닌 EN,US순서로 저장함

나머지 내용은 책으로 설명함

URL 추천
HBASE
1. http://lunarium.info/arc/index.php/HBase%E3%81%AE%E6%A7%8B%E9%80%A0
카산드라
1. http://theeye.pe.kr/category/%ED%97%88%EC%A0%91%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8/NoSQL?page=2
2. http://dev.paran.com/2011/06/29/what-is-cassandra-dbms/
3. http://bcho.tistory.com/440