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
• 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
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
• 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
9. 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
10. JSON Document Store
10
• JSON = JavaScript Objection Notation format
• Boolean, Number, String, Array, Dictionary 등 다양한 데이터 타입
• 특별한 스키마 제약이 없고 다중 문서 등과 같은 자유로운 형식 (Schemaless)
• 비정형 데이터: 텍스트+바이너리 혼합 데이터, 프로파일 데이터 등
• ID는 특별히 지정하지 않으면 자동으로 Unique하게 생성
저장
문서 별, 고유 ID와 Version 번호 자동 생성 됨
날짜 Type
배열
긴 문자열
12. 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 사용
13. 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
14. Secondary Index
14
• _id를 기준으로 한 Primary Unique Index를 보완
• _id 이외의 다른 필드 또는 필드들의 조합을 대상으로 함
• Key 값은 중복 허용
• 예: author, subject, [author, subject]
• 생성 방법
• 일반 Design Document
• Map/Reduce를 사용 (Map의 emit 함수)
데이터
Map 함수
인덱스
조회 결과
15. View – Secondary Index의 결과
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
• 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
19. 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로 복제
20. 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 자체의 기본 기능)
• 상호 양방향 동기화 지원
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
• 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
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
• 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
32. 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와 호환)
33. 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
34. 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이 필요하면 애플리케이션
로직으로 처리
35. Append Only DB
35
• Update도 새로운 Version 추가(Append)로 처리
• 오래된 Revision은 주기적으로 정리(Compaction)
• 보안 등의 목적으로
Revision 강제
삭제 가능(Purging)
36. 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
37. Eventual Consistency
• 단일 노드에서 Consistency 보장은 상대적으로 용이
• 분산된 클러스터 환경에서 훨씬 복잡한 문제 (CAP Theorem)
• Incremental Replication을 통해 Consistency 해결
• Client는 각자 노드에서 데이터 변경
• 이후 Replication을 통해 동기화
• 다른 노드의 가용성 고민 불필요
• 전체 시스템 Availability 향상
• Conflict 발생 가능성
• 충돌이 발생한 데이터를 모두 보관
• 애플리케이션 로직을 통해 충돌 해결
38. 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
39. 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. 다 못한 얘기…
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/
49. 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. 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
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
62. More Deep Dive Contents
62
• 추가 세미나 or 교육…
• CouchDB 관련 웹사이트
• http://docs.couchdb.org/en/latest/ (매뉴얼)
• http://cloudantkug.wordpress.com/ (한국 Cloudant 블로그)