이벤트를 통해 버킷을 컬렉션 및 범위로 마이그레이션하기: 1부
먼저 시바니 굽타가 작성한 훌륭한 블로그를 소개해드리고 싶습니다, Couchbase 7.0에서 범위 및 컬렉션으로 마이그레이션하는 방법에서 버킷 기반 문서를 Couchbase의 범위 및 컬렉션으로 마이그레이션하는 다른 방법을 자세히 다루고 있습니다. Shivani가 다루는 여러 가지 비이벤트 메서드에 대해서도 읽어보시기 바랍니다.
Couchbase를 처음 사용하든 노련한 수의사라면 스코프와 컬렉션에 대해 들어보셨을 것입니다. 사용해 볼 준비가 되었다면 이 도움말을 참조하세요.
범위 및 컬렉션은 다음 버전에 도입된 새로운 기능입니다. 카우치베이스 서버 7.0 를 사용하여 Couchbase 내에서 데이터를 논리적으로 구성할 수 있습니다. 자세히 알아보기, 범위 및 컬렉션에 대한 이 소개를 읽어보세요..
레거시 RDBMS를 문서 데이터베이스에 매핑하거나 수백 개의 마이크로서비스 및/또는 테넌트를 단일로 통합하려는 경우 범위 및 컬렉션을 활용해야 합니다. 카우치베이스 클러스터(결과적으로 TCO가 훨씬 낮아집니다).
범위 및 컬렉션 마이그레이션에 이벤트 사용
이 문서에서는 이전 CouchBase 버전에서 CouchBase 7.0의 범위 및 컬렉션으로 마이그레이션하는 또 다른 고성능 방법의 메커니즘에 대해 설명합니다.
버킷에서 컬렉션으로 마이그레이션하려면 데이터 서비스(또는 KV)와 Eventing만 있으면 됩니다. 잘 조정된 대규모 Couchbase 클러스터에서는 초당 1백만 개 이상의 문서를 마이그레이션할 수 있습니다. 예, N1QL도 필요 없고 인덱스도 필요하지 않습니다.
후속 포스트(2부)에서는 수십 개의 대규모 마이그레이션을 수행할 수 있는 간단한 완전 자동화된 방법론을 제공하겠습니다. (또는 수백 개) 데이터 유형의 간단한 Perl 스크립트.
전제 조건: 이벤트에 대해 알아보기
이 글에서는 최신 버전의 Couchbase(7.0.2)를 사용하지만 이전 7.0 버전도 정상적으로 작동합니다.
카우치베이스 또는 이벤트 서비스에 익숙하지 않은 경우, 다음 리소스를 통해 하나 이상의 이벤트 예시를 살펴보시기 바랍니다:
- 작동하는 Couchbase 7.0 서버 설정하기 "여기서 시작하세요!"의 지침에 따라 클릭합니다.
- 기본 이벤트 함수를 다음과 같이 배포하는 방법을 이해합니다. 데이터 강화 예제의 지침에 따라. '소스' 버킷만 사용하는 '사례 2'를 살펴보겠습니다:
- 버킷 두 개 "대량" 및 "rr100" 크기의 100MB.
- 소스 키 스페이스 "bulk.data.source".
- 이벤트 발생 스크래치패드 키 공간 "rr100.eventing.metadata".
- 다음에 대한 문서를 참조하세요. 버킷을 만드는 방법에 대한 자세한 단계.
이벤트 함수: ConvertBucketToCollections
Eventing을 사용하면 순수한 비즈니스 로직을 작성할 수 있습니다. Eventing 서비스는 여러 노드에서 기능을 관리하고 확장(수평 및 수직)하는 데 필요한 전체 인프라를 성능과 안정성을 갖춘 방식으로 처리합니다.
모든 이벤트 함수에는 두 가지 진입점이 있습니다. 온업데이트(문서, 메타) 그리고 OnDelete(메타, 옵션). 이 예제에서는 후자의 진입점에 대해서는 걱정하지 않습니다.
문서가 변경되거나 변경되면(삽입, 업서트, 바꾸기 등) 문서 사본과 문서에 대한 일부 메타데이터가 작은 JavaScript 엔트리 포인트로 전달됩니다. 온업데이트(문서, 메타).
이벤트 함수는 다음 두 가지 배포 피드 경계를 사용하여 배포할 수 있습니다."지금부터" 또는 "모든 것". 후자는 Couchbase 6.6의 버킷 또는 Couchbase 7.0의 키스페이스(버킷/범위/컬렉션)에 있는 모든 현재 문서에 액세스할 수 있습니다..
스크립트 버킷을 컬렉션으로 변환하기 메인 Eventing 문서에서 Eventing을 활용하여 소스 버킷에서 대상 버킷으로 데이터를 가져오고 데이터를 컬렉션으로 분할하는 방법을 보여줍니다..
1단계: 샘플 데이터 로드
Couchbase UI에서 "설정/샘플 버킷". 확인 맥주 샘플 버튼을 클릭합니다."샘플 데이터 로드“.

2단계: 필요한 키 스페이스 만들기
이 예제에는 버킷 3개가 필요합니다: "beer-sample" (즉, 마이그레이션할 문서 저장소), "rr100″ (즉, 다른 이벤트 함수와 공유할 수 있는 이벤트용 스크래치 패드) 및 대량 (마이그레이션된 컬렉션을 만들 버킷). "rr100″ 및 "bulk" 버킷의 크기는 최소 100MB여야 합니다.
Couchbase UI에서 "버킷"를 누르고 "버킷 추가' 링크를 클릭합니다.
100MB 크기의 버킷 두 개를 만듭니다."rr100"(이벤트 저장소 또는 스크래치 패드용) 및 "대량"(마이그레이션 대상의 경우)를 입력합니다.
버킷에서 "rr100″ 범위 만들기 "이벤트“.
범위에서 "rr100.이벤트" 컬렉션 만들기 "메타데이터“.
버킷에서 "대량" 범위 만들기 "데이터“.
범위에서 "bulk.data" 컬렉션 만들기 "맥주" 및 "양조장“.
이 시점에서 다음과 같이 3개의 버킷이 있어야 합니다:

에 다음 컬렉션을 추가하여 "bulk" 버킷:

및 "rr100″ 버킷:

3단계: 이벤트 함수 만들기
Couchbase UI에서 "이벤트"를 누르고 "기능 추가' 링크를 클릭합니다.
이벤트 기능의 설정은 다음과 같습니다:

버튼 누르기 "저장'를 클릭한 다음 함수 편집기 패널에 이 스크립트를 붙여넣습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
함수 온업데이트(doc, 메타) { 만약 (doc.유형 === '맥주') { 만약 (DO_COPY) beer_col[메타.id] = doc; 만약 (DO_DELETE) { 만약 (!beer_col[메타.id]) { // 안전 점검 로그("스킵 삭제 복사본을 찾을 수 없음 유형=" + doc.유형 + ", meta.id=" + 메타.id); } else { 삭제 src_col[메타.id]; } } } 만약 (doc.유형 === '양조장') { 만약 (DO_COPY) brewery_col[메타.id] = doc; 만약 (DO_DELETE) { 만약 (!brewery_col[메타.id]) { // 안전 점검 로그("스킵 삭제 복사본을 찾을 수 없음 유형=" + doc.유형 + ", meta.id=" + 메타.id); } else { 삭제 src_col[메타.id]; } } } } |
코드 편집기의 모습은 다음과 같아야 합니다:

버튼 누르기 "저장 및 반환”
ConvertBucketToCollections의 기능
그리고 온업데이트(문서, 메타) 로직이 모든 데이터를 처리합니다. 맥주 샘플._default._default 키스페이스에 저장되며, 과거(과거) 및 새로운(미래) 돌연변이에 대해 다음을 수행합니다.
-
- 먼저 doc.유형 가 거의 동일한 두 개의 코드 블록에서 일치하는지 확인합니다.
맥주또는양조장. 일치하는 항목이 있으면 계속 진행합니다. - 글로벌 상수
DO_COPY(함수 설정을 통해 상수 바인딩 별칭으로 제공됨)을 확인하여 항목을 복사해야 하는지 여부를 확인합니다. - 만약
DO_COPY가 참이면 문서가 대상 컬렉션 또는 키 공간에 기록됩니다.beer_col또는brewery_col(버킷 바인딩 별칭을 통해 함수 설정을 통해 정의됨) 일치하는 코드 블록에 따라 다릅니다. - 글로벌 상수
DO_DELETE(함수 설정을 통해 상수 바인딩 별칭을 통해 제공)를 확인하여 소스 키 공간 또는 컬렉션에서 항목을 제거해야 하는지 여부를 확인합니다(함수 설정을 통해 버킷 바인딩 별칭을 통해 정의). - 만약
DO_DELETE가 참이면 문서가 컬렉션 또는 키 공간에서 제거됩니다.src_col(함수 설정을 통해 버킷 바인딩 별칭을 통해 정의됨).
- 먼저 doc.유형 가 거의 동일한 두 개의 코드 블록에서 일치하는지 확인합니다.
더 나은 성능을 위해 워커를 1에서 vCPU 수로 늘릴 수도 있지만, 데이터 세트가 사소하므로 워커 수를 하나(1)로 남겨두겠습니다. 참고: 작업자 설정은 기능 설정 대화 상자 가운데에 있는 확장 가능한 섹션 설정에서 찾을 수 있습니다..
이벤트 함수 배포
이제 Eventing 기능을 배포할 차례입니다. ConvertBucketToCollections 마이그레이션 스크립트의 코드와 디자인을 약간 검토했으니 이제 모든 것이 함께 작동하는지 확인해 볼 차례입니다.
이 시점에서 JavaScript에 함수가 있으므로 다음을 수행해야 합니다. 에 추가하십시오. 카우치베이스 클러스터를 활성 상태로 배포합니다.

버튼 누르기 "배포“.
이벤트 서비스에서 이벤트 함수를 배포하는 데 약 18초가 소요되며, 이 시점에서 7303개의 항목이 처리된 것을 즉시 확인할 수 있습니다. 데이터 세트가 정적이므로 모든 항목이 처리되었으므로 완료된 것입니다. 데이터 세트가 정적이므로 모든 항목이 처리되었으므로 완료된 것입니다.
버튼 누르기 "배포 취소“.
마이그레이션된 데이터 살펴보기
이제 이벤트 함수 사용을 마쳤으므로 버킷과 컬렉션을 검사하여 어떤 일이 일어났는지 확인할 수 있습니다.
Couchbase UI에서 "버킷”
이제 버킷에 대해 "범위 및 컬렉션"을 선택합니다."bulk"을 클릭한 다음 범위를 확장 "데이터".
Couchbase UI에서 "문서"을 클릭한 다음 키스페이스 "bulk.data.beer'를 클릭하면 해당 컬렉션에 마이그레이션된 문서가 표시됩니다.
Couchbase UI에서 "문서"을 클릭한 다음 키스페이스 "bulk.data.brewery'를 클릭하면 해당 컬렉션에 마이그레이션된 문서가 표시됩니다.
이벤트 기능 개선하기
이벤트는 즉석에서 데이터를 보강할 수 있으며, 버킷(Couchbase 6.x)을 별도의 컬렉션(Couchbase 7.0)으로 실제로 분할하는 경우 더 이상 유형 속성을 추가합니다. 이제 함수를 수정하여 데이터를 변환해 보겠습니다.
예를 들어 "abhi_brewery" 소스 데이터에서 in 맥주 샘플._default._default:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "name": "아비 양조장", "city": "", "state": "", "code": "", "country": "India", "전화": "", "웹사이트": "", "type": "양조장", "업데이트됨": "2011-09-27 00:35:48", "설명": "", "주소": [] } |
이벤트 함수에 대한 수정 사항은 다음과 같습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
함수 온업데이트(doc, 메타) { 만약 (!doc.유형) 반환; var 유형 = doc.유형; 만약 (DROP_TYPE) 삭제 doc.유형; 만약 (유형 === '맥주') { 만약 (DO_COPY) beer_col[메타.id] = doc; 만약 (DO_DELETE) { 만약 (!beer_col[메타.id]) { // 안전 점검 로그("스킵 삭제 복사본을 찾을 수 없음 유형=" + doc.유형 + ", meta.id=" + 메타.id); } else { 삭제 src_col[메타.id]; } } } 만약 (유형 === '양조장') { 만약 (DO_COPY) brewery_col[메타.id] = doc; 만약 (DO_DELETE) { 만약 (!brewery_col[메타.id]) { // 안전 점검 로그("스킵 삭제 복사본을 찾을 수 없음 유형=" + doc.유형 + ", meta.id=" + 메타.id); } else { 삭제 src_col[메타.id]; } } } } |
그리고 새로운 전역 상수를 하나 추가하기 때문에 DROP_TYPE를 클릭하고 다음과 같이 설정을 수정합니다:

최종 생각
이 글이 도움이 되었으며 이벤트에 대해 더 자세히 알아보고 싶다면 여기를 클릭하세요. 카우치베이스 이벤트 서비스.
이제 Eventing을 사용하여 버킷을 범위와 컬렉션으로 마이그레이션하는 메커니즘을 이해하셨으니, 다음 포스트(2부)에서 간단한 완전 자동화된 방법론을 통해 수십 개의 데이터 유형으로 대규모 마이그레이션을 수행하는 간단한 Perl 스크립트.
리소스
- 다운로드: Couchbase Server 7.0 다운로드
- 이벤트 스크립트: 함수: ConvertBucketToCollections
참조
카우치베이스와 이벤트 서비스의 기능이 마음에 드셨는지, 앞으로 비즈니스에 어떤 도움이 되는지 여러분의 의견을 듣고 싶습니다. 아래 댓글이나 다음에서 의견을 공유해 주세요. 카우치베이스 포럼.




