Published on

NoSQL Couchbase DB

Document 기반의 Key-Value 스토어

  • 키는 최대 250 바이트, 값(밸류)의 경우에는 카우치베이스 버킷의 경우 20MB, Memcached 방식의 버킷의 경우 1MB 까지 저장이 가능하다.
  • 저장할때, 키와 값뿐만 아니라 메타데이타가 같이 저장되는데, 메타 데이타에는 CAS,TTL,Flag 값 3가지가 저장된다.
  • CAS는 데이타에 대한 일종의 타임 스탬프와 같은 개념으로, 여러 클라이언트가 같이 데이타를 ACCESS 했을때, 일관성(Consistent) 문제가 생기는 것을 해결해줄 수 있다.
  • TTL 은 Time To Live 로, 데이타의 유효 시간을 정의한다.
  • FLAG는 카우치베이스 클라이언트에서 사용하는 메타데이타 이다

뷰 (view)

  • incremental view 컨셉을 가지고 있다.

  • 데이터가 버킷에 저장될 때마다 생성된 뷰에 같이 저장되는데, 이때 뷰코드(View Code - Map & Reduce) 라는 로직을 통해서 뷰에 저장된다.

  • 키-밸류 스토어 기능만 제공하는 일반 NoSQL에 비해서 filtering 뿐만 아니라, Indexing,grouping,ordering과 같은 다양한 기능을 이 뷰를 이용하여 사용할 수 있다.

맵&리듀스 함수

  • 맵함수는 두개의 인자를 전달받는다. "doc"는 버킷내의 저장된 개별 데이타로 각 데이터별로 id와 JSON 도큐먼트의 값을 갖는다.

  • "meta"는 그 데이터에 대한 메타 데이터 (flag, css 값등)을 리턴한다.

  • 맵함수에서 이렇게 받은 개별 데이터를 emit함수로 가공하여 리턴한다.

  • emit(인자1, 인자2)의 인자1은 뷰의 KEY값을 리턴하고, 인자2는 뷰의 Value값을 리턴한다.

  • 맵함수를 끝내면 ID(원래 Data ID),KEY,VALUE 형식의 데이터셋이나오고, 이를 "Index"라고 부른다.

function(doc, meta){
    emit(doc.role, doc.country);
}
  • 저장된 Index를 이용해서 Reduce함수를 실행할 수 있고, Reduce함수를 이용해서는 Grouping 기능을 사용할 수 있다.

노드별 메모리 레이아웃

  • 카우치베이스의 경우, memcached를 이용하는 만큼 서버의 메모리 공간 계산이 매우 중요하다.
  • 카우치 베이스는 버킷의 키를 모두 메모리에 로딩해놓고 있다. 최소 메모리 공간은 전체키의 합보다는 최소한 커야 한다.그리고 각 도큐먼트당 60바이트의 메타 정보 저장공간이 필요하다. (키크기 + 60 바이트)_전체레코드수 / 노드수 _ 3 (복제본수) 가 노드당 최소 메모리양이다.

카우치베이스 서버 클러스터는 1개 부터 1024개 까지 노드로 구성 될 수 있다.

  • 노드 하나가 하나의 카우치베이스 인스턴스.

  • 데이터는 클러스터내 노드들에서 파티션되고 분산된다.

카우치베이스 서버는 두개의 주요 컴포넌트가 있다. (클러스터 매니저, 데이터 매니저)

  • 클러스터 매니저

    • 클러스터내 노드 설정
    • 노드간 데이터 rebalancing
    • 페일오버 후 데이터 복제 핸들링
    • 통계자료 수집, 로깅
    • 클라이언트가 어디서 데이터를 찾아야 하는지 알려줄 수 있게 클러스터 맵(Cluster map)을 업데이트하며 관리한다.
    • 어드민 API를 노출하고 있고 웹 매니징 콘솔도 있다.
    • 클러스터 매니저는 distributed, concurrent 한 처리에 적합 하도록 Erlang/OTP로 만들어졌다.
  • 데이터 매니저

    • 데이터 저장소와 검색에대한 관리
    • 메모리 케시 레이어, Disk Persistence Mechanism, 쿼리 엔진을 포함하고 있다
    • 카우치베이스 클라이언트는 카우치베이스 매니저가 제공하는 클라이언트 맵을 사용한다. 이 맵을 통해 필요한 데이터를 가진 노드를 찾고 그 노드와 통신한다.

데이터 스토리지

  • 카우치베이스는 데이터를 버킷에 관리한다.

    • 리소스와 연관된 로지컬한 그룹이다.
  • 두가지의 버킷종류를 제공한다. (카우치베이스, 멤케시)

  • memcache 버킷

    • 1MB 크기의 메모리에 바이너리로 데이터를 저장한다.
    • 데이터를 디스크에 저장하지 않는다.
    • Redundancy 하려고 노드에 데이터를 복제 하지 않는다.
  • 카우치베이스 버킷

    • JSON Document, Primitive data 타입이나 Binary blob 형태로 20MB 까지 데이터를 저장 할 수 있다.
    • 데이터는 메모리에 캐시되고 디스크에 저장된다.
    • 데이터는 부하분산을 위해 클러스터 내에서 노드간에 동적으로 Rebalance된다.
    • 데이터가 하나에서 세게까지 복제되도록 설정 가능하다.
    • Document는 vBuckets ( 가상버킷 )으로 클러스터내에 세분화 된다.

메타데이터

  • 데이터가 저장될 때 Expiration, Check-and-Set, Flags와 같은 동작을 위한 부가정보를 생성

  • 내부적으로 사용할 정보도 저장 ( Data format: JSON, Base64, Revision, Id)

  • 2.1 이상에서는 Document당 메타데이터 크기는 56 Bytes를 사용

Client Libraries Thread Safety

  • .NET, Java SDK는 커넥션을 재사용 할 때 Thread safety를 보장할 수 있다.

  • C client library는 Thread safe 하지 않다. #libcouchbase

    • Python, PHP, Ruby SDK는 libcouchbase 에 의존하고 있고, 여러 쓰레드가 같은 클라이언트 커넥션 객체에 엑세스 하지 않음
    • Node.js 역시 libcouchbase 사용하고, 근본적으로 싱글 쓰레드라 이슈가 아님. 클러스터와 같이 멀티코어 모듈을 사용한다면 카우치베이스 커넥션 객체를 각 쓰레드마다 생성해야 함

카우치베이스 클라이언트 초기화

  • 클라이언트를 최초 생성할 때 클러스터 설정을 검색해야함.

    • 클러스터에 대한 정보를 받을 수 있는 HTTP API 있음
    • ServersList: 모든 서버와 서버들의 상태
    • vBucketsMap: vBuckets 리스트. 서버맵에서의 인덱스 정보등,,
  • Document를 저장하고 검색하려면 클라이언트는 1~1024사이의 번호를 받는다. ( Document가 저장된 vBcuket 번호 )

  • 클러스터 맵이 한번 생성된 이후로는 클라이언트는 HTTP Long Polling 같은걸로 node에 계속 query 하고 Noti 받음

Document 저장과 검색

  • Key Access와 View Querying는 포트를 달리 사용함

  • 키 기반 사용은

    • Memcached binary protocol 사용
    • 대부분 카우치베이스 클라이언트 라이브러리는 멤케시 클라이언트 라이브러리 기반