CouchDB - Introduction - Korean

2,366 views

Published on

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,366
On SlideShare
0
From Embeds
0
Number of Embeds
114
Actions
Shares
0
Downloads
57
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

CouchDB - Introduction - Korean

  1. 1. Ultra Durability NoSQL, CouchDB
  2. 2. 발표자 및 소속 회사 2 • 발표자, 정명훈 • 소속: Cloudant Korea에서 CouchDB 기반 DBaaS(PaaS) 컨설팅 • 경력: Java 개발, 미들웨어(Application Server), 가상화, 데이터베이스 및 CDC • 관심: 오픈소스와 클라우드 • 소속 회사, Cloudant • CouchDB 기반으로 클라우드 서비스로 제공(Database As A Service) • 유럽 입자물리 연구소(CERN)의 Higgs 입자 연구에 참여했던 MIT 과학자 세 명이 창립 (2008년 설립) • 약 30,000개 이상의 회사/사용자에게 서비스 제공
  3. 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. 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
  5. 5. CAP 이론 – CouchDB, A-P 특성 만족 5
  6. 6. CAP 이론 – CouchDB, A-P 특성 만족 6 No Lock  “Optimistic Lock” Multi Version Concurrency Control  Append-Only DB Eventual Consistency
  7. 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. 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. 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. 10. JSON Document Store 10 • JSON = JavaScript Objection Notation format • Boolean, Number, String, Array, Dictionary 등 다양한 데이터 타입 • 특별한 스키마 제약이 없고 다중 문서 등과 같은 자유로운 형식 (Schemaless) • 비정형 데이터: 텍스트+바이너리 혼합 데이터, 프로파일 데이터 등 • ID는 특별히 지정하지 않으면 자동으로 Unique하게 생성 저장 문서 별, 고유 ID와 Version 번호 자동 생성 됨 날짜 Type 배열 긴 문자열
  11. 11. 바이너리 데이터(attachment) 저장 11 • 바이너리 데이터(파일, 사진 등)를 Attachment로 저장 • BASE64 형식으로 주고 받고 실제로는 바이너리 형식 저장 저장
  12. 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. 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. 14. Secondary Index 14 • _id를 기준으로 한 Primary Unique Index를 보완 • _id 이외의 다른 필드 또는 필드들의 조합을 대상으로 함 • Key 값은 중복 허용 • 예: author, subject, [author, subject] • 생성 방법 • 일반 Design Document • Map/Reduce를 사용 (Map의 emit 함수) 데이터 Map 함수 인덱스 조회 결과
  15. 15. View – Secondary Index의 결과 15 • Map의 emit 함수 실행 결과가 실시간 처리 되어 View 형태로 저장 (원본 DB의 별도) • 원본 데이터 변경 시 전체 재 계산이 아닌 변경분만 재 계산 (Incremental Map/Reduce) • 클러스터(Cloudant, BigCouch)에서는 여러 노드에 분산되어 처리 및 저장 됨 • 동일 데이터(Database)에 대한 복수 View 생성 가능 • Reduce를 통해 데이터 통계(RDB의 sum & group by에 해당) 생성 (사용 여부는 선택적)
  16. 16. Map/Reduce 16 • 주로 JavaScript로 작성 되며, 다른 언어도 지원 가능 • 일반적인 Map/Reduce와 마찬가지로… • Map 함수에서 key, value 쌍을 생성 • Reduce 함수에서 데이터(key, value 쌍의 배열)에 대한 계산, 통계 작업 • 병렬 처리 – 클러스터에서는 여러 노드에서 분산 처리 및 결과 취합
  17. 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. 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. 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. 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. 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. 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. 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. 24. RESTful API 24 • 예제: • 문서 • http://docs.couchdb.org/en/latest/intro/api.html • http://docs.couchdb.org/en/latest/api/index.html
  25. 25. Web Friendly • CouchDB 자체가 HTTP 웹서버 • REST 기반 API를 통해 웹 상에서 쉽게 액세스 가능 • Java, JavaScript, Ruby, PHP 등에서 쉽게 호출 가능 • 기존 웹 인프라와 쉽게 연동 가능 (예: Cache, Proxy, Firewall) • 웹과 유사한 Optimistic Locking 모델
  26. 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. 27. Futon (GUI Tool) 27 • Futon • 기본 내장된 DB 관리툴 • CouchApp으로 만들어짐 • Fauxton • Cloudant가 기여한 새로운 Admin Tool • CouchDB 1.5부터 포함 (사용하려면 별도 작업 필요) • Node.js 기반 • Design Document 작성 편리 Futon Fauxton
  28. 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. 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. 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. 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. 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. 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. 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. 35. Append Only DB 35 • Update도 새로운 Version 추가(Append)로 처리 • 오래된 Revision은 주기적으로 정리(Compaction) • 보안 등의 목적으로 Revision 강제 삭제 가능(Purging)
  36. 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. 37. Eventual Consistency • 단일 노드에서 Consistency 보장은 상대적으로 용이 • 분산된 클러스터 환경에서 훨씬 복잡한 문제 (CAP Theorem) • Incremental Replication을 통해 Consistency 해결 • Client는 각자 노드에서 데이터 변경 • 이후 Replication을 통해 동기화 • 다른 노드의 가용성 고민 불필요 • 전체 시스템 Availability 향상 • Conflict 발생 가능성 • 충돌이 발생한 데이터를 모두 보관 • 애플리케이션 로직을 통해 충돌 해결
  38. 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. 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. 다 못한 얘기… 40 • 설치 방법 • Cloudant(CouchDB Cloud 서비스)를 통한 테스트 • Security • HTTP Basic Auth • Cookie Auth • OAuth • Clustering • BigCouch
  41. 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. 42. More Deep-Dive Session 42
  43. 43. CouchDB Clustering 43 • BigCouch + CouchDB  CouchDB 2.0
  44. 44. 44
  45. 45. 45
  46. 46. 46
  47. 47. 47
  48. 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. 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. 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. 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. 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. 53. 53
  54. 54. 54
  55. 55. 55
  56. 56. 56
  57. 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. 58. 58
  59. 59. 59
  60. 60. 60
  61. 61. 61
  62. 62. More Deep Dive Contents 62 • 추가 세미나 or 교육… • CouchDB 관련 웹사이트 • http://docs.couchdb.org/en/latest/ (매뉴얼) • http://cloudantkug.wordpress.com/ (한국 Cloudant 블로그)

×