내 액세스 패턴은 삭제 표시를 방지해야 하는데 Cassandra 테이블에서 많은 삭제 표시를 읽는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com//questions/24053860

  •  21-12-2019
  •  | 
  •  

문제

이것이 Cassandra를 사용하는 가장 좋은 방법은 아니라는 것을 알고 있지만 내 데이터 유형으로 인해 지난 주의 모든 데이터를 읽어야 합니다.그러나 CQL3에서 컬렉션 유형을 사용할 때 일반적인 날짜 범위 쿼리를 수행하지 못하게 하는 특정 제한 사항에 직면했습니다.

그래서 다음 표를 사용하여 Cassandra(현재는 단일 노드, 앞으로는 더 많을 것임)를 설정했습니다.

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

캐시에서 항목을 자동으로 제거하기 위해 TTL을 1주일로 삽입하고 있습니다.

나는 언급된 제안을 따르려고 노력했습니다. 이 기사 "최소 ID"를 선택하여 많은 삭제 표시를 읽지 않으려면 이전 데이터를 읽지 않기 위해 다른 곳에서 유지합니다.

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는 해당 영역만 찾을 수 있고 Cassandra가 시작할 수 있는 최소 ID를 사용합니다. 대부분의 삭제 표시 이후에만 읽을 수 있는데 왜 여전히 삭제 표시 경고/예외가 보고됩니까?

도움이 되었습니까?

해결책

맵 k/v 쌍은 실제로 열(이름, 값 및 타임스탬프)입니다.따라서 지도 요소를 많이 삭제하는 경우(TTL로 만료되는 경우도 해당) 이것이 이 경고의 원인입니다.왜냐하면 당신은 여전히 ​​전체 지도(많은 묘비가 포함되어 있음)를 읽고 있기 때문입니다.또한 지도의 TTL 설정은 요소별로 적용됩니다.

둘째, 선택 쿼리에서 >= 조건자를 곱합니다.

이 경우 SELECT 쿼리 및 범프에서 EQ 관계만 사용하도록 데이터 액세스 패턴을 재구성해야 합니다. id 더 자주.또한 이 액세스 패턴을 사용하면 기본 키의 클러스터링 부분을 제거할 수 있습니다.

따라서 해당 지도에서 많은 삭제를 실행하지 않으면 다음을 사용해 볼 수 있습니다. tag text, time timeuuid, name text, data text 모델링하고 시간별로 정확하게 분할합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top