2013-09-07 1 views
8

Couchbase 및 기타 NoSQL 데이터베이스에 대해 가장 자주 묻는 질문은 레코드의 고유 키를 생성하는 방법입니다 - 또는보다 구체적으로 공통 관계의 AUTO INCREMENT 기능을 복제하는 방법입니다 데이터베이스.Couchbase 클러스터에서 고유 한 키 생성을 위해 증가 카운터 사용

자주 언급되는 Couchbase의 솔루션은 숫자 키에서 증가를 호출 할 수있는 증분 함수이며 순차적으로 새로운 고유 번호를 생성합니다.

이 질문에 대한 제 질문은 복제와 관련하여 예측할 수없는 커다란 문제에 대한 저의 머리를 얻을 수 없다는 것입니다.

세 개의 Couchbase 노드로 구성된 클러스터가 있으며 요청 로그를 저장한다고 가정하십시오. 이 로그를 키 입력하여 "requestlog_counter"항목을 작성하십시오.

이제 우리는 각각 20 개의 요청을받는 4 개의 웹 노드가 있고 각각은 "request :: {ID}"로 기록되어야한다고 말합니다. 80 초 요청입니다.

노드 1과 노드 3은 네트워크 대기 시간이 매우 짧지 만이 두 요청 모두 정확히 같은 시간에 수신됩니다. 스크립트는 요청 카운터를 증가시키고 (이 예를 들어 현재 1500이라고 말함) ID를 얻습니다. 확실하게 이제는 Couchbase 인스턴스가 모두 1501을 웹 노드 1과 3으로 반환 할 수 있으며 두 서버는 처리중인 요청을 "request : 1501"로 저장하려고 시도 할 수 있습니다.

이제 복제가이를 처리 할 것이고 근본적으로 최신 복제가 이길 것입니다. 그러나 이제는 한 가지 요청에 대한 기록을 잃어 버렸습니다.

사실 이제는 중요한 데이터를 키잉하는 더 좋은 방법이 필요하며 절대 값과 고유 키 생성에 자동 증가를 사용하면 NoSQL 클러스터 환경에서 피해야하는 것이 무엇인가?

또는 100 % 신뢰할 수있는 키 생성 절차의 일환으로 수행 할 수있는 작업이 있습니다.

또한 교차 데이터 센터 복제를 사용하는 다중 클러스터 환경을 고려하십시오.

감사합니다. documentation 기능 incrementdecremant을 카우치베이스 주식회사에 따른 모든

마이크

답변

7

먼저 클러스터 내에서 "원자"입니다. 그래서 "autoincrement"를 생성하기 위해 그것들을 사용한다면, 모두 잘 동작 할 것입니다.

그러나 couchbase에 새 항목을 저장하는 동안 기존의 설정을 덮어 쓰지 않으려면 ("두 Couchbase 인스턴스가 1501을 반환 할 수있는 상황") StoreMode.Add으로 저장 작업을 사용할 수 있습니다. 따라서 같은 시간에 couchbase.store(StoreMode.Add, "request:1501",value)을 호출하면 하나의 요청이 완료되고 다른 하나는 실패하고이 "실패"를 포착하여 새 키에 대해 새 자동 증가 ID를 얻으면서 다시 시도하십시오.

+1

OK 교차 데이터 센터 복제 예제를 고려하십시오. DC1과 DC2 사이의 링크가 5 초 동안 끊어지면 DC1과 DC2는 각각 200 개의 요청을 받고 처리합니다. 자동 증분이 현재 1700으로 증가했으며 두 DC는 모두 그 ID를 사용하여 저장된 레코드를 보유하고 있습니다. '그런 다음 어떻게됩니까? 저장소 명령이 해당 상황에서 실패하지 않으므로 원자가 아닌지, 작업은 데이터 일관성에 대해 오히려 끔찍한 일이 발생하게 될 것입니다. –

+2

증가량은 하나의 클러스터에서 원자라고합니다.XDCR을 사용하려는 경우 클러스터 ID와 같은 것을 "자동 증가"에 추가해야합니다. 나는. '요청 : : '또는'request : : '을 입력하십시오. 이 경우 두 개의 동일한 자동 증가 ID를 얻더라도 고유 한 'cluster_id'를 갖기 때문에 키가 고유합니다. 그러나 XDCR이 필요하다면 GUID를 사용하고 시간 소인과 같은 값을 추가하여 값을 정렬하고 원자 적 조작을 신경 쓰지 않을 것입니다. – m03geek

+0

삭제하면 OK입니다. 나는이 질문을하는 동안 이것이 사실일지도 모른다고 생각 했었고 앞으로는 RDB에서 NoSQL으로 이동할 때 다른 질문을하게 될 것입니다. 또는 일어날 가능성이 더 큰 것은 누군가가 이것을 고려하지 않을 것이고 XDCR을 소개하고 나면 모든 것이 무너질 것입니다. 문제가 무엇인지 잘못 설명하고 문제 해결 방법을 제공 할 수 있기를 바랍니다. m03geek의 확인 및 조언에 감사드립니다. –