🎯 ATIVIDADE 09 — ESCALA PLANETÁRIA
Para realizar este laboratório com sucesso, certifique-se de ter compreendido os conceitos apresentados no:
👉 CAPÍTULO 09: MAPEAMENTO MER-RELACIONAL E ÁLGEBRA
Bem-vindo à nona semana (4 aulas) do curso de Banco de Dados. Após explorarmos o MongoDB, vamos subir o nível de escala. Hoje vamos conhecer o Apache Cassandra, o banco de dados utilizado por gigantes como Netflix e Uber para lidar com bilhões de transações por segundo. 🛡️🧩
🎯 Objetivos de Aprendizagem do Laboratório
Ao final deste laboratório prático (estimativa: 4 horas presenciais / autoguiadas), você será capaz de:
- Entender a arquitetura de Colunas de Larga Escala (Wide Column Store).
- Criar e gerenciar Keyspaces e Tabelas no Cassandra.
- Utilizar a linguagem CQL (Cassandra Query Language).
- Compreender a importância da Chave de Partição para a escalabilidade.
🏢 O Cenário Prático (Seu Desafio)
A TecProExpress instalou sensores IoT em toda a sua frota de caminhões. Cada caminhão envia sua posição GPS, velocidade e temperatura da carga a cada 5 segundos. Com milhares de veículos, o volume de dados é gigantesco.
Seu desafio é configurar um ambiente no Cassandra para receber esse fluxo de dados, garantindo que as informações sejam gravadas de forma ultra-rápida e nunca sejam perdidas.
🧠 Fundamentos: A Teoria Traduzida
O Cassandra não organiza dados em uma única máquina; ele os espalha por um Anel (Cluster) de servidores.
1. O Keyspace (O Condomínio)
No SQL temos "Databases". No Cassandra, temos Keyspaces. É aqui que definimos como os dados serão replicados entre as máquinas.
2. A Chave de Partição (O Endereço)
Imagine um grande armazém. Para achar uma caixa rápido, você precisa saber o número da prateleira. No Cassandra, a Partition Key decide em qual servidor do mundo o dado será guardado.
graph TD
subgraph Cluster ["Anel Cassandra"]
N1[Nó 1] --- N2[Nó 2]
N2 --- N3[Nó 3]
N3 --- N1
end
Data[Dado de GPS] -->|Hash da Chave| N2
style Cluster fill:#f3e5f5,stroke:#7b1fa2
📖 Exemplo Guiado: Criando sua Infraestrutura
Veja como o CQL é amigável e parecido com o SQL tradicional.
💡 Os blocos abaixo usam CQL (Cassandra Query Language), sintaticamente parecido com SQL mas com diferenças importantes de modelagem — usamos o realce de sintaxe SQL por não haver um fence dedicado para CQL neste portal.
1. Preparando o Terreno (Keyspace)
-- Criando o Keyspace de Logística
CREATE KEYSPACE tecpro_logistica
WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
USE tecpro_logistica;
2. Criando a Tabela de Sensores (DDL)
CREATE TABLE telemetria (
veiculo_id INT,
data_hora TIMESTAMP,
latitude DECIMAL,
longitude DECIMAL,
velocidade FLOAT,
PRIMARY KEY (veiculo_id, data_hora)
);
🔍 Detalhamento do Código:
- SimpleStrategy: Estratégia de replicação para ambientes de teste (um único datacenter).
- PRIMARY KEY (veiculo_id, data_hora):
veiculo_id: Chave de Partição (espalha os caminhões pelo cluster).data_hora: Chave de Agrupamento (ordena os logs de cada caminhão por tempo).
🛠️ Prática Obrigatória 1: Setup e Carga
Cenário: Monitoramento de Frota na TecProExpress.
- Acesse seu ambiente Cassandra (via Docker ou local).
- Crie o Keyspace
tecpro_iot. - Crie a tabela
status_caminhaopara armazenarid,placa,temperaturaedata_leitura.
🚀 Script de Seed (CQL)
INSERT INTO status_caminhao (id, placa, temperatura, data_leitura)
VALUES (101, 'ABC-1234', 5.5, toTimestamp(now()));
INSERT INTO status_caminhao (id, placa, temperatura, data_leitura)
VALUES (101, 'ABC-1234', 5.2, toTimestamp(now()));
💻 Execução de Queries no Terminal CQL (cqlsh) & Logs
Para testar consultas sequenciais particionadas via terminal cqlsh:
-- Consultando séries temporais ordenadas fisicamente no disco
SELECT id, placa, temperatura, data_leitura
FROM tecpro_iot.status_caminhao
WHERE id = 101
LIMIT 2;
🖥️ Saída Esperada no Terminal do cqlsh:
id | data_leitura | placa | temperatura
-----+---------------------------------+----------+-------------
101 | 2026-03-01 14:22:05.120000+0000 | ABC-1234 | 5.2
101 | 2026-03-01 14:22:00.080000+0000 | ABC-1234 | 5.5
(2 rows)
🌐 Requisição cURL para Ingestão de Telemetria Time-Series (Swagger /docs)
curl -X POST "http://127.0.0.1:8000/api/v1/telemetria/iot" \
-H "Content-Type: application/json" \
-d '{
"veiculo_id": 101,
"placa": "ABC-1234",
"temperatura_celsius": 5.2,
"velocidade_kmh": 78
}'
🔹 Resposta JSON:
{
"status": "REGISTRADO_NO_CLUSTER",
"partition_key": "101",
"replication_factor": 3
}
📤 Instruções de Entrega (Microsoft Teams)
Após testar suas tabelas e consultas no Cassandra (via cqlsh):
- Salve o script contendo a criação do Keyspace, da tabela com a Primary Key adequada (Chave de Partição + Chave de Agrupamento) e as consultas de teste em um arquivo com a extensão
.cqlou.sqlcontendo comandos CQL. - Adicione comentários no código explicando por que a escolha da Partition Key (
veiculo_id/id) é vital para a distribuição horizontal de dados do cluster. - Envie o arquivo (
Atividade_09_SeuNome.cql) na tarefa correspondente no Microsoft Teams.
💡 Checkpoint de Lógica
Reflexão Profissional: No Cassandra, nós desenhamos as tabelas com base nas perguntas que vamos fazer (Query-Driven Design). Se você tentar filtrar por algo que não faz parte da chave primária, o Cassandra pode recusar a consulta para não perder performance. 🧠🛡️
🔥 Desafio de Fixação (Opcional)
Nível: Arquiteto de Sistemas 🏆
O que é o Replication Factor (RF)? Se você configurar RF: 3 em um cluster de 5 máquinas, o que acontece se duas máquinas pegarem fogo ao mesmo tempo?
🔑 Gabarito de Código/Fórmulas Completo
Prática 1 (Criação):
CREATE TABLE status_caminhao (
id INT,
placa TEXT,
temperatura FLOAT,
data_leitura TIMESTAMP,
PRIMARY KEY (id, data_leitura)
) WITH CLUSTERING ORDER BY (data_leitura DESC);
Prática 2 (Consulta):
SELECT * FROM status_caminhao WHERE id = 101;
🔍 Explicação do Gabarito:
- WITH CLUSTERING ORDER BY: Faz com que os logs mais recentes apareçam no topo da lista automaticamente, sem precisar de um
ORDER BYlento na hora da consulta. - TEXT: No Cassandra, usamos
TEXTem vez deVARCHARpara a maioria das strings.
📊 Rubrica Formativa de Avaliação
| Critério de Avaliação | Insuficiente (0% - 40%) | Regular (41% - 70%) | Excelente (71% - 100%) |
|---|---|---|---|
| Design Orientado a Consultas (Query-Driven) | Modela tabelas sem considerar as chaves de partição do Cassandra. | Define a Partition Key mas sem declarar a Clustering Key para ordenação física. | Modelagem CQL impecável com Partition Key (distribuição) e Clustering Key (ordenação temporal) com `WITH CLUSTERING ORDER BY`. |
| Arquitetura de Cluster & Distribuição | Omite justificativas de distribuição de dados e Replication Factor. | Explica o funcionamento do cluster de forma superficial. | Comentários ricos explicando a importância da Partition Key para a performance de gravação distribuída. |
| Entrega do Script CQL | Entrega script com erros de sintaxe no `cqlsh`. | Script entregue mas fora do padrão `.cql`. | Submete `Atividade_09_SeuNome.cql` com Keyspace e tabelas devidamente testados. |