카우치베이스 서버 3.0에서는 키와 메타데이터 캐싱에 메모리를 사용하는 방식을 변경할 수 있는 새로운 옵션이 제공됩니다. 이 새로운 옵션을 "전체 이젝션"이라고 합니다. 전체 이젝션의 차이점은 다음과 같습니다:
2.x에서는 모든 키와 메타데이터를 메모리에 캐시하고 값만 내보낼 수 있도록 했습니다. 이는 데이터의 모든 부분에 대한 짧은 지연 시간 액세스에 적합합니다. 그러나 일부 워크로드에서는 데이터의 모든 부분에 대한 저지연 액세스가 필요하지 않으며, 오히려 작업 세트의 '더 중요한' 부분을 위해 메모리가 예약되어 있습니다. 센서에서 원격 분석을 수집하는 대규모 데이터베이스나 모든 장치에서 방대한 데이터 포인트를 수집하지만 주로 지난 24시간의 데이터를 쿼리하는 IoT(사물 인터넷) 시스템을 상상해 보세요. 3.0에서는 활성 작업 세트가 적은 대규모 데이터베이스의 경우 '전체 내보내기'를 켜고 거의 액세스하지 않는 데이터의 일부에 대한 키와 메타데이터를 내보낼 수 있습니다. 키와 메타데이터가 작다고 생각하더라도 키 수가 많으면 키와 메타데이터에 사용되는 메모리가 늘어날 수 있습니다. 전체 꺼내기 모드를 사용하면 작업 세트의 더 큰 부분을 캐싱하는 데 메모리를 더 효과적으로 사용할 수 있습니다.
- 이 옵션을 활성화하는 방법은 간단하며 관리자 콘솔에서 버킷별로 설정할 수 있습니다. 변경 사항은 앱에 투명하게 표시되므로 이 설정을 활용하기 위해 애플리케이션 크기에 대한 별도의 조치가 필요하지 않습니다.

몇 가지 수치를 통해 대규모 데이터베이스에 얼마나 효과적인지 살펴봅시다. 아래 그래프는 설정이 동일한 2.5.1 및 3.0 클러스터의 데이터 로드 중 메타데이터 저장에 소비되는 메모리를 보여줍니다. 2.5.1과 이전 2.x 버전은 캐시 방식에서 동일하게 작동하므로 모든 2.x 버전에서도 반복할 수 있습니다.
- 왼쪽 그래프는 값 내보내기 모드에서 실행되는 2.x에서 시간 경과에 따른 메모리의 메타데이터 양을 보여줍니다(이 모드가 허용되는 유일한 캐싱 모드이므로).
- 오른쪽 그래프는 완전 배출 시 버전 3.0의 동작을 보여줍니다.

데이터가 누적됨에 따라 Couchbase Server 2.x의 메모리 사용량이 3GB로 증가하는 것을 볼 수 있습니다. 오른쪽에는 3.0에서 약 80MB의 메모리를 소비하는 것을 볼 수 있습니다. Couchbase Server 3.0에서 전체 추출을 사용하면 동일한 작업이 키와 메타데이터를 지속적으로 추출하기 때문에 훨씬 적은 양의 메모리를 소비합니다. 키와 메타데이터를 배출하여 확보한 메모리는 새로운 키와 메타데이터는 물론 로드 중인 데이터의 값에 사용할 수 있습니다. 메타데이터에 사용되는 메모리의 대폭 감소... 테스트는 복제본 수를 1로 설정하고 값 크기를 평균 약 .5K로 설정한 상태에서 수행되었으며, 결국 그래프에 시각화된 데이터 로드 작업 중에 두 데이터베이스 모두 약 50Mil 문서에 도달했습니다.
그렇다면 앱이 3.0에서 내보낸 키와 메타데이터에 액세스해야 할 때는 어떻게 될까요? 여기에는 타협점이 있으며, Couchbase는 추가 IO를 수행하여 키와 메타데이터 및 값을 완전히 배출된 상태에서 메모리로 다시 가져옵니다. 추가, 삭제, 터치, CAS 작업과 같은 작업에는 여전히 메타데이터가 필요합니다. 그러나 Set에는 특별한 최적화가 있습니다: Couchbase는 키와 메타데이터의 검색을 건너뛰고 이전 버전이 무효화된 것으로 간주할 수 있습니다.
마무리하기 전에 새로운 전체 내보내기 옵션이 대규모 데이터 세트에 상당한 효율성을 가져다준다는 점을 분명히 말씀드리고 싶습니다. 그러나 모든 데이터 액세스에 대해 매우 짧은 지연 시간이 필요한 애플리케이션이 있는 경우에는 계속 값 내보내기 옵션을 사용해야 합니다. 쿠키 또는 세션 저장소나 장바구니 애플리케이션, 프로필 저장소는 모든 키와 메타데이터를 메모리에 고정하는 데 매우 적합하므로 값 내보내기를 사용해야 합니다.
많은 감사드리며 언제나 그렇듯이 모든 의견을 환영합니다.
-cihan