O documento discute estratégias de modelagem de dados no Apache Cassandra, incluindo modelagem orientada por consulta, séries temporais e particionamento de dados. O palestrante apresenta exemplos de como modelar dados para diferentes casos de uso e discute considerações importantes como validar o modelo de dados e respeitar os limites físicos de particionamento.
2. pen4education
Quem sou eu?
• Arquiteto de software e Coordenador de TI na Movile
• Apache Cassandra Developer 1.1 Certified (2013)
• Apache Cassandra MVP (2014/2015 e 2015/2016)
• Apache Cassandra Contributor (2015)
• Cassandra Summit Speaker (2014 e 2015)
• Cassandra Summit Reviewer (2016)
Eiti Kimura
eitikimura
6. pen4education
Agenda
Linguagem de Manipulação de Dados (CQL)
• Estratégias de Modelagem de Dados
• Direcionada por Consulta (Query Driven)
• Séries Temporais (Time Series)
• Particionamento de Dados (Buckets)
• Considerações Finais
7. pen4education
Cassandra Query Language
• Linguagem familiar (lembra o SQL)
• Criação de Objetos via DDL (ex.: CREATE, DROP)
• Suporta principais comandos DML
• Consulta com comando: SELECT
SELECT * FROM users;
SELECT * FROM users WHERE login = 'scott';
SELECT * FROM users WHERE birth_date > '1980-01-01';
9. pen4education
Modelagem (Query-Driven)
● Qual o fluxo de dados da sua aplicação?
● Como você vai acessar os dados?
● Saber as consultas de antemão NÃO é opcional!
● É diferente do banco relacional, pois não é
somente fazer um novo join para ter uma nova
consulta
12. pen4education
Modelagem (Query Driven)
Tome nota!
• Cada consulta (query) tem uma tabela
correspondente
• Tabelas são modeladas para que as consultas
executem corretamente
• Tabelas retornam dados pré-ordenados
13. pen4education
Desnormalização
Melhor duplicar os dados do que ter que fazer uma junção (join)
Dados podem ser duplicados ao longo de tabelas e partições
Dados desnormalizados são mais escaláveis
14. pen4education
Atributos do tipo Coleções
Atributos multivalorados
Tipos de atributos multivalorados ou estruturas de dados
complexas:
• List: uma lista encadeada
• Set: um conjunto com garantia de valores únicos
• Map: um dicionário de dados
15. pen4education
Exemplos: Collections
CREATE TABLE users (
user_id text,
name text,
emails set<text>,
PRIMARY KEY (user_id)
);
INSERT INTO users (user_id, name)
VALUES ('frodo', 'Frodo Bolseiro');
UPDATE users SET emails = {'frodo@movile.com'}
WHERE user_id = 'frodo';
UPDATE users SET emails = emails + {'frodo@gmail.com'}
WHERE user_id = 'frodo';
16. pen4education
Use coleções com cautela
Atributo multivalorado
Usado para desnormalizar ou armazenar uma pequena
quantidade de dados:
● telefones de um usuário
● labels para um e-mail
● tags de conteúdos em geral (e-mail, música, video)
17. pen4education
Cuidado com Collections
● Coleções possuem limitação de
tamanho, máximo de 64K
● Coleções grandes geram consultas mais
lentas
● Atualizações de coleções geram Tombstones
19. pen4education
Time Series
• Modelo de dados vindo do BigTable
• Uma chave (row-key) e um agrupamento de colunas (variáveis)
• Design único no disco
Row Key Column Name
Column Value
...
Column Name
Column Value
Column Name
Column Value
Timestamp Timestamp Timestamp
20. pen4education
Estação coleta dados ao longo do tempo
Cassandra armazena os dados em forma sequencial
Estação
Metereológica Cluster Cassandra
Aplicação
21. pen4education
Caso de uso
Consultas Necessárias (pré-modelagem)
• Todos os dados de uma estação
• Dados para uma Data e Hora
• Obter dados por uma faixa de data e hora
Modelo de armazenamento
• Armazenar dados por estação
• Armazenar série temporal ordenada
22. pen4education
Modelo de Dados (CQL)
INSERT INTO temperature (wstation_id, event_time, temp) VALUES (1, '2016-07-07 15:24', '20C');
INSERT INTO temperature (wstation_id, event_time, temp) VALUES (1, '2016-07-08 15:35', '19C');
INSERT INTO temperature (wstation_id, event_time, temp) VALUES (2, '2016-07-08 12:10', '22C');
INSERT INTO temperature (wstation_id, event_time, temp) VALUES (2, '2016-07-08 12:11', '23C');
CREATE TABLE temperature (
wstation_id int,
event_time timestamp,
temp text,
PRIMARY KEY (wstation_id, event_time)
);
Inserção de dados, granularidade de minutos
Identificador da estação e a data do evento são únicos
23. pen4education
Modelo de Armazenamento
Visão Lógica
SELECT wstation_id, event_time, temp
FROM temperature
WHERE wstation_id = 1;
wstation_id event_time
2016-07-08 15:20
temp
22C1
2016-07-08 15:21 19C1
2016-07-08 15:22 23C1
2016-07-08 15:23 21C1
24. pen4education
Modelo de Armazenamento
Layout no disco (armazenamento físico)
SELECT wstation_id, event_time_ temp
FROM temperature
WHERE wstation_id = 1;
22C 19C 23C
1
2016-07-08 15:20 2016-07-08 15:21 2016-07-08 15:22 2016-07-08 15:23
21C
Colunas Dinâmicas
Partition-key
Dados armazenados sequencialmente
Dados já ordenados (event_time)
25. pen4education
Padrões de Consulta
wstation_id event_time temp
2016-07-08 15:21 19C1
2016-07-08 15:22 23C1
SELECT wstation_id, event_time, temp
FROM temperature
WHERE wstation_id = 1
AND event_time > '2016-07-07 15:20'
AND event_time < '2016-07-07 15:23';
26. pen4education
Casos de Uso de Time Series
• Log de operações e acesso
• Dados de sensores
• Rastreio de Usuários
• Detecção de Fraude
28. pen4education
Partições
• Primeira parte da Chave primária é utilizada como Chave
de Partição (Partition-Key)
• Os dados são agrupados por chave de partição
• Os dados de uma partição devem caber em um único nó
29. pen4education
Limites Físicos de Partição
Cassandra 2.0 ou Anterior
● ~ 100MB ou menos / partição;
● ~ 100k valores (colunas na linha).
Cassandra 2.1+
● Algumas centenas de MB por partição;
● Milhões de valores (colunas por
partição).
30. pen4education
Número de Valores
Como calcular o número de valores por partição
Onde
Número de valores
Número aproximados de Registros (Estimativa)
Número de Colunas do Modelo
Número de Colunas da Chave Primária
Número de Colunas Estáticas (se existir)
32. pen4education
Tamanho da Partição
Tamanho físico no disco
Cki
Csj
Crk
Ccl
Número de valores pré-calculado
Número aproximados de Registros (CQL - rows)
Chaves de Partição
Colunas Estáticas
Colunas Regulares
Número de Colunas Clusterizadas
38. pen4education
Solução: Chaves de partição
usar chaves de partição para diminuir o tamanho de uma
linha. Ex: particionar dados por dia/horário
CREATE TABLE temperature (
wstation_id int,
day int,
hour int,
event_time timestamp,
temp text,
PRIMARY KEY ((wstation_id, day, hour), event_time)
);
40. pen4education
Caso de uso
Criação de Tabela de índice
CREATE TABLE idx_config (
prod_id int,
channel_id varchar,
subs_key varchar,
last_charge timestamp,
status_id int,
origin_id int,
enabled boolean,
PRIMARY KEY ((prod_id, channel_id), subs_key)
);
Partition Key: Agrupamento de assinaturas de usuários por produto e canal de conteúdo
Problema: milhões de assinaturas em um mesmo canal de conteúdo de um mesmo
produto
41. pen4education
Apache Cassandra v1.2
ERROR [CompactionExecutor:6523] 2015-10-09 12:33:23,551
CassandraDaemon.java (line 191) Exception in thread
Thread[CompactionExecutor:6523,1,main]
java.lang.AssertionError: incorrect row data size3758096384 written to
/movile/cassandra-data/SBSPlatform/idx_config/SBSPlatform-idx_config-tmp-ic-715-Data.db;
at org.apache.cassandra.io.sstable.SSTableWriter.append(SSTableWriter.java:162)
at org.apache.cassandra.db.compaction.CompactionTask.runWith(CompactionTask.java:
162)
at org.apache.cassandra.io.util.DiskAwareRunnable.runMayThrow(DiskAwareRunnable.
java:48)
at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28)
+3GB em 1 linha
42. pen4education
Solução: Buckets
Chave de Partição Artificial
CREATE TABLE idx_config (
prod_id int,
channel_id varchar,
subs_key varchar,
last_charge timestamp,
status_id int,
origin_id int,
bucket int,
enabled boolean,
PRIMARY KEY ((prod_id, channel_id, bucket), subs_key)
);
Maior particionamento dos dados, menos colunas por linha!
43. pen4education
Tamanho das Linhas
$ ./nodetool cfstats <keyspace>
Column Family: idx_config
SSTable count: 3
Space used (live): 2458544492
Space used (total): 2509310274
Number of Keys (estimate): 64896
Memtable Data Size: 125129646
Memtable Switch Count: 32931
Read Count: 1197063
Write Latency: 0,044 ms.
Bloom Filter False Positives: 38
Bloom Filter Space Used: 162928
Compacted row minimum size: 180
Compacted row maximum size: 122381140 (~122MB)
Compacted row mean size: 111813
44. pen4education
Considerações Finais
Faça validação do Modelo de forma Iterativa
• verifique todas consultas (Access Patterns)
• verifique o comportamento do modelo com a carga
esperada
• dobre a carga de dados sobre o modelo, verifique o
tamanho das partições (Bucket)
• simule ambiente altamente concorrente
45. pen4education
Considerações Finais
• não execute as validações em ambiente local, crie
um Cluster de máquinas para verificar o
comportamento em rede
• apache-cassandra/tools/bin/cassandra-stress
• simule operações de manutenção (clean up, repair,
compaction)
• sempre verifique os limites físicos e lógicos da
partições