Conheça o Apache Cassandra
- Postado por Adriano Bonacin
- Categorias cassandra
- Data 23/06/2023
- Comentários 0 comentário
Introdução
Você já conhece o banco de dados Cassandra? Vamos contar um pouco de sua arquitetura e casos de uso. No nosso blog você encontrará alguns artigos relacionados, mas faremos um passeio por todas as suas características e ferramentas de apoio.
O Cassandra é famoso por ter sido desenvolvido dentro do Facebook, baseado na arquitetura DynamoDB (Amazon) e do modelo de dados do BigTable (Google). Três gigantes da tecnologia deram força para esse NoSQL que vamos discutir agora.
O que é?
Podemos dizer que o Cassandra é um NoSQL da família Wide Store embora comumente seja chamado de banco colunar. A princípio vamos só dizer que ele não é um banco colunar no sentido de trocar linhas por colunas como a gente ouve falar por aí e com o desenvolver dos artigos vamos entender melhor esse ponto. Você pode dar uma olhada nesta definição que o ScyllaDB e a Wikipedia trazem.
Um ponto importante: não use Cassandra para OLAP como você faria como o Amazon Redshift ou Google BigQuery.
Ele tem uma linguagem própria, um pouco diferente do SQL tradicional, por que ele não atende a todos os requisitos do padrão SQL, como Joins. A linguagem é chamada CQL (Cassandra Query Language) e é facilmente compreendida por quem fala SQL fluente, o que torna mais fácil trabalhar com o Cassandra. Poderíamos dizer que o CQL é uma versão muito reduzida do SQL. Se você conhece SQL muito provavelmente você não terá dificuldades CQL. O único ponto é saber o que o Cassandra não faz e que um banco de dados relacional faz.
Sempre trabalhamos com clusters, sendo quase proibitivo ambientes stand alone. Com isso conseguimos dar alta disponibilidade ao ambiente ao mesmo tempo que escalamos horizontalmente.
Open Source
O Cassandra foi desenvolvido internamente no Facebook, por um dos criadores do DynamoDB. Em 2008 seu código foi aberto à comunidade e em 2009 ele passou a ser um projeto Apache.
Isso quer dizer que você pode ver o código fonte do cassandra no github. Já escrevemos este artigo sobre como compilar o código fonte e rodar sua própria versão do Cassandra.
Características de sua arquitetura
Ele é um banco de dados distribuído, multi primary, bem resistente a falhas, com consistência ajustável. Vários termos interessantes, que vemos quase cotidianamente e que talvez nem precisássemos falar a respeito. Mas vamos brevemente discutir cada um destes pontos.
Banco de dados distribuído refere-se ao fato de que em um cluster todos os nodes são similares, executando a mesma função. Cada node é responsável por parte dos dados e recebe escritas e leituras. Não temos aquela estrutura primary-secondary tradicional em outros DBs, aqui todo mundo é primary.
O fato de ser resistente à falha é algo que o Cassandra herdou do DynamoDB. O DynamoDB (e consequentemente o Cassandra) foi construído para ser always writable. Se temos um cluster de 10 nodes e perdemos um node, qualquer outro node pode processar a requisição em seu lugar. Estas escritas ficam armazenadas em uma estrutura chamada hinted handoff, que merece um artigo inteiro para os detalhes. Estas escritas são então entregues para o node caso ele volte a vida. Além disso, normalmente o dado é replicado para outros nodes, que podem servir a leituras em caso de um node em falha. O número de réplicas é controlado pelo atributo Replication Factor das Keyspaces (falaremos disso mais tarde, mas é como um database em um mysql ou mongodb).
E nessa linha de réplicas a gente entra no tema consistência ajustável. Ainda sobre a tolerância a falhas, há casos em que não conseguimos manter tudo igual em todas as réplicas. Por default um node armazena hints handoff por 3 horas. Um node down por mais de 3 horas pode ser um problema pois ele vai perder parte das escritas. Para nossa sorte o Cassandra já vem com uma funcionalidade que repara estes problemas, mas o repair (como chamamos esse processo de sincronizar as réplicas) também é assunto para um ou mais artigos, dado sua importância.
Agora que entendemos a origem de um dos problemas que causam uma bagunça nos dados (um de muitos, acredite) começa a fazer sentido a necessidade de controlar a consistência de leitura e escrita. Você pode querer escrever em apenas um node e deixar que a replicação seja feita (async). Em uma fração de segundos você pode consultar esse dado em outro node e ele estará replicado. Mas e se o node que receber a escrita falhar antes de replicar seu dado? Sim, pode acontecer e nesse caso você perde sua escrita. Aí entra o tema consistência (oba! Tema para mais um artigo). Em uma forma reduzida podemos dizer que o cliente tem a opção de escolher quantas réplicas ele deseja envolver na sua requisição: apenas uma, a maioria, a maioria em um datacenter (a mais comum), todas. Enfim, o cliente é quem manda.
Query Driven
Uma outra característica marcante do Cassandra é ser Query Driven. Essa é a parte que mais dói quando trocamos o mundo relacional pelo Cassandra. Nativamente ele é zero flexibilidade nas queries, se sua tabela foi desenvolvida para buscar compras por id_compra você não consegue fazer buscas por id_cliente. Há features para contornar? Sim. É recomendável seu uso? Não.
Então essa característica do Cassandra precisa ser nosso ponto de partida: quando vamos criar uma tabela ela precisa ter uma Partition Key (PK) (mais um artigo aqui). Essa PK determina em qual node nosso dado vai resistir. Por isso é importante e obrigatório na sua query você informar a PK, assim o Cassandra saberá em qual node buscar seu dado. Qualquer coisa diferente disso vai fazer o Cassandra buscar seu dados em todos os nodes. Eu disse todos os nodes. Se um temido Full Table Scan (FTS) em um Oracle nos assusta, imagine aqui um FTS em todos os nodes.
Por enquanto vamos assumir ficar nessa introdução e quando chegar o momento falaremos mais disso.
Conclusão
É muita coisa para falar, vou deixar casos de uso e casos de não uso para o próximo artigo. E é importante você tomar cuidado para não usar o Cassandra de forma errada. Ele é zero flexibilidade, ele não gosta de alterar ou deletar linhas. Explico tudo no próximo artigo.
Espero que tenham gostado e qualquer dúvida, você pode comentar aqui ou nos procurar nas redes sociais.