Backup/Restore no Cassandra
Olá pessoal. Vamos falar de um tema importante hoje, um salva-vidas (ou emprego, pelo menos). 🙂
Cassandra é um dos banco de dados mais tolerantes a problemas de infraestrutura, não possui ponto único de falha. Se bem configurado, você pode perder um Datacenter inteiro e ele continua operando normalmente. O dado pode ser replicado para múltiplos nodes, em múltiplos DCs. Porém, esta alta disponibilidade (verdadeira, diga-se de passagem) às vezes nos induz a pensar que o backup é dispensável.
De fato, para a maioria dos problemas cotidianos (falha de discos/servers/rede) ele é sim redundante, mas para os casos abaixo vamos precisar.
- Aplicação alterando dados errados
- Deleção acidental
- Perda do cluster inteiro
Então, hoje vamos falar um pouco de como fazer backup e restore no Cassandra. Em termos de backup, o Cassandra não é tão avançado quanto um banco de dados relacionais. Ser um banco de dados distribuído traz mais desafios.
Nativamente o Cassandra nos permite fazer snapshots e é dele que vamos falar. Basicamente é um hardlink de todas as SSTables para o próprio diretório onde estão os dados. É uma característica dos hardlinks, como apontam para o mesmo inode, estarão no mesmo disco/volume.
Realizei uma pequena carga de dados, utilizando o cassandra-stress e tenho cerca de 20 MB de dados em cada node.
Vamos lá. Esta é a minha estrutura atual, tenho uma keyspace bonacs e uma tabela users:
├── bonacs
│ └── users-1d779980f30a11e8b44c6735184b4d84
│ ├── aa-5-bti-CompressionInfo.db
│ ├── aa-5-bti-Data.db
...
│ ├── aa-5-bti-TOC.txt
│ └── backups
Vou criar um snapshot em um dos nodes. Porém, lembre-se que para ter maior consistência (eventual), é necessário tirar snapshot simultaneamente em todos os nodes, via crontab ou um ssh em paralelo, por exemplo.
[cassandra@ip-172-31-19-113 bonacs]$ nodetool snapshot bonacs
Requested creating snapshot(s) for [bonacs] with snapshot name [1543419630027] and options {skipFlush=false}
Snapshot directory: 1543419630027
Antes de realizar o snapshot propriamente dito, o Cassandra faz um flush das MemTables para disco e então vemos que uma nova pasta foi criada, chamada snapshot.
└── users-1d779980f30a11e8b44c6735184b4d84
├── aa-5-bti-CompressionInfo.db
├── aa-5-bti-Data.db
...
├── aa-6-bti-TOC.txt
├── backups
└── snapshots
└── 1543419630027
├── aa-5-bti-CompressionInfo.db
├── aa-5-bti-Data.db
...
├── aa-6-bti-TOC.txt
├── manifest.json
└── schema.cql
Você pode confirmar que se tratam de um hardlink, apontando para o mesmo inode:
Vou criar os snapshots nos meus quatro nodes “simultaneamente” com 4 janelas do meu terminal.
Bom, esta é a parte fácil. Agora vamos ver como podemos restaurar nosso backup. Para isso vamos simular nosso desastre, com um truncate.
Vamos confirmar em todos os nodes:
Um importante detalhe é que o Cassandra só vai permitir voltar o backup se o schema existir (Keyspaces e tabelas), portanto você deve ter também o DDL que recria seu schema. Para nossa sorte, automaticamente ele guarda o DDL de criação das tabelas junto com os snapshots, mas nunca é demais você também ter o seu.
Agora que não temos mais nada na nossa tabela, vamos copiar nosso snapshot para seu caminho original. Vou colocar o caminho completo para maior clareza. E lembre-se de fazer o mesmo em todos os nodes.
[cassandra@ip-172-31-17-26 ~]$ cp /u00/cassandra/data/bonacs/users-1d779980f30a11e8b44c6735184b4d84/snapshots/1543437632011/aa-* /u00/cassandra/data/bonacs/users-1d779980f30a11e8b44c6735184b4d84
Feito isso, precisamos executar o comando abaixo também em todos os nodes.
$ nodetool refresh bonacs users
Após isso, nossos dados estarão lá novamente.
Para finalizar, podemos listar e eliminar nossos snapshots via nodetool. Faremos isso em todos os nodes. É possível eliminar um a um, informando o nome ou todos de uma vez.
Era isso, um passo a passo de como realizar um backup e um restore de forma simples no Cassandra. Espero que tenha ajudado.
Até a próxima. Dúvidas? Comente aí.
Abraço.