[tdc2016] apache cassandra estratégias de modelagem de dados
Post on 22-Jan-2018
985 Views
Preview:
TRANSCRIPT
pen4education
Apache Cassandra: Estratégias de Modelagem de Dados
Eiti Kimura
NoSQL
Coordenador de Desenvolvimento
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
pen4education
A Movile é a empresa por trás das apps que fazem sua vida mais fácil!
pen4education
O Melhor conteúdo para Crianças
pen4education
Líder em delivery de comida no Brasil
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
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';
pen4education
CQL Demo
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
pen4education
Modelagem (Query-Driven)
pen4education
Modelagem (Query Driven)Exemplo de uso
http://docs.datastax.com/en/cql/3.1/cql/ddl/dataModelingApproach.html
diagrama de Chebotko
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
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çõesDados desnormalizados são mais escaláveis
pen4education
Atributos do tipo ColeçõesAtributos 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
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';
pen4education
Use coleções com cautelaAtributo 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)
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
pen4education
Estação MetereológicaModelagem Time Series
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
pen4education
Estação coleta dados ao longo do tempoCassandra armazena os dados em forma sequencial
EstaçãoMetereológica Cluster Cassandra
Aplicação
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
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
pen4education
Modelo de ArmazenamentoVisã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
pen4education
Modelo de ArmazenamentoLayout no disco (armazenamento físico)
SELECT wstation_id, event_time_ temp
FROM temperature
WHERE wstation_id = 1;
22C 19C 23C1
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 sequencialmenteDados já ordenados (event_time)
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';
pen4education
Casos de Uso de Time Series
• Log de operações e acesso
• Dados de sensores
• Rastreio de Usuários
• Detecção de Fraude
pen4education
Particionamento de DadosModelagem baseada Partição (Buckets)
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ó
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).
pen4education
Número de ValoresComo 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)
pen4education
Cálculo do Número de Valores
- Aproximadamente 2000 comentários por usuário
= 2000 * ( 7 - 3 - 1) + 1 = 6001
pen4education
Tamanho da PartiçãoTamanho físico no disco
CkiCsjCrkCcl
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
pen4education
Cálculo do Tamanho da Partição
Usuário gera 2000 comentários
pen4education
Estimativa de TamanhoTamanho em bytes das colunas
http://docs.datastax.com/en/cql/3.1/cql/cql_reference/cql_data_types_c.html
pen4education
Tamanho da PartiçãoCálculo do Tamanho (Exemplo)
Cki = total chaves de partição = 16 bytesCsj = tamanho coluna(s) estáticas = 30 bytesNr = CQL rows = 2000Ccl = tamanho Cluster Columns 16 + 8 = 24 bytesCrk = colunas regulares (300 + 24) + (60 + 24) + (32768 + 24) = 33.200 bytesNv = valores pré calculados = 6001
Resolvendo: 16 + 30 + (2000 * 33.200) + (8 * 6001) = 66.448.054 bytes = ~66,4 MB
pen4education
Checagem dos valores limites
O que acontece se os valores não forem respeitados?
pen4education
Inconsistências, ExceçõesCluster em estado de falha
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)
);
pen4education
22C 19C 22C1:08:10 2016-07-08:10:15 2016-07-08:10:12 2016-07-08:10:05 2016-07-08:10:00
21C
22C 19C 22C1:08:09 2016-07-08:09:15 2016-07-08:09:12 2016-07-08:09:05 2016-07-08:09:00
21C
22C 19C 22C1:08:08 2016-07-08:08:15 2016-07-08:08:12 2016-07-08:08:05 2016-07-08:08:00
21C
PRIMARY KEY ((wstation_id, day, hour), event_time)
Partition Key Cluster Columns
11C 12C 15C1:07:23 2016-07-07:23:15 2016-07-07:23:12 2016-07-07:23:05 2016-07-08:23:00
18C
20C 19C 18C1:07:22 2016-07-07:23:15 2016-07-07:23:12 2016-07-07:23:05 2016-07-08:23:00
17C
...
pen4education
Caso de usoCriaçã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údoProblema: milhões de assinaturas em um mesmo canal de conteúdo de um mesmo produto
pen4education
Apache Cassandra v1.2
ERROR [CompactionExecutor:6523] 2015-10-09 12:33:23,551CassandraDaemon.java (line 191) Exception in threadThread[CompactionExecutor:6523,1,main]java.lang.AssertionError: incorrect row data size 3758096384 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
pen4education
Solução: BucketsChave 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!
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
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
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
pen4education
Links
Cassandra Internals Job http://bit.ly/cassandra-internals-job
Cassandra Tester Job http://bit.ly/cassandra-tester-jobs
Data Modeling Training http://bit.ly/cassandra-data-model-training
pen4education
MUITO OBRIGADO!
eitikimura eiti-kimura-movile eiti.kimura@movile.com
talentos@movile.com
top related