Entendendo Escrita, Leitura e Consistência no Cassandra 3.0

Pessoal,

Como estão?


No artigo de hoje quero trazer um entendimento sobre escrita, leitura e consistência no banco Apache Cassandra.


Vamos começar pela escrita. Como acontece a escrita no banco de dados Cassandra:

1 - Escrita no Cassandra

  • Escreve primeiro em um registro "log" (para maior durabilidade);
  •  Depois escreve em uma estrutura de tabela na memória denominada por memtable.

Quando o conteúdo da memtable exceder um limite configurável, os dados da memtable, é colocado em uma fila para ser descarregado para o disco.  Você pode configurar o tamanho da fila, alterando: memtable_flush_queue_size no cassandra.yaml. Escritas são agrupadas na memória e periodicamente gravadas em disco. No disco é gravada em uma tabela SSTable (sorted string table).

Uma linha normalmente é armazenada em vários arquivos SSTable.

A escrita é bem-sucedida uma vez que é escrita no log e na memória, gerando o mínimo de I/O no disco no momento de gravação. Cada SSTable tem um filtro Bloom (estrutura em memória) associado a ele que verifica se uma chave de linha solicitada existe no SSTable antes de fazer qualquer busca no disco.

Todas escritas são gravadas na memtable e no commit log no disco antes de serem reconhecidas como sucesso. Se ocorrer uma queda ou falha do servidor antes da memtable ser flushed,  o commit log  é repetido ao reiniciar para recuperar escritas perdidas.

Veja o exemplo abaixo:

Quando você deletar no cassandra, não é eliminada imediatamente, em vez disso existe um marcador chamado tombstone que escreve um novo estado para essa coluna (morta). As colunas marcadas como mortas, após por um período de tempo que é configurado (gc_grace_second) são permanentemente eliminadas.

2 - Leitura no Cassandra

O Cassandra realiza leituras aleatórias em paralelo em SSD's com latência extremamente baixa. Discos rotacionais não são recomendados.

O Cassandra verifica primeiro o Bloom filter. Cada SSTable tem um Bloom filter associado a ela que verifica se algum dado da linha solicitada existe na SSTable antes de fazer qualquer E/S de disco.

Em seguida, o Cassandra checa o key cache global. Se os dados solicitados não estão no key cache, é feita uma busca binária no index summary para encontrar uma linha. Finalmente, o Cassandra realiza um simples seek e uma leitura sequencial de colunas no SSTable se as colunas forem contíguas, e retorna o conjunto de resultados.

Veja a imagem abaixo:


Quando uma requisição de leitura de uma row chega a um nó, a row tem de ser combinada a partir de todas as SSTables nesse nó que contêm as colunas row em questão, bem como de quaisquer memtables unflushed, para produzir os dados solicitados.

Veja abaixo um exemplo do caminho de leitura realizado pelo Cassandra:

3 - Consistência no Cassandra

Quando você faz uma gravação por exemplo em Cassandra, o nível de consistência especifica em quantas réplicas a escrita deve ser bem-sucedida antes de retornar um reconhecimento para o aplicativo do cliente. QUORUM  é  um  bom  meio  termo  garantindo  a consistência forte.  O quorum é calculado como: ( replication_factor  /  2 )  +  1.

Alguns Níveis de Consistência na Escrita

One: A gravação deve ser gravado no log de confirmação e na tabela de memória de pelo menos um nó réplica.

Two: A gravação deve ser escrito no log e na tabela de memória de pelo menos dois nós de réplica.

Three: A gravação deve ser escrito no log de e na tabela de memória de pelo menos dois nós de réplica.

QUORUM: A gravação deve ser gravada no log de confirmação e tabela de memória em um quorum de nós de réplica.

ALL: A gravação deve ser gravado no log de confirmação e tabela de memória em todos os nós do cluster de réplica para  essa chave de linha. 

Exemplo CQL:


CONSISTENCY ALL;
INSERT INTO Alunos(nome,matrícula) VALUES   ('FFFF',   65535) ;

Alguns Níveis de Consistência na Leitura

O  nível  de  consistência  na leitura especifica  quantas  réplicas  devem responder antes de retornar o resulta para o cliente. O  Cassandra  então  escolhe  pelo  timestamp    o  dado  mais  recente  entre as réplicas que responderam.

ONE: Retorna uma resposta pela réplica mais próxima (determinada pelo snitch). Por default, um read-repair é executa no plano de fundo para dar consistência a outras réplicas.

TWO: Retorna o dado mais recente das duas réplicas mais próximas.

THREE: Retorna o dado mais recente das três réplicas mais próximas.

QUORUM: Retorna o dado mais recente depois que um quorum de réplicas responder.

ALL: Retorna o dado mais recente depois que todas as réplicas responderem. A leitura falha se uma réplica não responder

Exemplo CQL:


CONSISTENCY THREE;
SELECT    *    FROM    Alunos    where    matricula    =    999 ;

Abraço,

Ronaldo

Nenhum comentário:

Postar um comentário