Ultra Durability NoSQL, CouchDB
발표자 및 소속 회사
2
• 발표자, 정명훈
• 소속: Cloudant Korea에서 CouchDB 기반 DBaaS(PaaS) 컨설팅
• 경력: Java 개발, 미들웨어(Application Server), 가상화, 데이터베이스 및 CDC
• 관심: 오픈소스와 클라우드
• 소속 회사, Cloudant
• CouchDB 기반으로 클라우드 서비스로 제공(Database As A Service)
• 유럽 입자물리 연구소(CERN)의 Higgs 입자 연구에 참여했던 MIT 과학자 세 명이
창립 (2008년 설립)
• 약 30,000개 이상의 회사/사용자에게 서비스 제공
CouchDB의 역사
3
• 2005년 Damien Katz(IBM, Lotus 개발자)에 의해 시작
Internet에 적합한 Database 목표
 Cluster Of Unreliable Commodity Hardware의 약자
• 2006년 Erlang, JSON, JavaScript 기반으로 전환
• 2008년 Apache Incubator 프로젝트
• 2010년 첫 stable version 출시
• 2013년 Cloudant에 의해
BigCouch(Clustering) 프로젝트와 통합
• BigCouch 통합 버전 출시 예정…
 CouchDB 2.0
Damien Katz
CouchDB의 특징
4
• JSON Document Storage/Store
• ACID Compliant Data Store  “Ultra Durable”
• Map/Reduce View and Secondary Indexes
• Distributed Architecture and Replication
• REST/HTTP API  “Web Friendly”
• Strong Mobile Support
• Multi Version Concurrency Control (MVCC)
• Eventual Consistency between Distributed Nodes
• Erlang OTP
CAP 이론 – CouchDB, A-P 특성 만족
5
CAP 이론 – CouchDB, A-P 특성 만족
6
No Lock  “Optimistic Lock”
Multi Version Concurrency
Control  Append-Only DB
Eventual Consistency
CouchDB 기본 상식
7
• B-Tree에 데이터와 Index 저장
• CouchDB의 용어
• Database  RDB의 Table
• Document  RDB Table의 Record/Row
• CouchDB는 Stand-alone, BigCouch/Cloudant는 Clustering
• Lock이 없고 복수 Client의 동시 액세스 허용 (Optimistic Lock)
• 하나의 Document를 복수의 Version으로 관리
CouchDB의 특징
8
• JSON Document Storage/Store
• ACID Compliant Data Store  “Ultra Durable”
• Map/Reduce View and Secondary Indexes
• Distributed Architecture and Replication
• REST/HTTP API  “Web Friendly”
• Strong Mobile Support
• Multi Version Concurrency Control
• Eventual Consistency
• Erlang OTP
CouchDB의 특징
9
• JSON Document Storage/Store
• ACID Compliant Data Store  “Ultra Durable”
• Map/Reduce View and Secondary Indexes
• Distributed Architecture and Replication
• REST/HTTP API  “Web Friendly”
• Strong Mobile Support
• Multi Version Concurrency Control
• Eventual Consistency
• Erlang OTP
JSON based Ultra Durable Data Store
JSON Document Store
10
• JSON = JavaScript Objection Notation format
• Boolean, Number, String, Array, Dictionary 등 다양한 데이터 타입
• 특별한 스키마 제약이 없고 다중 문서 등과 같은 자유로운 형식 (Schemaless)
• 비정형 데이터: 텍스트+바이너리 혼합 데이터, 프로파일 데이터 등
• ID는 특별히 지정하지 않으면 자동으로 Unique하게 생성
저장
문서 별, 고유 ID와 Version 번호 자동 생성 됨
날짜 Type
배열
긴 문자열
바이너리 데이터(attachment) 저장
11
• 바이너리 데이터(파일, 사진 등)를 Attachment로 저장
• BASE64 형식으로 주고 받고 실제로는 바이너리 형식 저장
저장
ACID Compliant Data Store
12
• ACID(Atomic Consistent Isolated Durable) 특성 준수
• “Crash-Only” 디자인: Commit된 데이터를 절대로 덮어 쓰지 않고
Consistent한 데이터 보장  특별한 Shutdown 과정 불필요
 Ultra Durable
• DB Read 작업에서 전혀 Lock을 잡지 않고, 다른 Client의 Read/Write
작업(동일 문서라도)을 대기할 필요 없음  대규모 서비스에 적합
• CouchDB의 Read 작업은 MVCC(Multi-Version Concurrency Control)
모델 기반으로 Consistent 한 데이터 snapshot 사용
CouchDB의 특징
13
• JSON Document Storage/Store
• ACID Compliant Data Store  “Ultra Durable”
• Map/Reduce View and Secondary Indexes
• Distributed Architecture and Replication
• REST/HTTP API  “Web Friendly”
• Strong Mobile Support
• Multi Version Concurrency Control
• Eventual Consistency
• Erlang OTP
Secondary Index
14
• _id를 기준으로 한 Primary Unique Index를 보완
• _id 이외의 다른 필드 또는 필드들의 조합을 대상으로 함
• Key 값은 중복 허용
• 예: author, subject, [author, subject]
• 생성 방법
• 일반 Design Document
• Map/Reduce를 사용 (Map의 emit 함수)
데이터
Map 함수
인덱스
조회 결과
View – Secondary Index의 결과
15
• Map의 emit 함수 실행 결과가 실시간 처리 되어 View 형태로 저장
(원본 DB의 별도)
• 원본 데이터 변경 시 전체 재 계산이 아닌 변경분만 재 계산 (Incremental
Map/Reduce)
• 클러스터(Cloudant, BigCouch)에서는 여러 노드에 분산되어 처리 및
저장 됨
• 동일 데이터(Database)에 대한 복수 View 생성 가능
• Reduce를 통해 데이터 통계(RDB의 sum & group by에 해당) 생성
(사용 여부는 선택적)
Map/Reduce
16
• 주로 JavaScript로 작성 되며, 다른 언어도 지원 가능
• 일반적인 Map/Reduce와 마찬가지로…
• Map 함수에서 key, value 쌍을 생성
• Reduce 함수에서 데이터(key, value 쌍의 배열)에 대한 계산, 통계 작업
• 병렬 처리 – 클러스터에서는 여러 노드에서 분산 처리 및 결과 취합
Map/Reduce
17
• CouchDB의 Map/Reduce는…
• Real time: DB의 데이터에 변경이 생기면 바로 실시간 재 계산 (View)
• Incremental: 데이터 변경 시, 전체를 재 계산 하지 않고 필요한 부분만 재 계산
하는 방법 (http://eagain.net/articles/incremental-mapreduce/)
• Chained Map/Reduce
• 복수의 Map/Reduce 작업을 이어서 하는 것 (Real time, Incremental 특성 유지)
• Map/Reduce 결과를 2차 DB로 동기화하여 거기서 다시 Map/Reduce를 실행
• Cloudant에서 제공
• http://examples.cloudant.com/sales/_design/sales/index.html
CouchDB의 특징
18
• JSON Document Storage/Store
• ACID Compliant Data Store  “Ultra Durable”
• Map/Reduce View and Secondary Indexes
• Distributed Architecture and Replication
• REST/HTTP API  “Web Friendly”
• Strong Mobile Support
• Multi Version Concurrency Control
• Eventual Consistency
• Erlang OTP
Strong Focus on Replication
19
• Couch 계열 DB의 특징
• CouchDB 호환 DB(Cloudant, TouchDB, PouchDB) 간 상호 동기화 지원
• 모든 Document(레코드)에 Revision ID(MVCC)가 있어 변경 사항을 쉽게 추출
 변경 데이터만 증분(incremental) 복제/동기화
 Fault Tolerant (서버/DB Crash 시에도, 데이터 동기화 보장)
• 단방향, 양방향, N:N Multi-Master, Server/Cloud to Mobile 동기화 가능
• 일회성 복제 및 동기화, 지속적인(Continuous), 필터(원하는 패턴) 동기화
• Use Cases
• 글로벌 거점 간 데이터 동기화(Multi-Master 복제)
• 모바일, 사물인터넷(Internet Of Things)
데이터 수집
• 각종 기기(Device) 또는 단말(Edge)에서 수집된 정보를
메인 DB로 복제
Replication 동작 과정
20
REV-10 REV-09 REV-08 REV-07 REV-05 REV-04…
REV-11
REV-14
REV-16
• 초기 Replication 설정
• 동작 중인 Replication 모니터링
BARFOO
REV-01
REV-02
REV-03
Pull 방식
Replication 소스 및
타겟 지정
Replication 상태
정보
Push 방식
Pull 방식
• 동기화를 담당할 Job을 소스, 타겟
원하는 위치에서 운영 가능 (소스-
Push or 타겟-Pull)
• DB 자체의 고유 기능(Document의
Revision ID 관리)을 바탕으로
정확하고 안정적인 동기화 가능
• 별도의 동기화 서버나 프로세스
불필요 (DB 자체의 기본 기능)
• 상호 양방향 동기화 지원
Changes Event를 통한 메시징
21
• Replication 및 Revision History(MVCC)에 기반한 변경 이벤트 수신
• Changes Event를 수신하고 있는 각 Client 별로 전달할 메시지(DB Insert/Update/Delete) 관리
• Client가 다운되어 있는 경우에도 재 기동 시, 해당 시간 동안 발생한 메시지 수신 가능 (무시도 가능)
• CouchDB Replication 프로토콜 기반
CouchDB
Client Client
DB Changes History
Changes
Event 수신
Client
Down Client
Changes
Event 수신
REV-10 REV-09 REV-08 REV-07 REV-05 REV-04… REV-01REV-02REV-03
REV-03REV-02REV-01 REV-04 REV-05 REV-06 REV-05 REV-04 REV-02REV-03 …
REV-01REV-02REV-03
REV-4
REV-6 REV-7
Client 별로 다음에 수신할
Changes 번호 관리
다음 전송할
데이터
Replication 활용 예제: Quilter
22
• Replication과 Changes Feed를 활용한 로컬 – 원격 클라우드/서버 파일
동기화 프로젝트
• 관련 문서: http://cloudantkug.wordpress.com/2014/02/19/quilter-
cloudant%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-
%EB%A1%9C%EC%BB%AC%ED%81%B4%EB%9D%BC%EC%9A%B0%EB
%93%9C-%ED%8C%8C%EC%9D%BC-
%EB%8F%99%EA%B8%B0%ED%99%94/
• 소스 Repository: https://github.com/garbados/quilter
• Node.js 기반
• 서버에 올린 사진 파일을 CouchApp을 통해 Publishing 가능
• https://github.com/garbados/egg_chair
CouchDB의 특징
23
• JSON Document Storage/Store
• ACID Compliant Data Store  “Ultra Durable”
• Map/Reduce View and Secondary Indexes
• Distributed Architecture and Replication
• REST/HTTP API  “Web Friendly”
• Strong Mobile Support
• Multi Version Concurrency Control
• Eventual Consistency
• Erlang OTP
RESTful API
24
• 예제:
• 문서
• http://docs.couchdb.org/en/latest/intro/api.html
• http://docs.couchdb.org/en/latest/api/index.html
Web Friendly
• CouchDB 자체가 HTTP 웹서버
• REST 기반 API를 통해 웹 상에서 쉽게 액세스 가능
• Java, JavaScript, Ruby, PHP 등에서 쉽게 호출 가능
• 기존 웹 인프라와 쉽게 연동 가능 (예: Cache, Proxy, Firewall)
• 웹과 유사한 Optimistic Locking 모델
CouchApp
26
• CouchDB의 자체 HTTP 웹서버 기능을 활용한 Application Deployment
방법
• Design Document를 통해 애플리케이션 제어
• 웹 리소스(HTML, 이미지, CSS 등)들을 Attachment 형태로 저장
• JavaScript에서 REST를 통해 DB 데이터 접근 가능
• Virtual Hosting, URL Redirecting 기능 지원
• Application과 Data가 한 번에 관리, 배포, 복제(Replication 통한
App/Data 동시 복제 가능)
• 예제
• DB에 저장된 주소록과 CouchApp으로 제작된 주소록 Viewer
Futon (GUI Tool)
27
• Futon
• 기본 내장된 DB 관리툴
• CouchApp으로 만들어짐
• Fauxton
• Cloudant가 기여한 새로운 Admin Tool
• CouchDB 1.5부터 포함
(사용하려면 별도 작업 필요)
• Node.js 기반
• Design Document 작성 편리
Futon
Fauxton
cURL
28
• Command Line 기반 REST API 테스트 도구
• 쉽고 간단하게 사용할 수 있어 소규모, 즉석 테스트에 사용
• Unix, Linux, Window 버전
• 예제
• Create
• curl -X POST http://localhost:5984/db -H "Content-Type: application/json" -d ‘{"name": "data"}’
• Read
• curl -X GET http://localhost:5984/db/key
• Update
• curl -X PUT http://localhost:5984/db/key -H "Content-Type: application/json" -d ‘{"_rev": "1-
XXXX", "name": "data"}’
• Delete
• curl -X DELETE http://localhost:5984/db/key?rev=1-XXXX
GUI REST Client
29
• Firefox나 Chrome 브라우저의 Plugin
• REST Client
• Java 기반의 REST 테스트 전용 도구
• https://github.com/wiztools/rest-client
• SoapUI
• SOAP/XML 성능 테스트 도구
• REST 지원
• http://www.soapui.org/
• JSON 처리 관련 개선 사항
http://blog.naver.com/javalove93/130185743179
REST Client
SoapUI
Ektorp Java API
30
• 가장 많이 사용되고 기능이 풍부한 API
• Repository: https://github.com/helun/Ektorp
• JPA와 유사한 기능을 가지면서도 단순, 유연한 CouchDB API
• Jackson을 이용한 JSON Document 핸들링
• Spring, Mobile(Android) 지원
• 예제 코드
DB 접속
Secondary Index(MR) 호출
CouchDB의 특징
31
• JSON Document Storage/Store
• ACID Compliant Data Store  “Ultra Durable”
• Map/Reduce View and Secondary Indexes
• Distributed Architecture and Replication
• REST/HTTP API  “Web Friendly”
• Strong Mobile Support
• Multi Version Concurrency Control
• Eventual Consistency
• Erlang OTP
Mobile Support
32
• HTTP REST & JSON 기반
• Mobile에서 직접 통신 용이
• Cookie 기반 세션, OAuth 등을 통해 Mobile 애플리케이션 지원
• Replication을 통한 Disconnected Device 지원
• Mobile DB 작업 내용을 서버 DB와 동기화 가능
• TouchDB, PouchDB(JavaScript), Cloudant Sync for
Android/iOS 등 각종 모바일 전용 DB (CouchDB와 호환)
CouchDB의 특징
33
• JSON Document Storage/Store
• ACID Compliant Data Store  “Ultra Durable”
• Map/Reduce View and Secondary Indexes
• Distributed Architecture and Replication
• REST/HTTP API  “Web Friendly”
• Strong Mobile Support
• Multi Version Concurrency Control (MVCC)
• Eventual Consistency
• Erlang OTP
Multi Version Concurrency Control(MVCC)
34
• RDBMS는 lock을 통해 read/write
consistency(일관성) 보장
• CouchDB는 lock 대신, 문서의
이력(Revision History)을 모두 보관
• 문서 Update 시 Version이 바뀌었다면
(변경이 있어났음을 의미) Conflict 에러
발생(Optimistic Lock)
• 예: Ver 2를 기준으로 Document Update를
시도했는데, 현재 최신 버전이 Ver 3인 경우
UpdateConflict
• MVCC를 통해 Replication 처리가
매우 용이
• Lock이 필요하면 애플리케이션
로직으로 처리
Append Only DB
35
• Update도 새로운 Version 추가(Append)로 처리
• 오래된 Revision은 주기적으로 정리(Compaction)
• 보안 등의 목적으로
Revision 강제
삭제 가능(Purging)
CouchDB의 특징
36
• JSON Document Storage/Store
• ACID Compliant Data Store  “Ultra Durable”
• Map/Reduce View and Secondary Indexes
• Distributed Architecture and Replication
• REST/HTTP API  “Web Friendly”
• Strong Mobile Support
• Multi Version Concurrency Control
• Eventual Consistency between Distributed Nodes
• Erlang OTP
Eventual Consistency
• 단일 노드에서 Consistency 보장은 상대적으로 용이
• 분산된 클러스터 환경에서 훨씬 복잡한 문제 (CAP Theorem)
• Incremental Replication을 통해 Consistency 해결
• Client는 각자 노드에서 데이터 변경
• 이후 Replication을 통해 동기화
• 다른 노드의 가용성 고민 불필요
• 전체 시스템 Availability 향상
• Conflict 발생 가능성
• 충돌이 발생한 데이터를 모두 보관
• 애플리케이션 로직을 통해 충돌 해결
CouchDB의 특징
38
• JSON Document Storage/Store
• ACID Compliant Data Store  “Ultra Durable”
• Map/Reduce View and Secondary Indexes
• Distributed Architecture and Replication
• REST/HTTP API  “Web Friendly”
• Strong Mobile Support
• Multi Version Concurrency Control
• Eventual Consistency
• Erlang OTP
Erlang OTP(Open Telecom Platform)
39
• Ericsson 에서 만든 Erlang 언어와 해당 언어 기반 Application Server
• CouchDB는 Erlang 언어 및 Erlang OTP 기반으로 작성됨
• Erlang 인터프리터, 컴파일러
• 각 노드 간 통신 프로토콜 및 브로커 (Java의 RMI와 유사)
• Tuxedo, CICS 등과 매우 유사
• Actor Model Concurrency
• 멀티코어, 분산환경에 적합한 모델
• 모든 프로세스나 컴포넌트가 Actor가
되어 서로 Message를 통해 통신
Erlang OTP에 등록되어 동작 중인 프로세스 목록
다 못한 얘기…
40
• 설치 방법
• Cloudant(CouchDB Cloud 서비스)를 통한 테스트
• Security
• HTTP Basic Auth
• Cookie Auth
• OAuth
• Clustering
• BigCouch
Cloudant를 이용한 CouchDB 테스트
41
• Cloudant DB 시작 가이드
• 5GB까지 무료 서비스
• http://www.slideshare.net/JerryJeong2/getting-started-with-cloudant-
dbaaskorean
• Cloudant 웹 UI 사용 방법
• http://cloudantkug.wordpress.com/2014/02/19/cloudant-new-webui/
More Deep-Dive Session
42
CouchDB Clustering
43
• BigCouch + CouchDB  CouchDB 2.0
44
45
46
47
48
Sharding
PUT /db2/docid92
DB Computes:
• key = hash(“docid92”)
• get_shards(key) ==> shard
• get_nodes(shard) ==>
[N1,N3,N4]
• Nodes.foreach: store(doc)
49
Sharding (“Q”)
• Example with Q = 24
• 6 Nodes
• Each node handles 4 shards
• General Rule:
• Few large DBs use large Q
• Many small DBs use small Q
• Q is degree of parallelism
50
Node Computes:
• key = hash(doc._id)
• get_shards(key) ==> shard
• get_nodes(shard) ==> [N1,N3,N4]
• Nodes.foreach: store(doc)
Replication (“N”)
• Store N copies of data
• Configurable per DB
51
Write Quorum (“W”)
• When does DB say “written”?
• When enough nodes have “written”
• What is “enough”?
• Try to store all replicas (N copies)
• When ‘W’ nodes reply
• After fsync’ing to disk
PUT /db2/docid92
52
Read Quorum (“R”)
• When does DB say “here it is”?
• When enough nodes say “here it
is”
• What is “enough”?
• Try to read it from N Nodes
• When “R” nodes reply and agree
GET /db2/docid92
53
54
55
56
57
Indexing - Views, Search, Geo
• What about indexes?
• Built locally for each shard
• Shards runs in parallel - utilize all CPUs
• Merge-sort responses at query time
58
59
60
61
More Deep Dive Contents
62
• 추가 세미나 or 교육…
• CouchDB 관련 웹사이트
• http://docs.couchdb.org/en/latest/ (매뉴얼)
• http://cloudantkug.wordpress.com/ (한국 Cloudant 블로그)

CouchDB - Introduction - Korean

  • 1.
  • 2.
    발표자 및 소속회사 2 • 발표자, 정명훈 • 소속: Cloudant Korea에서 CouchDB 기반 DBaaS(PaaS) 컨설팅 • 경력: Java 개발, 미들웨어(Application Server), 가상화, 데이터베이스 및 CDC • 관심: 오픈소스와 클라우드 • 소속 회사, Cloudant • CouchDB 기반으로 클라우드 서비스로 제공(Database As A Service) • 유럽 입자물리 연구소(CERN)의 Higgs 입자 연구에 참여했던 MIT 과학자 세 명이 창립 (2008년 설립) • 약 30,000개 이상의 회사/사용자에게 서비스 제공
  • 3.
    CouchDB의 역사 3 • 2005년Damien Katz(IBM, Lotus 개발자)에 의해 시작 Internet에 적합한 Database 목표  Cluster Of Unreliable Commodity Hardware의 약자 • 2006년 Erlang, JSON, JavaScript 기반으로 전환 • 2008년 Apache Incubator 프로젝트 • 2010년 첫 stable version 출시 • 2013년 Cloudant에 의해 BigCouch(Clustering) 프로젝트와 통합 • BigCouch 통합 버전 출시 예정…  CouchDB 2.0 Damien Katz
  • 4.
    CouchDB의 특징 4 • JSONDocument Storage/Store • ACID Compliant Data Store  “Ultra Durable” • Map/Reduce View and Secondary Indexes • Distributed Architecture and Replication • REST/HTTP API  “Web Friendly” • Strong Mobile Support • Multi Version Concurrency Control (MVCC) • Eventual Consistency between Distributed Nodes • Erlang OTP
  • 5.
    CAP 이론 –CouchDB, A-P 특성 만족 5
  • 6.
    CAP 이론 –CouchDB, A-P 특성 만족 6 No Lock  “Optimistic Lock” Multi Version Concurrency Control  Append-Only DB Eventual Consistency
  • 7.
    CouchDB 기본 상식 7 •B-Tree에 데이터와 Index 저장 • CouchDB의 용어 • Database  RDB의 Table • Document  RDB Table의 Record/Row • CouchDB는 Stand-alone, BigCouch/Cloudant는 Clustering • Lock이 없고 복수 Client의 동시 액세스 허용 (Optimistic Lock) • 하나의 Document를 복수의 Version으로 관리
  • 8.
    CouchDB의 특징 8 • JSONDocument Storage/Store • ACID Compliant Data Store  “Ultra Durable” • Map/Reduce View and Secondary Indexes • Distributed Architecture and Replication • REST/HTTP API  “Web Friendly” • Strong Mobile Support • Multi Version Concurrency Control • Eventual Consistency • Erlang OTP
  • 9.
    CouchDB의 특징 9 • JSONDocument Storage/Store • ACID Compliant Data Store  “Ultra Durable” • Map/Reduce View and Secondary Indexes • Distributed Architecture and Replication • REST/HTTP API  “Web Friendly” • Strong Mobile Support • Multi Version Concurrency Control • Eventual Consistency • Erlang OTP JSON based Ultra Durable Data Store
  • 10.
    JSON Document Store 10 •JSON = JavaScript Objection Notation format • Boolean, Number, String, Array, Dictionary 등 다양한 데이터 타입 • 특별한 스키마 제약이 없고 다중 문서 등과 같은 자유로운 형식 (Schemaless) • 비정형 데이터: 텍스트+바이너리 혼합 데이터, 프로파일 데이터 등 • ID는 특별히 지정하지 않으면 자동으로 Unique하게 생성 저장 문서 별, 고유 ID와 Version 번호 자동 생성 됨 날짜 Type 배열 긴 문자열
  • 11.
    바이너리 데이터(attachment) 저장 11 •바이너리 데이터(파일, 사진 등)를 Attachment로 저장 • BASE64 형식으로 주고 받고 실제로는 바이너리 형식 저장 저장
  • 12.
    ACID Compliant DataStore 12 • ACID(Atomic Consistent Isolated Durable) 특성 준수 • “Crash-Only” 디자인: Commit된 데이터를 절대로 덮어 쓰지 않고 Consistent한 데이터 보장  특별한 Shutdown 과정 불필요  Ultra Durable • DB Read 작업에서 전혀 Lock을 잡지 않고, 다른 Client의 Read/Write 작업(동일 문서라도)을 대기할 필요 없음  대규모 서비스에 적합 • CouchDB의 Read 작업은 MVCC(Multi-Version Concurrency Control) 모델 기반으로 Consistent 한 데이터 snapshot 사용
  • 13.
    CouchDB의 특징 13 • JSONDocument Storage/Store • ACID Compliant Data Store  “Ultra Durable” • Map/Reduce View and Secondary Indexes • Distributed Architecture and Replication • REST/HTTP API  “Web Friendly” • Strong Mobile Support • Multi Version Concurrency Control • Eventual Consistency • Erlang OTP
  • 14.
    Secondary Index 14 • _id를기준으로 한 Primary Unique Index를 보완 • _id 이외의 다른 필드 또는 필드들의 조합을 대상으로 함 • Key 값은 중복 허용 • 예: author, subject, [author, subject] • 생성 방법 • 일반 Design Document • Map/Reduce를 사용 (Map의 emit 함수) 데이터 Map 함수 인덱스 조회 결과
  • 15.
    View – SecondaryIndex의 결과 15 • Map의 emit 함수 실행 결과가 실시간 처리 되어 View 형태로 저장 (원본 DB의 별도) • 원본 데이터 변경 시 전체 재 계산이 아닌 변경분만 재 계산 (Incremental Map/Reduce) • 클러스터(Cloudant, BigCouch)에서는 여러 노드에 분산되어 처리 및 저장 됨 • 동일 데이터(Database)에 대한 복수 View 생성 가능 • Reduce를 통해 데이터 통계(RDB의 sum & group by에 해당) 생성 (사용 여부는 선택적)
  • 16.
    Map/Reduce 16 • 주로 JavaScript로작성 되며, 다른 언어도 지원 가능 • 일반적인 Map/Reduce와 마찬가지로… • Map 함수에서 key, value 쌍을 생성 • Reduce 함수에서 데이터(key, value 쌍의 배열)에 대한 계산, 통계 작업 • 병렬 처리 – 클러스터에서는 여러 노드에서 분산 처리 및 결과 취합
  • 17.
    Map/Reduce 17 • CouchDB의 Map/Reduce는… •Real time: DB의 데이터에 변경이 생기면 바로 실시간 재 계산 (View) • Incremental: 데이터 변경 시, 전체를 재 계산 하지 않고 필요한 부분만 재 계산 하는 방법 (http://eagain.net/articles/incremental-mapreduce/) • Chained Map/Reduce • 복수의 Map/Reduce 작업을 이어서 하는 것 (Real time, Incremental 특성 유지) • Map/Reduce 결과를 2차 DB로 동기화하여 거기서 다시 Map/Reduce를 실행 • Cloudant에서 제공 • http://examples.cloudant.com/sales/_design/sales/index.html
  • 18.
    CouchDB의 특징 18 • JSONDocument Storage/Store • ACID Compliant Data Store  “Ultra Durable” • Map/Reduce View and Secondary Indexes • Distributed Architecture and Replication • REST/HTTP API  “Web Friendly” • Strong Mobile Support • Multi Version Concurrency Control • Eventual Consistency • Erlang OTP
  • 19.
    Strong Focus onReplication 19 • Couch 계열 DB의 특징 • CouchDB 호환 DB(Cloudant, TouchDB, PouchDB) 간 상호 동기화 지원 • 모든 Document(레코드)에 Revision ID(MVCC)가 있어 변경 사항을 쉽게 추출  변경 데이터만 증분(incremental) 복제/동기화  Fault Tolerant (서버/DB Crash 시에도, 데이터 동기화 보장) • 단방향, 양방향, N:N Multi-Master, Server/Cloud to Mobile 동기화 가능 • 일회성 복제 및 동기화, 지속적인(Continuous), 필터(원하는 패턴) 동기화 • Use Cases • 글로벌 거점 간 데이터 동기화(Multi-Master 복제) • 모바일, 사물인터넷(Internet Of Things) 데이터 수집 • 각종 기기(Device) 또는 단말(Edge)에서 수집된 정보를 메인 DB로 복제
  • 20.
    Replication 동작 과정 20 REV-10REV-09 REV-08 REV-07 REV-05 REV-04… REV-11 REV-14 REV-16 • 초기 Replication 설정 • 동작 중인 Replication 모니터링 BARFOO REV-01 REV-02 REV-03 Pull 방식 Replication 소스 및 타겟 지정 Replication 상태 정보 Push 방식 Pull 방식 • 동기화를 담당할 Job을 소스, 타겟 원하는 위치에서 운영 가능 (소스- Push or 타겟-Pull) • DB 자체의 고유 기능(Document의 Revision ID 관리)을 바탕으로 정확하고 안정적인 동기화 가능 • 별도의 동기화 서버나 프로세스 불필요 (DB 자체의 기본 기능) • 상호 양방향 동기화 지원
  • 21.
    Changes Event를 통한메시징 21 • Replication 및 Revision History(MVCC)에 기반한 변경 이벤트 수신 • Changes Event를 수신하고 있는 각 Client 별로 전달할 메시지(DB Insert/Update/Delete) 관리 • Client가 다운되어 있는 경우에도 재 기동 시, 해당 시간 동안 발생한 메시지 수신 가능 (무시도 가능) • CouchDB Replication 프로토콜 기반 CouchDB Client Client DB Changes History Changes Event 수신 Client Down Client Changes Event 수신 REV-10 REV-09 REV-08 REV-07 REV-05 REV-04… REV-01REV-02REV-03 REV-03REV-02REV-01 REV-04 REV-05 REV-06 REV-05 REV-04 REV-02REV-03 … REV-01REV-02REV-03 REV-4 REV-6 REV-7 Client 별로 다음에 수신할 Changes 번호 관리 다음 전송할 데이터
  • 22.
    Replication 활용 예제:Quilter 22 • Replication과 Changes Feed를 활용한 로컬 – 원격 클라우드/서버 파일 동기화 프로젝트 • 관련 문서: http://cloudantkug.wordpress.com/2014/02/19/quilter- cloudant%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C- %EB%A1%9C%EC%BB%AC%ED%81%B4%EB%9D%BC%EC%9A%B0%EB %93%9C-%ED%8C%8C%EC%9D%BC- %EB%8F%99%EA%B8%B0%ED%99%94/ • 소스 Repository: https://github.com/garbados/quilter • Node.js 기반 • 서버에 올린 사진 파일을 CouchApp을 통해 Publishing 가능 • https://github.com/garbados/egg_chair
  • 23.
    CouchDB의 특징 23 • JSONDocument Storage/Store • ACID Compliant Data Store  “Ultra Durable” • Map/Reduce View and Secondary Indexes • Distributed Architecture and Replication • REST/HTTP API  “Web Friendly” • Strong Mobile Support • Multi Version Concurrency Control • Eventual Consistency • Erlang OTP
  • 24.
    RESTful API 24 • 예제: •문서 • http://docs.couchdb.org/en/latest/intro/api.html • http://docs.couchdb.org/en/latest/api/index.html
  • 25.
    Web Friendly • CouchDB자체가 HTTP 웹서버 • REST 기반 API를 통해 웹 상에서 쉽게 액세스 가능 • Java, JavaScript, Ruby, PHP 등에서 쉽게 호출 가능 • 기존 웹 인프라와 쉽게 연동 가능 (예: Cache, Proxy, Firewall) • 웹과 유사한 Optimistic Locking 모델
  • 26.
    CouchApp 26 • CouchDB의 자체HTTP 웹서버 기능을 활용한 Application Deployment 방법 • Design Document를 통해 애플리케이션 제어 • 웹 리소스(HTML, 이미지, CSS 등)들을 Attachment 형태로 저장 • JavaScript에서 REST를 통해 DB 데이터 접근 가능 • Virtual Hosting, URL Redirecting 기능 지원 • Application과 Data가 한 번에 관리, 배포, 복제(Replication 통한 App/Data 동시 복제 가능) • 예제 • DB에 저장된 주소록과 CouchApp으로 제작된 주소록 Viewer
  • 27.
    Futon (GUI Tool) 27 •Futon • 기본 내장된 DB 관리툴 • CouchApp으로 만들어짐 • Fauxton • Cloudant가 기여한 새로운 Admin Tool • CouchDB 1.5부터 포함 (사용하려면 별도 작업 필요) • Node.js 기반 • Design Document 작성 편리 Futon Fauxton
  • 28.
    cURL 28 • Command Line기반 REST API 테스트 도구 • 쉽고 간단하게 사용할 수 있어 소규모, 즉석 테스트에 사용 • Unix, Linux, Window 버전 • 예제 • Create • curl -X POST http://localhost:5984/db -H "Content-Type: application/json" -d ‘{"name": "data"}’ • Read • curl -X GET http://localhost:5984/db/key • Update • curl -X PUT http://localhost:5984/db/key -H "Content-Type: application/json" -d ‘{"_rev": "1- XXXX", "name": "data"}’ • Delete • curl -X DELETE http://localhost:5984/db/key?rev=1-XXXX
  • 29.
    GUI REST Client 29 •Firefox나 Chrome 브라우저의 Plugin • REST Client • Java 기반의 REST 테스트 전용 도구 • https://github.com/wiztools/rest-client • SoapUI • SOAP/XML 성능 테스트 도구 • REST 지원 • http://www.soapui.org/ • JSON 처리 관련 개선 사항 http://blog.naver.com/javalove93/130185743179 REST Client SoapUI
  • 30.
    Ektorp Java API 30 •가장 많이 사용되고 기능이 풍부한 API • Repository: https://github.com/helun/Ektorp • JPA와 유사한 기능을 가지면서도 단순, 유연한 CouchDB API • Jackson을 이용한 JSON Document 핸들링 • Spring, Mobile(Android) 지원 • 예제 코드 DB 접속 Secondary Index(MR) 호출
  • 31.
    CouchDB의 특징 31 • JSONDocument Storage/Store • ACID Compliant Data Store  “Ultra Durable” • Map/Reduce View and Secondary Indexes • Distributed Architecture and Replication • REST/HTTP API  “Web Friendly” • Strong Mobile Support • Multi Version Concurrency Control • Eventual Consistency • Erlang OTP
  • 32.
    Mobile Support 32 • HTTPREST & JSON 기반 • Mobile에서 직접 통신 용이 • Cookie 기반 세션, OAuth 등을 통해 Mobile 애플리케이션 지원 • Replication을 통한 Disconnected Device 지원 • Mobile DB 작업 내용을 서버 DB와 동기화 가능 • TouchDB, PouchDB(JavaScript), Cloudant Sync for Android/iOS 등 각종 모바일 전용 DB (CouchDB와 호환)
  • 33.
    CouchDB의 특징 33 • JSONDocument Storage/Store • ACID Compliant Data Store  “Ultra Durable” • Map/Reduce View and Secondary Indexes • Distributed Architecture and Replication • REST/HTTP API  “Web Friendly” • Strong Mobile Support • Multi Version Concurrency Control (MVCC) • Eventual Consistency • Erlang OTP
  • 34.
    Multi Version ConcurrencyControl(MVCC) 34 • RDBMS는 lock을 통해 read/write consistency(일관성) 보장 • CouchDB는 lock 대신, 문서의 이력(Revision History)을 모두 보관 • 문서 Update 시 Version이 바뀌었다면 (변경이 있어났음을 의미) Conflict 에러 발생(Optimistic Lock) • 예: Ver 2를 기준으로 Document Update를 시도했는데, 현재 최신 버전이 Ver 3인 경우 UpdateConflict • MVCC를 통해 Replication 처리가 매우 용이 • Lock이 필요하면 애플리케이션 로직으로 처리
  • 35.
    Append Only DB 35 •Update도 새로운 Version 추가(Append)로 처리 • 오래된 Revision은 주기적으로 정리(Compaction) • 보안 등의 목적으로 Revision 강제 삭제 가능(Purging)
  • 36.
    CouchDB의 특징 36 • JSONDocument Storage/Store • ACID Compliant Data Store  “Ultra Durable” • Map/Reduce View and Secondary Indexes • Distributed Architecture and Replication • REST/HTTP API  “Web Friendly” • Strong Mobile Support • Multi Version Concurrency Control • Eventual Consistency between Distributed Nodes • Erlang OTP
  • 37.
    Eventual Consistency • 단일노드에서 Consistency 보장은 상대적으로 용이 • 분산된 클러스터 환경에서 훨씬 복잡한 문제 (CAP Theorem) • Incremental Replication을 통해 Consistency 해결 • Client는 각자 노드에서 데이터 변경 • 이후 Replication을 통해 동기화 • 다른 노드의 가용성 고민 불필요 • 전체 시스템 Availability 향상 • Conflict 발생 가능성 • 충돌이 발생한 데이터를 모두 보관 • 애플리케이션 로직을 통해 충돌 해결
  • 38.
    CouchDB의 특징 38 • JSONDocument Storage/Store • ACID Compliant Data Store  “Ultra Durable” • Map/Reduce View and Secondary Indexes • Distributed Architecture and Replication • REST/HTTP API  “Web Friendly” • Strong Mobile Support • Multi Version Concurrency Control • Eventual Consistency • Erlang OTP
  • 39.
    Erlang OTP(Open TelecomPlatform) 39 • Ericsson 에서 만든 Erlang 언어와 해당 언어 기반 Application Server • CouchDB는 Erlang 언어 및 Erlang OTP 기반으로 작성됨 • Erlang 인터프리터, 컴파일러 • 각 노드 간 통신 프로토콜 및 브로커 (Java의 RMI와 유사) • Tuxedo, CICS 등과 매우 유사 • Actor Model Concurrency • 멀티코어, 분산환경에 적합한 모델 • 모든 프로세스나 컴포넌트가 Actor가 되어 서로 Message를 통해 통신 Erlang OTP에 등록되어 동작 중인 프로세스 목록
  • 40.
    다 못한 얘기… 40 •설치 방법 • Cloudant(CouchDB Cloud 서비스)를 통한 테스트 • Security • HTTP Basic Auth • Cookie Auth • OAuth • Clustering • BigCouch
  • 41.
    Cloudant를 이용한 CouchDB테스트 41 • Cloudant DB 시작 가이드 • 5GB까지 무료 서비스 • http://www.slideshare.net/JerryJeong2/getting-started-with-cloudant- dbaaskorean • Cloudant 웹 UI 사용 방법 • http://cloudantkug.wordpress.com/2014/02/19/cloudant-new-webui/
  • 42.
  • 43.
    CouchDB Clustering 43 • BigCouch+ CouchDB  CouchDB 2.0
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
    48 Sharding PUT /db2/docid92 DB Computes: •key = hash(“docid92”) • get_shards(key) ==> shard • get_nodes(shard) ==> [N1,N3,N4] • Nodes.foreach: store(doc)
  • 49.
    49 Sharding (“Q”) • Examplewith Q = 24 • 6 Nodes • Each node handles 4 shards • General Rule: • Few large DBs use large Q • Many small DBs use small Q • Q is degree of parallelism
  • 50.
    50 Node Computes: • key= hash(doc._id) • get_shards(key) ==> shard • get_nodes(shard) ==> [N1,N3,N4] • Nodes.foreach: store(doc) Replication (“N”) • Store N copies of data • Configurable per DB
  • 51.
    51 Write Quorum (“W”) •When does DB say “written”? • When enough nodes have “written” • What is “enough”? • Try to store all replicas (N copies) • When ‘W’ nodes reply • After fsync’ing to disk PUT /db2/docid92
  • 52.
    52 Read Quorum (“R”) •When does DB say “here it is”? • When enough nodes say “here it is” • What is “enough”? • Try to read it from N Nodes • When “R” nodes reply and agree GET /db2/docid92
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
    57 Indexing - Views,Search, Geo • What about indexes? • Built locally for each shard • Shards runs in parallel - utilize all CPUs • Merge-sort responses at query time
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
    More Deep DiveContents 62 • 추가 세미나 or 교육… • CouchDB 관련 웹사이트 • http://docs.couchdb.org/en/latest/ (매뉴얼) • http://cloudantkug.wordpress.com/ (한국 Cloudant 블로그)