2013-09-02 2 views
0

나는 cassandra를 사용하여 버전을 지정해야한다는 요구 사항이 있습니다. 다음cassandra의 버전 관리

테이블 file_details (ID 텍스트 기본 키, FNAME 텍스트 버전 INT, 마임 텍스트)를 만들 내 열 가족의 정의

이다;

fname 열에 보조 색인이 생성되었습니다.

동일한 'fname'에 대한 삽입을 수행 할 때마다 버전을 증가시켜야합니다. 그리고 fname으로 행을 검색 할 때 최신 버전 행을 반환해야합니다.

접근 방법을 제안하십시오.

+0

매번 정확히 1 씩 버전이 증가해야합니까? 그렇지 않다면, fname과 mimetype에 대한 타임 스탬프의 최대 값은 항상 증가하는 숫자가 될 것이므로 버전 관리에 사용될 수 있습니다. – Richard

+0

네, 버전을 정확히 1로 늘리라는 요구가 있습니다. 또한 fname과 mimetype에 대한 최대 타임 스탬프를 얻는 쿼리가 어떻게 될지 알려주실 수 있습니까? – Dawood

+0

id = 'id';가있는 file_details에서'select writetime (fname), writetime (mimetype)을 사용할 수 있으며 코드에서 최대 값을 찾을 수 있습니다. – Richard

답변

2

버전을 1 늘리는 요구 사항을 완화 할 수없는 경우 카운터를 사용하는 것이 좋습니다.

데이터에 대한 테이블을 만듭니다

create table file_details(id text primary key, fname text, mimetype text); 

및 버전에 대한 별도의 테이블 :이 테이블은 모든 카운터 또는 전혀 카운터를 포함 할 수 있습니다 있기 때문에 별도의 테이블이 필요

create table file_details_version(id text primary key, version counter); 

을 .

insert into file_details(id, fname, mimetype) values ('id1', 'fname', 'mime'); 
update file_details_version set version = version + 1 where id = 'id1'; 

그런 다음 file_details에서 읽기는 항상 최신을 반환합니다, 당신은 file_details_version에서 최신 버전 번호를 찾을 수 있습니다

그런 다음 업데이트를 당신은 할 수 있습니다.

그러나 이것에는 많은 문제가 있습니다. 카운터를 사용하여 원자 배치를 수행 할 수 없으므로 두 업데이트는 원자 적이지 않습니다. 일부 실패 시나리오는 유지되는 file_details에 대한 삽입으로 만 이어질 수 있습니다. 또한 읽기 분리가 없으므로 업데이트 도중 읽으면 두 테이블간에 일치하지 않는 데이터가 발생할 수 있습니다. 마지막으로 Cassandra의 카운터 업데이트는 오류를 허용하지 않으므로 카운터 업데이트 중에 오류가 발생하면 두 번 계산할 수 있습니다 즉 버전을 너무 많이 늘리십시오.

카운터를 포함하는 모든 솔루션이 이러한 문제에 부딪 힐 것이라고 생각합니다. 각 업데이트에 대해 고유 한 ID (예 : 큰 난수)를 생성하고이를 별도의 테이블에있는 행에 삽입하여 카운터를 피할 수 있습니다. 그러면 버전은 행에있는 ID의 수입니다. 이제 당신은 원자 적 업데이트를 할 수 있고, 실패는 실패에 관대 할 것입니다. 그러나 읽기 시간은 O (갱신 수)이고 읽기는 여전히 분리되지 않습니다.