Ultimamente, tenho lutado para saber como o TWCS funciona especificamente. Em nosso fluxo de trabalho, temos algumas tabelas contendo dados de série temporal com um TTL principalmente estático. Como tal, foi tomada a decisão de utilizar o TWCS como estratégia de compactação para este efeito. Existem, no entanto, infelizmente algumas destas tabelas que parecem estar a ocupar mais espaço do que o habitual, ou seja, parecem estar bloqueadas pelas SSTables mais antigas. Já identificamos uma causa raiz potencial. Existe um cenário em que uma reescrita de TTL pode ocorrer em um registro existente, por exemplo, diminuindo o TTL desse registro existente. Nesse cenário, faz sentido que esse registro, que residiria em vários SSTables, com TTL maior e menor, bloqueie a compactação de outros SSTables. Na verdade, depois de um tempo, esses registros atualizados apareceram no TTL e, posteriormente, tudo foi desbloqueado. No entanto,
Por isso comecei a ler alguns artigos sobre isso. Alguns artigos aos quais me refiro são, por exemplo, https://thelastpickle.com/blog/2016/12/08/TWCS-part1.html ou https://www.redshots.com/cassandra-twcs-must-have-ttls/ . Especialmente este último me causou suspeitas sobre se uma alteração de TTL entre "novos" registros também teria um efeito de bloqueio. O último artigo menciona especificamente que a exclusão de todo o sstable quando preenchido com TTLs só acontecerá se for o sstable mais antigo, portanto, uma vez que um não pode ser excluído, nenhum dos subsequentes também poderá ser excluído .
Consideramos o seguinte cenário com TWCS:
Escrevemos, por exemplo, 100 registros com um TTL de 5.000, que terminam todos na mesma SSTable e, posteriormente, escrevemos 100 novos registros com um TTL diferente de 100, gravados em uma nova coluna (mas talvez a mesma partição).
Com base em meus testes, presumo que os primeiros 100 registros para "saída TTL" não liberarão nenhum espaço em disco até que o SSTable que contém os registros com o TTL mais antigo expire.
No entanto, eu não estava totalmente confiante sobre isso, especialmente porque ambos os SSTables não contêm essencialmente nada que deveria estar obscurecendo um ao outro. Como tal, não acredito que deva haver uma razão lógica para que essas tabelas não sejam removidas do disco. Além disso, também considerei a possibilidade de dados TTL mais antigos e mais recentes serem misturados na SSTable mais antiga. Presumi que isso também se comportaria da mesma forma. Em geral, as dúvidas permaneceram. Como tal, queria validar esta conclusão.
Resumindo: com o TWCS, a remoção do disco de um novo registro com TTL mais baixo será bloqueada por qualquer registro mais antigo com TTL mais alto residente em uma SSTable diferente?