⌘ 카우치베이스 서버 클러스터는 1개 부터 1024개 까지 노드로 구성 될 수 있다.
⌘ 노드 하나가 하나의 카우치베이스 인스턴스.
⌘ 데이터는 클러스터내 노드들에서 파티션되고 분산된다.
⌘ 카우치베이스 서버는 두개의 주요 컴포넌트가 있다.
- 클러스터 매니저
* 클러스터내 노드 설정
* 노드간 데이터 리발란싱
* 페일오버 후 데이터 복제 핸들링
* 통계자료 수집
* 로깅
* 클라이언트가 어디서 데이터를 찾아야 하는지 알려줄 수 있게 클러스터 맵(Cluster map)을 업데이트하며 관리한다.
* 어드민 API를 노출하고 있고 웹 매니징 콘솔도 있다.
* 클러스터 매니저는 distributed, concurrent 한 처리에 적합 하도록 Erlang/OTP로 만들어졌다.
- 데이터 매니저
* 데이터 저장소와 검색에대한 관리
* 메모리 케시 레이어, Disk Persistence Mechanism, 쿼리 엔진을 포함하고 있다
* 카우치베이스 클라이언트는 카우치베이스 매니저가 제공하는 클라이언트 맵을 사용한다. 이 맵을 통해 필요한 데이터를 가진 노드를 찾고 그 노드와 통신한다.
⌘ 데이터 스토리지
- 카우치베이스는 데이터를 버킷에 관리한다.
* 리소스와 연관된 로지컬한 그룹이다.
* 오라클의 스키마 정도로 생각하면 된다.
- 두가지의 버킷종류를 제공한다.
* 카우치베이스
* 멤케시
- 멤케시 버킷은
* 1MB 크기의 메모리에 바이너리로 데이터를 저장한다.
* 데이터를 디스크에 저장하지 않는다.
* Redundancy 하려고 노드에 데이터를 복제 하지 않는다.
- 카우치베이스 버킷은
* JSON Document, Primitive data 타입이나 Binary blob 형태로 20MB 까지 데이터를 저장 할 수 있다.
* 데이터는 메모리에 캐시되고 디스크에 저장된다.
* 데이터는 부하분산을 위해 클러스터 내에서 노드간에 동적으로 Rebalance된다.
* 데이터가 하나에서 세게까지 복제되도록 설정 가능하다.
* Document는 vBuckets ( 가상버킷 )으로 클러스터내에 세분화 된다.
⌘ 당삼 Object-relational impedance mismatch 문제 있음
⌘ Auto Incremented ID 없으나 카운터에 쓸 수 있는 Atomic 숫자 증감 메커니즘은 있음. 키의 일부로 쓰임
product_salecountervalue, salecoutervalue가 카운터
⌘ 메타데이터
- 데이터가 저장될 때 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 사용
* 대부분 카우치베이스 클라이언트 라이브러리는 멤케시 클라이언트 라이브러리 기반 [spymemcached](https://github.com/couchbase/spymemcached)
- View 기반 사용은 ( 범위검색이라든지,, )
* 로직이 반드시 클러스터의 서버들중 하나에서 실행 될 수 있어야 함
* 노드를 클러스터에서 라운드로빈으로 선택하고 노드와 HTTP 통신해서 Operation함
* 선택된 노드는 필요로 하는 모든 Item을 다른 노드에서 검색하고 Aggregation 하고 클라이언트에 응답줌
* non-reduced, reduced, spatial view 3가지 view operation을 제공함
댓글
댓글 쓰기