2016-06-16 6 views
1

최근에 나는 카산드라에 익숙해 지려고 노력했지만 데이터가 삭제 된 후에 디스크에서 언제 제거되는지에 대해서는 잘 모릅니다. 특히 관심이있는 유스 케이스는 DTCS를 사용하여 시계열 데이터를 만료하는 것입니다.카산드라는 삭제 된 후 언제 데이터를 제거합니까?

CREATE TABLE metrics (
    metric_id text, 
    time timestamp, 
    value double, 
    PRIMARY KEY (metric_id, time), 
) WITH CLUSTERING ORDER BY (time DESC) AND 
    default_time_to_live = 86400 AND 
    gc_grace_seconds = 3600 AND 
    compaction = { 
     'class': 'DateTieredCompactionStrategy', 
     'timestamp_resolution':'MICROSECONDS', 
     'base_time_seconds':'3600', 
     'max_sstable_age_days':'365', 
     'min_threshold':'4' 
    }; 

나는 카산드라 24 시간 (86,400초) 이후이 테이블에 삽입 된 모든 행에 대한 삭제 표시를 만듭니다 이해 : 예를 들어, 다음 표를 고려하십시오. 이러한 삭제 표시는 먼저 메모리 내 Memtable에 쓰여지고 Memtable이 특정 크기에 도달하면 SSTable로 디스크로 플러시됩니다. 내 질문은 언제 만료 된 데이터가 디스크에서 제거 될 것입니까? 다음 번에 데이터가 포함 된 SSTable이 압축 될 예정입니까? 따라서 DTCS와 min_threshold을 4로 설정하면 만료 된 데이터와 동일한 시간대에 다른 SSTable이 3 개 이상있을 때까지 기다렸다가 해당 SSTables가 SSTable로 압축됩니다. 이 압축 과정에서 데이터가 제거 될 것입니까? 저에게 이것은 Cassandra가 새로운 삭제 표시가 압축되는 오래된 SSTables에 없을 가능성이 있으므로 행이 삭제 된 일부 메타 데이터를 유지해야 할 것으로 보입니다.

또는 삭제 표시 할 데이터의 만료 된 데이터가 포함 된 SSTables로 삭제 표시가 포함 된 SSTable을 압축해야합니까? 이것은 새로운 삭제 표시가 오래되어 만료 된 데이터로 압축되기를 기다리고 있기 때문에 만료 된 데이터를 보유한 카산드라가 오랫동안 보유 할 수있는 것으로 보입니다.

마침내 나는 삭제 표시 자체가 제거 될 때도 확신하지 못했습니다. 나는 Cassandra가 gc_grace_seconds 이후까지 삭제하지 않는다는 것을 알고 있지만 만료 된 데이터가 삭제 된 것임을 확신 할 때까지 삭제 표시를 삭제할 수 없습니까? 그렇지 않으면 유효 기간이 만료 된 데이터를 볼 수 있습니다. 결과적으로 삭제 표시가 삭제되는 문제는 위의 질문과 밀접한 관련이 있습니다. 감사!

내가 도움이된다면 2.0.15 버전을 직접 사용해 보았습니다.

답변

2

카산드라에서 데이터를 확실히 삭제하는 방법에는 두 가지가 있습니다.

1 : gc_grace_seconds가 만료 된 경우. 테이블에서 gc_grace_seconds는 3600으로 설정됩니다. 행에서 delete 문을 실행할 때 해당 값을 의미합니다. 모든 클러스터에서 데이터가 완전히 제거되기까지 3600 초를 기다려야합니다.

2 : 컴팩 션이 진행되는 동안 카산드라는 삭제 표시가있는 모든 데이터를 찾고 새 SSTable을 작성할 때 단순히 무시하므로 새 SSTable에 데이터가 삭제되지 않습니다.

그러나,이 노드가 gc_grace_seconds보다 또는 압축 중에 아래로 더 이상가는 일이 발생할 수 있습니다, 당신은 내가 가진 것을 나는 깨달았다 다른 일부 추가 연구 및 지원 후 Cassandra documentation.

+0

감사합니다.두 번째 요점을 명확히하기 위해 만료 된 데이터는 압축되는 다른 SSTables에 삭제 표시가 포함되는지 여부에 관계없이 SSTable이 압축 될 때 제거됩니다. 그렇다면 Cassandra는 삭제할 데이터를 알기 위해 SSTable 외부에서 삭제 된 행을 추적해야합니다. 또한 DTCS를 사용하면 세 개의 다른 SSTables가 만료 된 데이터가있는 SSTable과 같은 시간 창에 압축 될 때까지 기다려야합니다. 그렇다면 24 시간 이상 걸릴 수 있습니다. – jeromefroe

+0

두 경우는 실제로 하나입니다. 주요 압축은'gc_grace_seconds'가 초과 된 모든 삭제 된 데이터를 제거합니다. [이 스레드] (http://stackoverflow.com/questions/23346698/should-compaction-within-gc-grace-seconds-preserve-tombstones/23361873#23361873)도 참조하십시오. – Ralf

+0

헤이 랄프, 도와 줘서 고마워! 나는 사소한 다짐에 더 관심이있다. 주요 압축을 통해 카산드라는 모든 데이터를 압축하므로 만료 된 데이터가있는 SSTable과 삭제 표시가있는 SSTable이 함께 압축됩니다. 그러나 사소한 컴팩 션을 사용하면 SSTables가 DTCS가 함께 압축하는 시간 창과 같지 않을 수 있기 때문에 그렇지 않을 수 있습니다. – jeromefroe

1

에서 자세한 정보를 찾을 수 있습니다 원래의 질문에 대한 오해. "TTL로 삭제 된 데이터는 삭제를 실행하는 것과 동일하지 않습니다 - 각 만료되는 셀은 내부적으로 삭제 표시로 변환 될 ttl/timestamp가 있습니다 memtable에 추가 된 삭제 표시가 없거나 디스크로 플러시됩니다 - 만료 된 셀을 일단 타임 스탬프를 지나면 삭제 표시로 처리합니다. "

또한 Cassandra는 memtable이 디스크로 플러시되고 사소한 압축이 실행될 때 만료 된 데이터 만 포함하는 SSTable을 삭제할 수 있는지 확인합니다. 단, (see this issue) 10 분마다 한 번만 실행합니다. 당신이 저와 같은 질문을 가진다면 도움이 되길 바랍니다!