2017-10-16 2 views
0

특정 키를 사용하여 db에 최신 레코드를 쓰고 싶습니다. 기록으로 타임 스탬프가 있으면 쉽게 될 것입니다. 하지만 시간 스탬프 대신에 일련 번호가 있습니다.타임 스탬프를 사용하지 않고 최신 데이터 쓰기

또한, 시퀀스 번호가 큰 값 (16^2)에 도달 한 후 0으로 리셋된다. 그러나 시퀀스 번호는 2^16에 도달하지 않아도 언제든지 재설정 할 수 있습니다.

나는 모든 레코드를 추가하고 최대의 일련 번호로 하나를 읽을 수있는 옵션이 있습니다. 그러나 리셋 후에 문제가 발생할 것입니다 (리셋은 어느 순간에 발생할 수 있기 때문에).

다른 옵션은 경량 트랜잭션을 사용하는 것입니다하지만 동시성을 보장합니다 있는지 확실하지 않습니다. 또한 성능이 크게 영향을받을 수 있습니다.

어떻게해야합니까? 나는 카산드라 DB를 사용하고 있습니다.

답변

0

가장 최근 값은 일반적으로 이벤트 로그를 유지하고 첫 번째 레코드를 읽음으로써 수행됩니다. 삽입 할 때 언제나 새로운 타임 스탬프 (또는 타임 아이디)를 생성 할 수 있습니다. 뭔가 같이 :

CREATE TABLE record (
    id text, 
    bucket text, 
    created timeuuid, 
    info blob, 
    PRIMARY KEY ((id, bucket), created) 
) WITH CLUSTERING ORDER BY (created DESC) 

그런 다음 SELECT * FROM record WHERE id = 'user1' AND bucket = '2017-09-10' LIMIT 1; 버킷은 너무 큰지고 파티션을 방지하기 위해 "오늘"입니다. 충돌에 대해 걱정하기 전에 timeuuid를 사용하여 호스트 당 ms 당 10k 번 씁니다.

당신이 선형화 일관성 요구 사항이있는 경우에 당신이 (적절하게 사용하는 경우를 보장합니다 경량 거래) paxos 또는 사육사와 같은 외부 잠금 시스템을 사용해야합니다. 분산 시스템에서는 그 종류가 더 복잡하고 정상적인 쓰기와 동일한 처리량을 얻지 못합니다.

관련 문제