카우치베이스 서버

카우치베이스 뷰와 더 나은 대안 [1부/2부]

소개

이 블로그는 카우치베이스 서버 및 뷰의 기본 사항에 익숙한 사용자를 위한 것입니다. 초보 사용자는 여기에서 시작 를 통해 카우치베이스 서버에 대한 기본적인 이해를 한 다음 여기에서 계속 를 클릭하여 뷰에 대해 알아보세요.

거의 9년 전에 저장된 json 데이터에 대한 보조 키 액세스를 지원하기 위해 Couchbase Server에 뷰가 추가되었습니다. 이 기능은 우리에게 많은 도움이 되었지만 이제 더 나은 대안이 있습니다. 글로벌 보조 인덱싱 그리고 N1QL 쿼리, 전체 텍스트 검색 그리고 분석. 이 블로그에서는 뷰에 대한 기본적인 이해와 뷰가 지원하는 일반적인 사용 사례 및 한계에 대해 알아보고자 합니다. 나중에 두 번째 블로그에서 앞서 언급한 더 나은 대안에 대해 살펴보겠습니다.

카우치베이스 뷰란 무엇인가요?

먼저, Couchbase 뷰가 무엇이며 어떻게 작동하는지 알아보겠습니다. 뷰는 기본적으로 데이터 집합에서 선택된 부분의 구체화된 버전입니다. 뷰의 정의는 키-값 데이터에서 작동하는 '맵' 함수로 구성된 디자인 문서에 저장되며, 이 함수는 데이터를 추가로 요약하는 (선택 사항) 후속 '축소' 단계에 공급됩니다. 두 출력은 모두 클러스터의 각 데이터 노드에 있는 '보기' 디렉터리 아래의 디스크에 구체화됩니다.

보기는 어떻게 작동하나요?

카우치베이스 뷰는 결국 소스 데이터와 일치합니다. 각 뷰는 기본적으로 5초마다 또는 5000번의 변경 중 먼저 도달하는 간격으로 자주 업데이트됩니다. 이는 데이터 파티션에 로컬이며 미리 정의된 일정 간격으로 일련의 규칙을 사용하여 새로 고쳐지는 Oracle의 구체화된 뷰와 유사합니다.

보기 복제본 및 압축은 매우 쉽게 구성할 수 있습니다. 복제본은 버킷 단위로 쉽게 활성화할 수 있습니다. 압축은 버킷에 대한 압축 정책과 함께 똑같이 쉽게 구성할 수 있습니다.

뷰는 맵 및 축소 함수를 사용하여 결과를 미리 계산하고 저장하므로 적시 계산의 필요성을 최소화합니다. 뷰 함수는 JavaScript로 작성됩니다. 따라서 쿼리 시 긴 대기 시간을 겪지 않고도 뷰 정의에서 상당히 복잡한 로직을 표현할 수 있습니다. 맵 함수는 원본 데이터 집합과 뷰가 보유한 하위 집합 간의 논리적 매핑을 생성하므로 모든 뷰에서 가장 중요한 부분입니다. 각 맵 함수에는 저장된 각 항목과 해당 메타데이터에 대한 액세스 권한을 부여하는 'doc'와 'meta' 인수가 제공됩니다.

지도 함수의 기본 형태는 다음과 같습니다:

이 함수는 키와 doc.attribute의 값이 포함된 행을 반환합니다.

카우치베이스는 _count(맵 함수가 출력하는 행의 단순 개수 제공), _sum(숫자인 경우 맵 함수가 출력하는 값의 합계 제공, 그룹 수준 합산 지원), _stats(숫자인 경우 맵 함수가 출력하는 값의 개수, 최소, 최대, 합계 및 합계 제곱 제공)와 같은 몇 가지 내장된 축소 함수를 제공합니다.

사용자 지정 축소 함수 작성은 물론 기본 제공 축소 함수 재정의도 지원됩니다.

뷰 쿼리

보기 쿼리는 단일 키, 키 집합 또는 시작과 끝이 지정된 키 범위를 기반으로 할 수 있습니다. 보기 쿼리는 클러스터의 나머지 데이터 노드로 쿼리를 분산하고 결과를 수집하여 결과를 대조하고 쿼리에 응답하는 모든 데이터 노드를 대상으로 지정할 수 있습니다. 이 접근 방식을 "분산 후 수집"이라고 합니다.

뷰는 'stale'이라는 매개 변수를 사용하여 쿼리 시점에 세 가지 수준의 일관성을 제공합니다. 기본값은 오래된 값 'update_after'입니다. 이 값은 뷰 쿼리 결과를 반환한 다음 인덱스 업데이트를 트리거합니다. 빠른 응답을 제공하지만 쿼리 결과가 오래되었을 가능성이 있습니다. 오래된 값 'ok'는 인덱스 업데이트를 트리거하지 않고 쿼리 결과를 반환한다는 의미입니다. 분명 빠른 응답을 제공하지만 오래되었을 가능성이 있습니다. 오래된 값 'false'는 쿼리를 실행하기 전에 뷰 인덱스가 업데이트되므로 응답이 지연될 수 있음을 의미합니다.

보기의 일반적인 사용 사례

보기는 다음과 같은 일반적인 사용 사례를 쉽게 지원합니다:

  • 특정 개체 유형에 대한 데이터 목록 생성
  • 저장된 데이터를 기반으로 표 및 정보 목록 생성
  • 데이터베이스에서 정보 추출 또는 필터링
  • 저장된 데이터 수집에 대해 미리 계산된 집계 또는 감소를 반환합니다.
  • 집계별 다단계 그룹
  • 지리 공간 데이터 쿼리
  • 페이지 매김

이제 뷰를 만들고 쿼리하여 맵과 내장된 축소 함수가 어떻게 함께 작동하여 여행 샘플 데이터 집합에 있는 모든 공항의 지리적 고도에 대한 통계적 집계를 제공하는지 확인해 보겠습니다. 이 카우치베이스 관리자 콘솔 UI의 스크린샷은 뷰를 만드는 방법을 보여줍니다.

인상적인 내용입니다!

뷰는 만들기도 쉽고 사용하기도 쉽습니다. 하지만 단점과 한계도 있습니다. 최신의 더 나은 Couchbase 기능인 글로벌 보조 인덱싱과 N1QL을 사용하여 위의 예제를 어떻게 쉽게 제공할 수 있는지 살펴 보겠습니다.

먼저 여행 샘플 버킷을 로드하고 다음 정의로 보조 인덱스를 생성합니다.

그런 다음 다음 N1QL 쿼리를 실행합니다.

이 쿼리는 다음과 같은 결과 집합을 반환합니다.

이렇게 간단합니다!

조회수 제한

보기는 인덱싱 및 쿼리 로직을 표현하는 데 매우 쉽고 유연하지만, 다음과 같은 약점과 단점이 있습니다:

  1. 데이터 파티션으로 묶여 있기 때문에 확장하기가 쉽지 않습니다. 따라서 Couchbase의 다차원 확장의 이점을 누릴 수 없습니다.
  2. 앞서 언급한 이유로 뷰를 사용하여 워크로드 격리를 달성할 수 없습니다.
  3. 디스크 지속성에 대한 의존성과 분산 수집 오버헤드로 인해 수천 QPS 이상의 처리량을 제공할 수 없습니다.
  4. 뷰 인덱스를 데이터 파티션과 함께 디스크에 저장하면 각 데이터 노드의 디스크에 있는 전체 데이터 양이 증가합니다. 따라서 리밸런싱 시간이 길어집니다. 마찬가지로 뷰 인덱스를 저장, 업데이트 및 압축하면 디스크 IO 사용률이 증가합니다.
  5. 뷰 인덱스 캐싱을 위한 메모리 할당량이 따로 설정되어 있지 않습니다. 따라서 최상의 성능을 제공할 수 없습니다.
  6. 뷰는 강력한 오류 검사 기능을 제공하지 않으므로 정의에서 실수를 저지르기 쉽습니다. 예를 들어, 문서의 하위 집합에만 존재할 수 있는 json 속성을 쉽게 구문 분석하려고 시도할 수 있습니다. 이러한 보기의 맵 기능은 해당 속성이 존재하지 않는 문서에 대한 구문 분석 오류를 기록합니다.
  7. 뷰 업데이트는 디스크에 바인딩되기 때문에 시간이 오래 걸리는 경우가 많습니다. 기존 뷰 정의를 수정하거나 개발 뷰에서 전체 빌드를 실행하면 전체 뷰가 다시 만들어집니다. 하나의 디자인 문서에 여러 개의 보기가 있는 경우 이 문제는 증폭됩니다.
  8. 임시 버킷은 지연 시간이 짧고 일관되게 높은 처리량의 읽기 및 쓰기를 제공하지만, 디스크 지속성이 없기 때문에 뷰를 만들 수 없습니다.
  9. 보기는 결국 저장된 기본 문서와 비교하여 일관성을 유지합니다.
결론

카우치베이스 뷰는 잘 운영되어 왔지만 이제 훨씬 더 나은 관리성, 확장성, 성능 및 처리량을 제공하는 더 나은 대안이 있습니다. N1QL 쿼리의 표현력, 다차원 확장이 제공하는 확장 용이성, 글로벌 보조 인덱싱과 전체 텍스트 검색이 제공하는 훨씬 더 높은 성능 등을 고려할 때, 곧 뷰가 더 이상 사용되지 않을 가능성이 매우 높습니다. 사용자들은 새로운 대안을 알아보고 마이그레이션 계획을 세우는 것이 좋습니다. 다음 블로그에서 이러한 대안에 대해 자세히 설명하겠습니다.

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 너바이르 싱, 솔루션 아키텍트, 카우치베이스

솔루션 아키텍트n센터 오브 엑설런스 팀

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.