[tdc2016] apache cassandra estratégias de modelagem de dados

47
pen4education Apache Cassandra: Estratégias de Modelagem de Dados Eiti Kimura NoSQL Coordenador de Desenvolvimento

Upload: eiti-kimura

Post on 22-Jan-2018

983 views

Category:

Software


5 download

TRANSCRIPT

Page 1: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

Apache Cassandra: Estratégias de Modelagem de Dados

Eiti Kimura

NoSQL

Coordenador de Desenvolvimento

Page 2: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 3: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

A Movile é a empresa por trás das apps que fazem sua vida mais fácil!

Page 4: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

O Melhor conteúdo para Crianças

Page 5: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

Líder em delivery de comida no Brasil

Page 6: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 7: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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';

Page 8: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

CQL Demo

Page 9: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 10: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

Modelagem (Query-Driven)

Page 11: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

Modelagem (Query Driven)Exemplo de uso

http://docs.datastax.com/en/cql/3.1/cql/ddl/dataModelingApproach.html

diagrama de Chebotko

Page 12: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 13: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 14: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 15: [TDC2016]  Apache Cassandra Estratégias de Modelagem 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 = {'[email protected]'}

WHERE user_id = 'frodo';

UPDATE users SET emails = emails + {'[email protected]'}

WHERE user_id = 'frodo';

Page 16: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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)

Page 17: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 18: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

Estação MetereológicaModelagem Time Series

Page 19: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 20: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

Estação coleta dados ao longo do tempoCassandra armazena os dados em forma sequencial

EstaçãoMetereológica Cluster Cassandra

Aplicação

Page 21: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 22: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 23: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 24: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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)

Page 25: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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';

Page 26: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

Casos de Uso de Time Series

• Log de operações e acesso

• Dados de sensores

• Rastreio de Usuários

• Detecção de Fraude

Page 27: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

Particionamento de DadosModelagem baseada Partição (Buckets)

Page 28: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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ó

Page 29: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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).

Page 30: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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)

Page 31: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

Cálculo do Número de Valores

- Aproximadamente 2000 comentários por usuário

= 2000 * ( 7 - 3 - 1) + 1 = 6001

Page 32: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 33: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

Cálculo do Tamanho da Partição

Usuário gera 2000 comentários

Page 34: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

Estimativa de TamanhoTamanho em bytes das colunas

http://docs.datastax.com/en/cql/3.1/cql/cql_reference/cql_data_types_c.html

Page 35: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 36: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

Checagem dos valores limites

O que acontece se os valores não forem respeitados?

Page 37: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

Inconsistências, ExceçõesCluster em estado de falha

Page 38: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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)

);

Page 39: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

...

Page 40: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 41: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 42: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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!

Page 43: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 44: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 45: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 46: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

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

Page 47: [TDC2016]  Apache Cassandra Estratégias de Modelagem de Dados

pen4education

MUITO OBRIGADO!

eitikimura eiti-kimura-movile [email protected]

[email protected]