2014-05-10 7 views
1

두 프로세스가 동일한 버킷 및 동일한 키 (두 개의 다른 RIAK 노드를 처리 할 수 ​​있음)를 사용하여 RIAK에 동일한 쓰기 명령을 동시에 실행하고 allow_mult가 true이고 버킷에서 키가 완전히 새로운 것으로 가정합니다. {확인, WrittenObject} = riakc_pb_socket : VALUE_COUNT (WrittenObject)이 1보다 큰 경우, 또는 확실히 하나 개의 프로세스가있을 것이다 : (PID, 확대 개체, [return_body])에있는 동등한 형제 생성

이 두 프로세스가 WrittenObject 다시 riakc_obj 어디서 얻을 일어날 수 넣어 그것은 1로, 다른 하나는 2의 값을 얻습니다.

답변

0

이미 키에 저장된 내용과 각 put 요청에 포함되는 vclock에 따라 값 수는 1,2 또는 3 일 수 있습니다. 파티션 이벤트가 없다고 가정하면 (즉, 실패하지 않은 경우) 각 put은 키의 preflist에있는 1 차 vnode 중 하나에 의해 조정되고, 저장중인 객체에 포함 된 vclock이 이미 존재하는 것을 지배하지 않으면 두 값이 모두 저장됩니다. 두 요청이 거의 동시에 이루어 지더라도, 먼저 처리되고, 둘 다 아니라면 형제가 경쟁을 보게됩니다.

편집 : 버킷에 allow_mult 속성을 false로 설정하면, Riak 메타 데이터의 X-Riak-Last-ModifiedX-Riak-Deleted 항목을 기반으로 반환하는 하나의 값을 선택합니다. 즉, 넣은 값이 반환 된 값이 아닐 수도 있습니다.

allow_mult이 true 인 경우에만 둘 이상의 값이 반환됩니다.

+0

고마워요! 따라서 키가 새롭고 vclock이 put에 사용되지 않으면 첫 번째 노드 요청이 이미 처리되었고 객체가 이미 저장되었으므로 첫 번째로 처리 된 노드의 요청은 1을 얻고 다른 노드는 2를 얻습니다. 그래서 그것은 일어날 수 없습니다, 두 개의 복제본이 교차 기록됩니다. 즉. 두 번 쓰여진 동일한 객체가 두 개의 서로 다른 노드에 먼저 저장됩니다. 객체의 복제본이 다른 노드에 저장되고 복제본이 작성 될 때마다 각 쓰기가 다른 노드의 객체를 작성하여 쓰는 것입니다. put은 복제본의 수에 관계없이 원자 연산입니다. – zsoci

+0

각 프로세스가 여러 vnode에 의해 처리되므로 어느 작업도 '첫 번째 프로세스'로 보장 할 수 없습니다. 하나의 vnode에서 요청 1이 먼저 처리되고 다른 요청에서는 요청 2가 먼저 처리되어 두 요청 모두 형제를 보게 될 가능성이 완전히 있습니다. – Joe

+0

보장 할 필요가 없습니다. 그것은 간단한 질문이었습니다. 이론적으로 동시에 진행되는 두 프로세스가 있었기 때문에 RIAK이 먼저 작성한 요청이있는 첫 번째 프로세스를 의미했습니다. 두 요청은 동일합니다. 질문은 두 가지 형제가 모두있을 가능성에 관한 것입니다. 미안하지만 여전히 불분명하다. 당신이 말했듯이, 두 과정 모두 형제를 다시 얻을 수 있습니다. 이 경우 복제본이 교차 작성되었음을 의미합니다. 형제 메타 데이터가 last_written의 관점에서 어떻게 보이는지 정의 할 수 있습니까? 다시 말하지만, 단지 두 개의 프로세스 수명이 있고 동일한 객체를 작성합니다. 실패는 없지만 복제본. – zsoci