분류

Membase의 새로운 작업

[이 게시물은 Dustin의 깃허브 블로그에도 게재되어 있습니다.]

애플리케이션을 구축하는 사람들을 위해 몇 가지 새로운 프로토콜 연산을 만들었습니다. 연산 추가의 일반적인 목표는 다른 명령과 직교하도록 유지하면서 이전에는 할 수 없었거나 적어도 일반적이고 효율적으로 수행하기 어려웠던 작업을 수행할 수 있는 방식으로 기능을 향상시키는 것입니다.

다음은 새로운 명령어에 대한 설명과 사용 방법에 대한 아이디어입니다.

synchronize!

동기화

우리가 도입한 또 다른 새로운 개념은 동기화 명령을 사용하여 애플리케이션의 데이터가 알려진 값에서 변경되거나 지정된 수준의 내구성을 달성하는 등 특정 방식으로 상태가 변경될 때까지 기다리는 배리어를 제공할 수 있습니다.

멤베이스에서 이것이 어떻게 작동하는지에 대한 간략한 배경(우리가 구현한 경우 동기화 로 시작하는 것이 좋습니다): Membase의 엔진에는 네트워크 인터페이스와 디스크 사이에 사실상 에어 갭이 있습니다. 거의 모든 작업이 RAM에서 처리된 후 비동기적으로 복제 및 유지됩니다. 들어오는 항목은 변경 명령에서 반환되는 즉시 요청할 수 있지만(즉, 주어진 키에 대한 다음 요청은 방금 설정한 항목을 반환합니다), 복제 및 지속성은 곧 이루어질 것입니다.

멤베이스 동기화 명령은 fsync 또는 아마도 msync 는 먼저 멤베이스에 아이템을 자유롭게 로브하고 가장 낮은 수준의 가용성에서 아이템을 수락했는지 확인할 수 있다는 점에서 유용합니다. 중요한 항목 집합을 저장한 다음에는 다음과 같이 동기화 명령에 중요 키와 필요한 내구성 수준을 설정하면 서버는 이 수준에 도달할 때까지(또는 이를 방해하는 상황이 발생할 때까지) 차단합니다.

다양한 의미론(예: 완전 동기화 모드 또는 특정 설정+동기화 명령어를 입력합니다). 단일 설정+동기화 명령을 실행하는 것보다 왕복 횟수가 한 번 더 적습니다. set 그리고 동기화의 일반적인 효과가 있기 때문에 실제로는 거의 차이가 없습니다. 동기화 명령은 지연됩니다. 그러나 이 경우 실제 배치 또는 파이프라인을 수행하기가 매우 어렵다는 대가가 따릅니다. 모든 명령 후, 대규모 배치 후 또는 대규모 배치 내에서 일부 항목에 대해 동기화할 수 있습니다.

무엇을 동기화할 수 있나요?

이 사양은 주어진 키 세트에 대해 다음 상태 변경 중 하나를 모니터링할 수 있도록 허용합니다:

  1. 복제 대기
  2. 지속성 대기
  3. 복제 대기 그리고 지속성
  4. 복제 대기 또는 지속성
  5. 돌연변이 대기

또한 키에 대해 '일부 대 전체' 플래그를 설정하여 키 세트를 서버에 전달하고 모든 키를 기다리지 않고 그중 하나라도 원하는 상태로 변경되는 즉시 알림을 받을 수 있는 공간도 있습니다.

중요한 물건(보관하고 싶은 물건)과 정말 중요한 물건(반품하기 전에 반드시 보관해야 하는 물건)이 섞여 있는 거대한 물건 자루가 있다고 가정할 때 올바른 일을 해보겠습니다.

def store_stuff(항목):
"""항목 컬렉션을 저장합니다.

항목은 비동기식으로 저장된 다음 중요한 항목이 저장됩니다.
반환하기 전에 동기화됩니다."""
중요 = []
에 대한 i in 항목:
mc.set(i., i.exp, i.플래그, i.)
만약 i.중요:
중요.추가(i)

mc.동기화_복제_또는_지속성(중요)

(파이썬 클라이언트는 이러한 기능을 지원하지만, 다음과 같은 기능은 지원하지 않습니다. 정확히 를 사용할 수 있지만 기본적인 아이디어는 얻을 수 있습니다.)

마찬가지로, 디스크에 기록할 수 있는 속도보다 항목이 더 빨리 삽입되지 않도록 제한 삽입을 설정할 수 있습니다.

def store_stuff_slowly(항목, sync_every=1000):
"""대규모로 구축하지 않고도 아이템 컬렉션을 저장합니다.
복제 백로그"""

에 대한 n, i in 열거(항목, 1):
mc.set(i., i.exp, i.플래그, i.)
만약 (n % sync_every) == 0:
mc.동기화 복제(i)

모든 sync_every 항목(기본값 1000)은 동기화가 따라잡힐 때까지 기다립니다. 설정 sync_every 를 하나로 설정하면 모든 항목을 완전히 동기화하게 됩니다.

터치

많은 프로젝트 소유자들로부터 슬라이딩 방식의 만료 기간을 설정할 수 있는 아이템이 있었으면 좋겠다는 의견을 들었습니다. 예를 들어, 아이템이 변이 후 5분이 지나면 만료되도록 하는 대신(현재 오브젝트의 수명을 지정하는 방식), 5분 동안 활동이 없으면 만료되도록 설정하고 싶다는 의견이 있었습니다.

LRU 캐시(예: memcached)에 익숙하다면, 이는 LRU와 의미적으로 상당히 다르다는 점에 유의해야 합니다. LRU를 사용하면 사실상 오래된 데이터는 신경 쓰지 않습니다. 사용 사례 터치 사용자 정의 일정에 따라 비활성 데이터에 대한 액세스를 적극적으로 비활성화해야 합니다.

그리고 터치 명령을 사용하면 값을 건드리지 않고 기존 키의 만료를 조정할 수 있습니다. 이 명령은 모든 변이 명령이 사용하는 것과 동일한 유형의 만료 정의를 사용하지만 실제로 데이터를 건드리지 않습니다.

다음과 유사 터치 를 추가했습니다. gat (겟앤터치) 명령을 사용하여 데이터를 반환하고 동시에 만료를 조정할 수 있습니다. 대부분의 사용 사례에 적합합니다, gat터치하지만 실제로는 애플리케이션을 어떻게 구축하느냐에 따라 다릅니다.

사용 예

사용 터치 그리고 gat 는 매우 간단합니다. 가장 일반적인 패턴은 세션 데이터를 저장할 때 '유휴' 데이터는 빠르게 제거하되 활성 데이터는 활성 상태인 한 계속 유지하려는 경우일 수 있습니다.

def get_session(세션_id, 최대_세션_연령=300):
"""주어진 세션 ID에 대한 유효한 세션 객체를 가져옵니다.

세션은 5분 동안만 진행됩니다.
세션이 다음과 같은 경우 미인증이 발생합니다.
로드할 수 없습니다."""
s = mc.gat(세션_id, 최대_세션_연령)
만약 not s:
인증되지 않은 던지기()
반환 s

이 예시에서는 세션을 유지하고 로그인 등을 처리할 수 있는 애플리케이션 스택의 다른 부분으로 미션 세션을 보내는 간단한 세션 로더를 보여줬습니다.

가용성

저희는 이 기능을 사용하고 있지만 아직 보편적인 가용성을 확보하지는 못했습니다.

서버

Membase 1.7 이 모든 것을 제공합니다. 터치 그리고 gat 기능 및 부분 동기화 기능을 제공합니다.

For 동기화를 사용하면 복제 대기만 지원되며 복제본은 단일 복제본만 지원됩니다. 이 프로토콜은 최대 16개의 복제본을 추적할 수 있지만 클러스터로서의 멤베이스는 전이적 복제를 사용하므로 기본 호스트에서 두 번째 복제본이 완료되는 시점을 추적할 수 없습니다(16번째 복제본은 훨씬 더 적습니다!).

마찬가지로, 지속성 동기화를 위한 대부분의 코드를 작성했지만, 2.0 스토리지 전략 이전에는 대부분의 애플리케이션에서 유용하기보다는 해로울 수 있다고 생각했습니다. 2.0 전략을 사용하더라도 가장 중요한 데이터를 제외한 모든 데이터에 복제 추적을 적용하는 것은 적절하지 않을 가능성이 높습니다.

멤캐시드 1.6(ish)은 다음을 지원합니다. 터치 그리고 gat 를 기본 엔진에 추가할 수 있습니다(Membase에서도 제공됨).

클라이언트

다음과 더불어 mc_bin_client.py (멤베이스와 함께 제공되며 많은 도구를 함께 작성하는 일종의 레퍼런스/플레이그라운드 클라이언트)는 아직 두 클라이언트에서 지원되지만, 가장 좋은 방법을 찾기 위해 기능을 '진화'시키고 있습니다. 피드백은 언제나 환영합니다!

Java

스파이멤캐시 2.7은 다음을 지원합니다. 터치, gat동기화.

C 샤프

멤캐시드용 enyim C# 클라이언트는 다음을 지원합니다. 터치, gat동기화 곧 출시될 예정입니다.

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

작성자

게시자 더스틴 살링스, 수석 아키텍트, 카우치베이스

더스틴 살링스는 카우치베이스의 수석 아키텍트입니다. Dustin은 spymemcached의 저자이자 Couchbase의 핵심 기여자입니다. 멤캐시드 프로젝트.

댓글 하나

  1. 환상적이네요! 요청하신 대로 새 코드를 검토하고 의견을 보내드리겠습니다 - 수고해주셔서 감사합니다!

  2. 대부분의 애플리케이션에서 유용하기보다는 해로울 수 있다고 생각합니다. 2.0 전략에서도 마찬가지입니다,

댓글 남기기

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

구축 시작

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

카펠라 무료 사용

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

연락하기

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