📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Módulo 08: Bancos de Dados SQL e NoSQL. Recomendado revisar antes de começar.
v1.0 — Modelagem Query-Driven, Chaves Compostas e Expiração Nativa com TTL
Trilha de Engenharia de Dados & Bancos de Dados — Projeto 6 de 10
- v1: Modelagem Relacional 3FN · PostgreSQL 16
- v2: Modelagem NoSQL · MongoDB 7.0
- v3: Estratégias de Cache · Redis 7.2
- v4: DBA Enterprise · Particionamento & RLS · PostgreSQL 16
- v5: Modelagem Visual EER & Stored Procedures · MySQL 8.0
- ➡️ v6 (este): Séries Temporais IoT · Apache Cassandra 5.0
- v7: Prontuário Objeto-Relacional & JSONB · PostgreSQL 16
- v8: Rastreamento de Fraudes em Grafos · Neo4j 5.x
- v9: Data Warehouse & Consultas OLAP · PostgreSQL 16
- v10: Persistência Poliglota Integrada · Postgres + Mongo + Redis
🎓 Nível Profissional Simulado: Data Engineer / Distributed Systems Specialist. Em sistemas de telemetria agroindustrial com dezenas de milhares de sensores emitindo dados a cada 5 segundos, a arquitetura distribuída do Cassandra (LSM Trees sem master) garante vazão massiva de escrita e consultas rápidas por partição.
Desenvolver um modelo de dados colunar orientado a consultas (Query-Driven Modeling) no Apache Cassandra 5.0 para monitoramento de sensores ambientais em silos de grãos, utilizando Chave de Partição Composta ((silo_id, data_leitura), horario), ordenação física em disco (Clustering Order) e expiração de dados com TTL de 60 dias.
graph TD
classDef ring fill:#1A365D,stroke:#63B3ED,stroke-width:2px,color:#fff;
classDef part fill:#2A4365,stroke:#90CDF4,stroke-width:1px,color:#fff;
classDef row fill:#2C5282,stroke:#BEE3F8,stroke-width:1px,color:#fff;
Ring["🪐 Cassandra Ring (Cluster Distribuído)"]:::ring
Ring --> P1["📦 Partição: (silo_1, '2026-08-27')"]:::part
Ring --> P2["📦 Partição: (silo_1, '2026-08-28')"]:::part
Ring --> P3["📦 Partição: (silo_2, '2026-08-27')"]:::part
P1 --> R1["🕒 23:59:00 | 24.5°C | 13.2% | CO2: 410 (TTL: 60d)"]:::row
P1 --> R2["🕒 23:58:00 | 24.6°C | 13.1% | CO2: 412 (TTL: 60d)"]:::row
“Nossos 200 silos armazenam milhões de toneladas de soja e milho. Se a umidade subir ou a temperatura passar de 28°C, os grãos fermentam e o prejuízo é milionário. Temos sensores de temperatura, umidade e CO2 enviando dados sem parar. O banco antigo travava na hora de gravar tantos registros. Precisamos de um banco que suporte milhares de gravações por segundo e que delete automaticamente os dados antigos após 60 dias sem precisar de rotinas pesadas de limpeza.”
| ID | Tipo | Descrição | Origem no Briefing |
|---|---|---|---|
| RF01 | Funcional | Gravar leituras de sensores com precisão de timestamp e status de alerta. | “sensores enviando dados sem parar” |
| RF02 | Funcional | Permitir busca instantânea das medições de um silo em um determinado dia ordenadas da mais recente para a mais antiga. | “monitorar temperatura e umidade” |
| RF03 | Funcional | Auto-expiração das medições após 60 dias utilizando a diretiva nativa USING TTL. |
“delete automaticamente após 60 dias” |
| RNF01 | Não-Funcional | Modelagem Query-Driven: 1 consulta = 1 partição física (zero scans de cluster). | Performance Distribuída |
| RNF02 | Não-Funcional | Arquitetura colunar Masterless com tolerância a falhas e alta disponibilidade. | Confiabilidade de Safra |
| ID | User Story | Prioridade |
|---|---|---|
| US01 | Como sensor IoT, quero persistir medições em milissegundos sem sofrer bloqueio de tabela. | Alta |
| US02 | Como agrônomo, quero consultar a curva térmica de um silo em 24h para antecipar focos de calor. | Alta |
| US03 | Como arquiteto de infraestrutura, quero que os dados expirem via TTL economizando espaço em disco. | Média |
# Branch da funcionalidade
git checkout -b feature/US01-cassandra-timeseries
# Subir o Cassandra isolado via Docker
docker-compose up -d
# Conectar no console cqlsh
docker exec -it db_cassandra_agro cqlsh -u cassandra -p cassandra
cql/01_schema_keyspace.cql)CREATE KEYSPACE IF NOT EXISTS agrosense
WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
CREATE TABLE IF NOT EXISTS agrosense.telemetria_silo (
silo_id uuid,
data_leitura date,
horario timestamp,
temperatura_graos double,
umidade_relativa double,
nivel_co2 double,
status_alerta text,
PRIMARY KEY ((silo_id, data_leitura), horario)
) WITH CLUSTERING ORDER BY (horario DESC);
No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:
cd db_nosql_06_cassandra_timeseries
docker-compose up -d
# Executar a suíte de testes automatizados:
python -m unittest tests/test_cassandra_timeseries.py
[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar:
cd catalogo_projetos/db_nosql_06_cassandra_timeseries
-- Inserir telemetria com TTL
INSERT INTO agrosense.telemetria_silo (
silo_id, data_leitura, horario, temperatura_graos, umidade_relativa, nivel_co2
) VALUES (
550e8400-e29b-41d4-a716-446655440000,
'2026-08-27',
toTimestamp(now()),
24.5, 13.2, 410.0
) USING TTL 5184000;
-- Consultar exatamente a partição do dia
SELECT horario, temperatura_graos, umidade_relativa
FROM agrosense.telemetria_silo
WHERE silo_id = 550e8400-e29b-41d4-a716-446655440000
AND data_leitura = '2026-08-27';
A arquitetura abaixo demonstra o fluxo de persistência, otimização e isolamento dos componentes na subpasta cql/:
flowchart TD
subgraph DDL["Modelagem & Schema (DDL)"]
S1["Tabelas / Coleções"] --> S2["Constraints & Índices"]
end
subgraph DML["Regras & Automação (DML / PL)"]
R1["Triggers / Aggregations"] --> R2["Procedimentos Transacionais"]
end
subgraph Perf["Otimização & Armazenamento"]
P1["Planos EXPLAIN / Partições"] --> P2["Garantia de ACID / TTL"]
end
subgraph Homolog["Homologação & Qualidade"]
Q1["Docker Compose & Scripts"] --> Q2["Checkpoints CP-01..05 PASS"]
end
DDL --> DML
DML --> Perf
Perf --> Homolog
style DDL fill:#e3f2fd,stroke:#1976d2,stroke-width:1.5px
style DML fill:#fffde7,stroke:#fbc02d,stroke-width:1.5px
style Perf fill:#e8f5e9,stroke:#388e3c,stroke-width:1.5px
style Homolog fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1.5px
| ID | Persona | História de Usuário | Critério de Aceite | Prioridade |
|---|---|---|---|---|
| US-01 | Engenheiro de IoT | Desejo ingerir milhões de telemetrias de sensores por segundo | Modelagem orientada a consultas (query-driven) com partição por sensor_id e data | Alta |
| US-02 | Arquiteto de Dados | Desejo chave primária composta com partition key e clustering column | Ordenação física por timestamp em disco permitindo range queries instantâneas | Alta |
| US-03 | Analista de Monitoramento | Desejo consultar métricas de temperatura em janelas de tempo sem ALLOW FILTERING | Queries restritas à partição garantindo latência O(1) de acesso | Alta |
| US-04 | Administrador de Cluster | Desejo políticas de retenção com TTL automático por registro | Configuração de TTL descartando leituras antigas sem necessidade de DELETE | Média |
| US-05 | Auditor de Escala | Desejo testes simulando ingestão concorrente em massa com validação CQL | Suíte de testes automatizados com Cassandra Driver validando consistência LOCAL_QUORUM | Média |
| ID | Descrição do Requisito | Criticidade |
|---|---|---|
| RF-01 | Esquema CQL otimizado para séries temporais com clustering columns | Alta |
| RF-02 | Estratégia de particionamento temporal evitando hotspots no anel de nós | Alta |
| RF-03 | Uso de TTL (Time to Live) declarativo na inserção de métricas de telemetria | Alta |
| RF-04 | Consultas analíticas por intervalo de tempo totalmente indexadas na partição | Média |
| RF-05 | Scripts CQL versionados e testes de carga automatizados | Média |
| ID | Especificação Arquitetural | Criticidade |
|---|---|---|
| RNF-01 | Throughput de escrita sustentada de alta performance com append-only CommitLog | Alta |
| RNF-02 | Latência de leitura por intervalo inferior a 15ms no nó primário | Alta |
| RNF-03 | Consistência configurável (QUORUM / LOCAL_QUORUM) sem SPOF | Alta |
| RNF-04 | Compatibilidade com Apache Cassandra 4.0 / 5.0 | Média |
| RNF-05 | Artefatos de schema organizados na pasta cql/ | Alta |
| User Story | Requisito Funcional | Requisito Não-Funcional | Módulo / Artefato de Código | Status de Homologação |
|---|---|---|---|---|
| US-01 | RF-01 |
RNF-01, RNF-04 |
cql/01_keyspace_schema.cql |
Testado |
| US-02 | RF-02 |
RNF-01, RNF-02 |
cql/01_keyspace_schema.cql |
Testado |
| US-03 | RF-04 |
RNF-02, RNF-05 |
cql/02_queries.cql |
Testado |
| US-04 | RF-03 |
RNF-01, RNF-04 |
cql/02_queries.cql |
Testado |
| US-05 | RF-05 |
RNF-03, RNF-05 |
tests/test_cassandra.py |
Testado |
| Checkpoint | Escopo da Validação | Artefato Verificado | Status |
|---|---|---|---|
| CP-01 | Subida Conteinerizada do Ambiente | docker-compose.yml |
PASS ✅ |
| CP-02 | Criação de Estrutura & Schemas | cql/ |
PASS ✅ |
| CP-03 | Automação Transacional & Regras | Triggers / Queries |
PASS ✅ |
| CP-04 | Otimização de Performance & Índices | Indexes / Tuning |
PASS ✅ |
| CP-05 | Homologação com Suíte de Testes | tests/ |
PASS ✅ |