본문 바로가기

DB/CouchDB

[1.Introduction]Technical Overview

1. Introduction

CouchDB는 웹을 완전히 포용하는 데이터베이스입니다. JSON 문서로 데이터를 저장하십시오. HTTP를 통해 웹 브라우저로 문서에 액세스하십시오. JavaScript로 문서를 쿼리, 결합 및 변환합니다. CouchDB는 최신 웹 및 모바일 응용 프로그램과 잘 작동합니다. CouchDB의 증분 복제를 사용하여 데이터를 효율적으로 배포 할 수 있습니다. CouchDB는 자동 충돌 탐지로 마스터 - 마스터 설정을 지원합니다.


CouchDB에는 웹 개발을 쉽게 수행 할 수있는 문서 변환 및 실시간 변경 알림과 같은 기능이 포함되어 있습니다. 심지어 CouchDB에서 바로 사용할 수있는 웹 관리 콘솔을 사용하기가 쉽습니다! 우리는 분산 된 스케일링에 대해 많은 관심을 가지고 있습니다. CouchDB는 가용성이 높고 파티션을 허용하지만 궁극적으로 일관성이 있습니다. 우리는 귀하의 데이터에 대해 많은 관심을 갖고 있습니다. CouchDB에는 데이터의 안전을 최우선 적으로 다루는 내결함성 스토리지 엔진이 있습니다.


이 섹션에서는 CouchDB의 모든 기본 비트에 대해 배우고, 생성 된 개념과 기술을 확인하고 CouchDB 사용법을 설명하는 간단한 자습서를 살펴 봅니다.

1.1. Technical Overview

1.1.1. Document Storage

CouchDB 서버는 문서를 저장하는 명명 된 데이터베이스를 호스팅합니다. 각 문서는 데이터베이스에서 고유 한 이름을 가지며 CouchDB는 데이터베이스 문서를 읽고 업데이트 (추가, 편집, 삭제) 할 수있는 RESTful HTTP API를 제공합니다.


문서는 CouchDB의 기본 데이터 단위이며 여러 필드와 첨부로 구성됩니다. 문서에는 데이터베이스 시스템에서 유지 관리하는 메타 데이터도 포함됩니다. 문서 필드는 고유 한 이름을 가지며 다양한 유형 (텍스트, 숫자, 부울, 목록 등)의 값을 포함하며 텍스트 크기 또는 요소 수에 대한 제한이 없습니다.


CouchDB 문서 업데이트 모델은 잠금이없고 낙관적이다. 문서를로드하고 변경 사항을 적용한 다음 다시 데이터베이스에 저장하는 클라이언트 응용 프로그램에서 문서 편집 작업을 수행합니다. 동일한 문서를 편집하는 다른 클라이언트가 먼저 변경 사항을 저장하면 클라이언트는 저장시 편집 충돌 오류를 얻습니다. 업데이트 충돌을 해결하기 위해 최신 문서 버전을 열어 편집 내용을 다시 적용하고 업데이트를 다시 시도 할 수 있습니다.


문서 업데이트 (추가, 편집, 삭제)는 모두 성공했는지 아니면 완전히 실패했는지 완전히 또는 완전히 실패했습니다. 데이터베이스에는 부분적으로 저장되거나 편집 된 문서가 절대로 포함되어 있지 않습니다.

1.1.2. ACID Properties

CouchDB 파일 레이아웃 및 커밋 시스템에는 모든 ACID (Atomic Consistent Isolated Durable) 속성이 있습니다. 디스크상의 CouchDB는 커밋 된 데이터 나 관련 구조를 덮어 쓰지 않으며, 데이터베이스 파일이 항상 일관된 상태에 있음을 보장합니다. 이는 CouchDB 서버가 시스템 종료 프로세스를 거치지 않는 "충돌 전용"설계이며, 단순히 종료됩니다.

문서 갱신 (추가, 편집, 삭제)은 동시에 작성된 2 진 BLOB를 제외하고는 직렬화됩니다. 데이터베이스 리더는 절대 잠기지 않으며 작가 또는 다른 독자를 기다릴 필요가 없습니다. 같은 수의 문서에서도 동시 업데이트로 인해 잠겨 있거나 중단되지 않고 모든 클라이언트가 문서를 읽을 수 있습니다. CouchDB 읽기 조작은 MVCC (Multi-Version Concurrency Control) 모델을 사용하며 각 클라이언트는 읽기 조작의 처음부터 끝까지 데이터베이스의 일관된 스 냄샷을 볼 수 있습니다.

문서는 이름 (DocID)과 시퀀스 ID로 B- 트리에서 인덱싱됩니다. 데이터베이스 인스턴스를 갱신 할 때마다 새 순차 번호가 생성됩니다. 순서 ID는 나중에 데이터베이스의 변경 사항을 점차적으로 찾는 데 사용됩니다. 이러한 B- 트리 색인은 문서가 저장되거나 삭제 될 때 동시에 업데이트됩니다. 인덱스 갱신은 항상 파일의 끝에서 발생합니다 (추가 전용 갱신).

문서는 대부분의 데이터베이스 시스템에서 수많은 테이블과 행으로 분할되지 않고 저장을 위해 이미 편리하게 패키지화 된 데이터의 장점을 가지고 있습니다. 문서가 디스크에 커밋 될 때 문서 필드와 메타 데이터는 순차적으로 하나씩 차례대로 버퍼에 저장됩니다. 나중에 뷰를 효율적으로 작성하는 데 도움이됩니다.


CouchDB 문서가 업데이트되면 모든 데이터와 관련 인덱스가 디스크로 플러시되고 트랜잭션 커밋은 항상 데이터베이스를 완전히 일관된 상태로 유지합니다. 커밋은 두 단계로 이루어집니다.


1. 모든 문서 데이터 및 관련 인덱스 업데이트가 동 기적으로 디스크로 플러시됩니다.

2. 업데이트 된 데이터베이스 헤더는 두 개의 연속 한 동일한 청크로 작성되어 파일의 처음 4KB를 구성한 다음 디스크에 동기식으로 플러시됩니다.


1 단계에서 OS 충돌 또는 정전이 발생하면 부분적으로 삭제 된 업데이트는 다시 시작할 때 간단히 잊어 버리게됩니다. 두 번째 (헤더 커밋) 동안 이러한 충돌이 발생하면 이전에 동일한 커밋 된 데이터의 일관성을 유지하면서 이전의 동일한 헤더의 남아있는 복사본이 유지됩니다. 헤더 영역을 제외하고는 충돌 또는 정전 후 일관성 검사 또는 수정이 필요하지 않습니다.


1.1.3. Compaction

불필요한 공간은 때때로 압축에 의해 복구됩니다. 일정에 따라 또는 데이터베이스 파일이 일정량의 낭비 된 공간을 초과하면 압축 프로세스는 모든 활성 데이터를 새 파일로 복제 한 다음 이전 파일을 삭제합니다. 데이터베이스는 전체 시간 동안 완전히 온라인 상태를 유지하며 모든 업데이트 및 읽기가 성공적으로 완료 될 수 있습니다. 이전 데이터베이스 파일은 모든 데이터가 복사되고 모든 사용자가 새 파일로 전환 된 경우에만 삭제됩니다.


1.1.4. Views

ACID 속성은 저장 및 업데이트 만 처리하지만 데이터를 재미 있고 유용한 방식으로 표시 할 수있는 기능이 필요합니다. 데이터를 신중하게 테이블로 분해해야하는 SQL 데이터베이스와 달리 CouchDB의 데이터는 반 구조화 된 문서에 저장됩니다. CouchDB 문서는 융통성이 있으며 각각 고유 한 암시 적 구조가 있으므로 테이블 스키마와 포함 된 데이터를 양방향으로 복제하는 데있어 가장 어려 운 문제와 함정을 완화 할 수 있습니다.

그러나 멋진 파일 서버 역할을하는 것 외에도 데이터 저장 및 공유를위한 간단한 문서 모델은 실제 응용 프로그램을 빌드하기에는 너무 간단합니다. 단순히 원하는 내용만으로는 충분하지 않습니다. 우리는 여러 가지 방법으로 데이터를 슬라이스 앤 다이스 (dice)하고보고 싶어합니다. 필요한 것은 테이블로 분해되지 않은 데이터를 필터링, 구성 및보고하는 방법입니다.

1.1.4.1. View Model

구조화되지 않은 데이터와 반 구조화 된 데이터를 다시 추가하는 문제를 해결하기 위해 CouchDB는 뷰 모델을 통합합니다. 뷰는 데이터베이스의 문서를 집계하고보고하는 방법으로 데이터베이스 문서를 집계, 결합 및보고하기 위해 필요에 따라 작성됩니다. 뷰는 동적으로 작성되고 기본 문서에 영향을 미치지 않으므로 동일한 데이터에 대해 원하는대로 여러 가지 뷰 표현을 가질 수 있습니다.

뷰 정의는 엄격하게 가상이며 현재 데이터베이스 인스턴스의 문서 만 표시하므로 표시되는 데이터와 분리되고 복제와 호환됩니다. CouchDB 뷰는 특수 설계 문서 내에 정의되며 일반 문서와 같은 데이터베이스 인스턴스간에 복제 할 수 있으므로 CouchDB에서 데이터가 복제 될뿐만 아니라 전체 애플리케이션 설계도 복제됩니다.

1.1.4.2. JavaScript View Functions

뷰는 맵 축소 시스템에서 맵 파트로 작동하는 JavaScript 함수를 사용하여 정의됩니다. 뷰 함수는 CouchDB 문서를 인수로 취한 다음 뷰를 통해 사용할 수있는 데이터를 결정하기 위해 수행해야하는 계산을 수행합니다 (있는 경우). 단일 문서를 기반으로 뷰에 여러 행을 추가하거나 행을 전혀 추가 할 수 없습니다.

1.1.4.3. View Indexes

뷰는 데이터베이스의 실제 문서 내용을 동적으로 표시하므로 CouchDB는 유용한 데이터 뷰를 쉽게 만들 수 있습니다. 그러나 수십만 또는 수백만 개의 문서가 포함 된 데이터베이스 뷰를 생성하는 것은 시간과 자원을 소비하는 것이므로 시스템이 매번 처음부터해야하는 것은 아닙니다.

뷰 쿼리는 쿼리를 빠르게 유지하기 위해 뷰의 인덱스를 유지 관리하고 데이터베이스의 변경 내용을 반영하도록 증분 업데이트합니다. CouchDB의 핵심 설계는 효율적으로 점진적으로 뷰와 인덱스를 작성해야하는 필요성에 크게 최적화되어 있습니다.

뷰와 그 기능은 특별한 "디자인"문서에 정의되며, 디자인 문서에는 고유 한 이름의 뷰 기능이 여러 개 포함될 수 있습니다. 사용자가 뷰를 열고 해당 인덱스가 자동으로 업데이트되면 동일한 디자인 문서의 모든 뷰가 단일 그룹으로 인덱싱됩니다.
보기 빌더는 데이터베이스 순서 ID를 사용하여보기 그룹이 데이터베이스에 완전히 최신 상태인지 판별합니다. 그렇지 않으면 뷰 엔진은 마지막 새로 고침 이후 변경된 모든 데이터베이스 문서 (압축 된 순차적 순서로)를 검사합니다. 문서는 디스크 파일에서 발생하는 순서대로 읽혀 지므로 디스크 헤드 검색의 빈도와 비용이 줄어 듭니다.

뷰는 새로 고쳐지는 동안 동시에 읽고 쿼리 할 수 ​​있습니다. 클라이언트가 큰보기의 내용을 천천히 스트리밍하는 경우 첫 번째 클라이언트를 차단하지 않고 다른 클라이언트에 대해 동일한보기를 동시에 열고 새로 고칠 수 있습니다. 인덱스가 동시에 다른 클라이언트에 대해 새로 고쳐지는 동안 독자가 ​​문제를 일으키지 않고 뷰를 읽고 쿼리 할 수있는 동시 적 클라이언트 판독기의 수는 마찬가지입니다.

문서가 '지도'및 '축소'기능을 통해보기 엔진에 의해 처리되면 이전 행 값이있는 경우보기 색인에서 삭제됩니다. 문서가 뷰 함수에 의해 선택되면 함수 결과가 새로운 행으로 뷰에 삽입됩니다.

뷰 인덱스 변경 사항이 디스크에 기록되면 업데이트는 항상 파일 끝 부분에 추가되어 디스크 커밋 중 디스크 헤드 검색 시간을 줄이고 충돌 및 전원 장애로 인해 인덱스가 손상되지 않도록 보장합니다. 뷰 인덱스를 업데이트하는 동안 충돌이 발생하면 불완전한 인덱스 업데이트는 이전에 커밋 된 상태에서 손실되고 다시 증분됩니다.

1.1.5. Security and Validation

문서를 읽고 업데이트 할 수있는 사용자를 보호하기 위해 CouchDB는 사용자 보안 모델을 구현하기 위해 확장 할 수있는 간단한 판독기 액세스 및 업데이트 유효성 검증 모델을 제공합니다.

1.1.5.1. Administrator Access

CouchDB 데이터베이스 인스턴스에는 관리자 계정이 있습니다. 관리자 계정은 다른 관리자 계정을 만들고 디자인 문서를 업데이트 할 수 있습니다. 디자인 문서는 뷰 정의 및 기타 특수 수식뿐만 아니라 일반 필드 및 binary large objects 을 포함하는 특수한 문서입니다.

1.1.5.2. Update Validation

문서는 디스크에 기록되므로 보안 및 데이터 유효성 검사를 위해 JavaScript 함수에 의해 동적으로 유효성을 검사 할 수 있습니다. 문서가 모든 수식 유효성 검사 조건을 통과하면 업데이트를 계속할 수 있습니다. 유효성 검증이 실패하면 갱신이 중단되고 사용자 클라이언트는 오류 응답을 얻습니다.

사용자의 자격 증명과 업데이트 된 문서는 모두 유효성 검사 수식의 입력으로 제공되며 사용자가 문서를 업데이트 할 수있는 권한을 확인하여 사용자 지정 보안 모델을 구현하는 데 사용할 수 있습니다.

기본 "작성자 전용"업데이트 문서 모델은 구현하기 쉽지만 사용자가 기존 문서의 "작성자"필드에 나열되어 있는지 확인하기 위해 문서 업데이트의 유효성을 검사합니다. 권한 설정을 위해 별도의 사용자 계정 프로필을 확인하는 등 더 많은 동적 모델도 가능합니다.

업데이트 유효성 검사는 실제 사용 및 복제 된 업데이트 모두에 적용되어 공유 분산 시스템에서 보안 및 데이터 유효성 검사를 보장합니다.

1.1.6. Distributed Updates and Replication

CouchDB는 피어 기반 분산 데이터베이스 시스템입니다. 이를 통해 사용자와 서버는 연결이 끊긴 상태에서 동일한 공유 데이터에 액세스하고 업데이트 할 수 있습니다. 이러한 변경 사항은 나중에 양방향으로 복제 될 수 있습니다.

CouchDB 문서 저장,보기 및 보안 모델은 진정한 양방향 복제를 효율적이고 안정적으로 만들기 위해 함께 작동하도록 설계되었습니다. 문서 및 디자인 모두를 복제 할 수 있으므로 응용 프로그램 디자인, 논리 및 데이터를 포함한 전체 데이터베이스 응용 프로그램을 오프라인 사용을 위해 랩톱에 복제하거나 연결이 느리거나 신뢰할 수없는 연결을 통해 데이터 공유가 어려워지는 원격 사무실의 서버에 복제 할 수 있습니다.

복제 프로세스는 점진적입니다. 데이터베이스 수준에서 복제는 마지막 복제 이후 업데이트 된 문서 만 검사합니다. 어느 단계에서든 복제가 실패하면 네트워크 문제 또는 충돌로 인해 다음 복제가 마지막 검사 점에서 다시 시작됩니다.

부분 복제본을 생성하고 유지 관리 할 수 있습니다. 복제는 JavaScript 함수로 필터링 할 수 있으므로 특정 문서 또는 특정 기준을 충족하는 문서 만 복제됩니다. 이를 통해 사용자는 응용 프로그램 및 해당 데이터의 서브 세트와 정상적인 상호 작용을 유지하면서 자체 공유를 위해 대형 공유 데이터베이스 응용 프로그램의 하위 집합을 오프라인으로 가져올 수 있습니다.


1.1.6.1. Conflicts

충돌 감지 및 관리는 모든 분산 편집 시스템의 핵심 문제입니다. CouchDB 스토리지 시스템은 편집 충돌을 예외적 인 것이 아닌 일반적인 상태로 취급합니다. 충돌 처리 모델은 단일 문서 의미를 유지하면서 분산 충돌 해결을 허용하면서 간단하고 "비파괴 적"입니다.

CouchDB를 사용하면 데이터베이스에 충돌하는 모든 문서가 동시에 존재할 수 있습니다. 각 데이터베이스 인스턴스는 어떤 문서가 "승자"이고 충돌인지 결정적으로 결정합니다. "잃어버린"충돌은 여전히 액세스 가능하며 데이터베이스 압축 중에 삭제되거나 제거 될 때까지 데이터베이스에 남아있는 반면, 성공한 문서 만보기에 나타날 수 있습니다. 충돌 문서는 여전히 일반 문서이기 때문에 일반 문서처럼 복제하고 동일한 보안 및 유효성 검사 규칙이 적용됩니다.

분산 편집 충돌이 발생하면 모든 데이터베이스 복제본에서 동일한 승격 된 개정판을 볼 수 있으며 각 복제본은 충돌을 해결할 수있는 기회를 갖습니다. 데이터 또는 충돌의 특성에 따라 자동 에이전트에서 수동으로 또는 충돌을 해결할 수 있습니다. 이 시스템은 단일 문서 데이터베이스 의미 체계를 유지하면서 분산 된 충돌 해결을 가능하게합니다.

여러 연결이 끊긴 사용자 또는 에이전트가 동일한 충돌을 해결하려고 시도하더라도 충돌 관리는 계속 작동합니다. 해결 된 충돌로 인해 더 많은 충돌이 발생하면 시스템은 동일한 방식으로 각 시스템에서 동일한 승자를 결정하고 단일 문서의 의미를 유지합니다.

1.1.6.2. Applications

기본 복제 모델 만 사용하면 기존의 단일 서버 데이터베이스 응용 프로그램을 거의 추가 작업없이 배포 할 수 있습니다. CouchDB 복제는 기본 데이터베이스 응용 프로그램에 즉시 유용하도록 설계되었으며보다 정교하고 완벽한 기능을 위해 확장 가능합니다.


데이터베이스 작업이 거의 없으므로 세부적인 보안 및 전체 수정 내역을 갖춘 분산 문서 관리 응용 프로그램을 구축 할 수 있습니다. 문서에 대한 업데이트를 구현하여 증분 필드 및 BLOB 복제를 활용할 수 있습니다. 복제 된 업데이트는 실제 편집 차이 ( "diff")만큼 효율적이고 점진적입니다.


CouchDB 복제 모델은 다른 분산 업데이트 모델을 위해 수정할 수 있습니다. 저장소 엔진이 다중 문서 업데이트 트랜잭션을 허용하도록 향상되면 업스트림 서버로 복제 할 때 Subversion과 같은 "전체 또는 일부"커밋을 수행 할 수 있으므로 단일 문서 충돌 또는 유효성 검사 오류로 인해 전체 업데이트가 발생합니다 실패. Subversion과 마찬가지로 충돌을 로컬에서 강제로 수행 한 다음 업스트림 서버로 병합하고 다시 복제하여 "끌어 오기"복제를 수행하여 충돌을 해결할 수 있습니다.


1.1.7. Implementation

CouchDB는 기능적 동시 프로그래밍 언어 및 개발 플랫폼 인 Erlang OTP 플랫폼을 기반으로합니다. 얼랭 (Erlang)은 신뢰성과 가용성을 극도로 강조하면서 실시간 통신 애플리케이션 용으로 개발되었습니다.

구문과 의미 모두에서 Erlang은 C 나 Java와 같은 기존 프로그래밍 언어와 매우 다릅니다. Erlang은 경량의 "프로세스"와 동시성을위한 메시지 전달을 사용하며 공유 상태 스레딩이 없으며 모든 데이터가 변경 불가능합니다. Erlang의 강건하고 동시적인 특성은 데이터베이스 서버에 이상적입니다.

CouchDB는 개념 모델과 실제 Erlang 구현에서 잠금없는 동시성을 위해 설계되었습니다. 병목 현상을 줄이고 자물쇠를 피면 부하가 많은 상황에서 전체 시스템이 예상대로 작동 할 수 있습니다. CouchDB는 변경 사항을 복제하고, 문서를 열고 업데이트하며, 잠금을 필요로하지 않고 인덱스가 다른 클라이언트에 대해 동시에 새로 고쳐지는 뷰를 쿼리하는 많은 클라이언트를 수용 할 수 있습니다.

높은 가용성과 더 많은 동시 사용자를 위해 CouchDB는 "공유 없음"클러스터링을 위해 설계되었습니다. "비공유"클러스터에서 각 시스템은 독립적이며 클러스터 메이트로 데이터를 복제하므로 가동 중지 시간없이 개별 서버를 장애가 발생할 수 있습니다. 또한 재시작시 일관성 검사 및 수정 작업이 필요하지 않기 때문에 데이터 센터의 정전 등으로 인해 전체 클러스터에 장애가 발생하면 다시 시작한 후에 전체 CouchDB 분산 시스템을 즉시 사용할 수있게됩니다.

CouchDB는 처음부터 분산 문서 데이터베이스 시스템의 일관된 비전으로 구축되었습니다. 동일한 레거시 모델 및 데이터베이스 위에 분산 기능을 배치하려는 성가신 시도와는 달리 신중한 기하 설계, 엔지니어링 및 통합의 결과입니다. Erlang 플랫폼의 문서,보기, 보안 및 복제 모델, 특수 목적 쿼리 언어, 효율적이고 강력한 디스크 레이아웃 및 동시성 및 신뢰성있는 특성은 모두 신중하게 통합되어 안정적이고 효율적인 시스템을 제공합니다.