2014-06-05 5 views
1

카산드라를 사용하는 가장 좋은 방법은 아니지만 내 데이터 유형은 지난주의 모든 데이터를 읽어야합니다. 그러나 CQL3에서 Collection-types을 사용할 때, 정상적인 날짜 범위 쿼리를 수행하지 못하게하는 특정 제한 사항에 부딪혔습니다.카사 드라 테이블에있는 많은 묘비를 읽는 이유는 무엇입니까? 액세스 패턴을 사용하면 피해야합니다.

은 그래서 나는 자동으로 캐시에서 항목을 제거하기 위해 1 주일 TTL에 삽입하고 다음 표

CREATE TABLE cache (tag text, id int, tags map<text,text>, 
    PRIMARY KEY (tag, id)); 
ALTER TABLE cache WITH GC_GRACE_SECONDS = 0; 

와 카산드라 (현재 단일 노드, 미래에 아마 더)를 설정했습니다.

은 내가 이전 데이터 읽기 피하기 위해 다른 곳에서 계속 "최소 ID"로 선택하여 많은 삭제 표시를 읽는 피하기 위해 this article에 언급 된 제안을 따르려고 노력 :

SELECT * FROM cache WHERE tag = ? AND id >= ? 

ID를 기본적으로 어떤 종류의 것입니다 타임 스탬프는 지속적으로 증가하고 있습니다. 즉, 시간이 지남에 따라 더 높은 값만 삽입하고 테이블에서 이전 ID를 끊임없이 제거합니다.

하지만 여전히 임계 값에 대한 경고가

WARN 08:59:06,286 Read 5001 live and 5702 tombstoned cells in cache (see tombstone_warn_threshold) 

에 도달 내가 수동 압축을 실행하지 않는 경우/세정되고 얻을 정기적으로 나는 예외 쿼리가 실패 얻을.

그러나 기사와 문서에서 얻은 이해를 바탕으로 카산드라가 해당 영역만을 검색 할 수 있도록 태그의 일치 여부를 쿼리 할 때 모든 삭제 표시를 피할 것입니다. Cassandra는 대부분의 삭제 표시 후에 만 ​​읽을 수 있습니다. 그럼 왜 삭제 표시 경고/예외가 계속보고됩니까?

+1

"허용 필터링"에 대한 이유가 있습니까? –

+0

좋은 필터링에 대한 좋은 질문, 실제로 내 쿼리 중 일부에 필요하지만, 이들은 필요하지 않습니다,하지만 난 여전히 이전과 같은 경고를 볼 수 있습니다, 나는 단지 카산드라 경고를 피하기 위해 생각하고 변경하지 않습니다 실제 쿼리 실행은 이제 질문에서 제거되었습니다. – centic

답변

2

지도 k/v 쌍은 실제로 열 (이름, 값 및 타임 스탬프)입니다. 따라서지도 요소를 많이 삭제하는 경우 (TTL로 만료 됨) -이 원본은 이 경고. 왜냐하면 당신은 아직도 전체지도를 읽고 있기 때문입니다 (그들 안에 묘비가 많이 있습니다). 또한지도상의 TTL 설정은 요소별로 적용됩니다.

두 번째로, 선택 쿼리에서> = 술어를 곱합니다.

이 경우 SELECT 쿼리에서 EQ 관계 만 사용하도록 데이터 액세스 패턴을 다시 만들고 더 자주 id을 범핑해야합니다. 또한이 액세스 패턴을 사용하면 PRIMARY KEY의 클러스터링 부분을 제거 할 수 있습니다.

따라서지도에서 삭제하지 않으면 tag text, time timeuuid, name text, data text 모델을 사용하고 시간별로 정확하게 잘라낼 수 있습니다.