54
Compreendendo o Modelo de dados Apache Cassandra

Apresentação cassandra

Embed Size (px)

Citation preview

Page 1: Apresentação cassandra

Compreendendo o Modelo de dados

Apache Cassandra

Page 2: Apresentação cassandra

Alunos:

ARCANJO GABRIEL 096096

PEDRO BRAGANICK 096123

RICHIELY BATISTA 100930

Sistemas Distribuídos

Page 3: Apresentação cassandra

Roteiro:

- O modelo de dados

- Keyspaces

- Column families

- Indexes

- Técnicas conceituais

- Alguns comandos CQL

- Collections – set list map

- Estudo de caso - Twissandra

Page 4: Apresentação cassandra

O modelo de dados

NoSQL - Not only SQL

CQL - Cassandra Query Language - Usado

para distribuir dados em larga escala.

Escalabilidade;

Performance;

Consistência.

A definição do modelo visa as consultas que se

quer otimizar.

Page 5: Apresentação cassandra
Page 6: Apresentação cassandra

Devemos exaltar o NoSQL e minimizar o Modelo de dados Relacional?

R.: De forma alguma !

"Cassandra thinks about data the way we think about data. Most of us

think about data in rows and columns. So does Cassandra."

Quais respostas vou obter? - SQL

Quais perguntas poderei fazer? - NoSQL

Consultas de forma sequencial no tempo em determinados intervalos.

"Quantas pessoas estrangeiras passaram pelos aeroportos

brasileiros no período da Copa do Mundo?"

Page 7: Apresentação cassandra

Modelo Relacional vs NoSQL

-Escalonamento

-Consistência

-Disponibilidade

• Acesso rápido a dados (desde que você possa manter tudo na memória);

• Rápida replicação de dados / distribuídos por vários nós;

• Esquema flexível (você pode adicionar novas colunas instantaneamente);

Page 8: Apresentação cassandra

Esquema de RDBM x Keyspace Repositório dos dados

Page 9: Apresentação cassandra

Column Family

Em JavaScript Object Notacion (JSON):

Musican: ColumnFamily 1

carlos: Rowkey

email: [email protected], ColumnName:Value

instrument: bass ColumnName:Value

george: Rowkey

email: [email protected] ColumnName:Value

Band: ColumnFamily 2

george: Rowkey

fone: 1234 - 4567 ColumnName:Value

Page 10: Apresentação cassandra

Column Family

Análogo as tabelas no modelo relacional?

Page 11: Apresentação cassandra

Super Column (1.2 não suporta - usa

composite column)

Quando uma linha de uma família de colunas contém uma

coleção de pares nome/valor, a família de super coluna

detém subcolunas, onde subcolunas são denominados

grupos de colunas.

"Um mapa cujas chaves são

os nomes das colunas e

os valores são as colunas."

Page 12: Apresentação cassandra
Page 13: Apresentação cassandra

Row

Podem possuir diferentes colunas;

Não precisam ser congruentes: podem

possuir quantidades diferentes de instâncias.

Page 14: Apresentação cassandra

Indexação

Um índice é uma estrutura de dados que permite a

consulta rápida e eficiente de dados correspondentes a

uma determinada condição.

-Índices Primários

-Índices Alternativos

Page 15: Apresentação cassandra

Índice Primário

Em Cassandra, o índice primário, para uma família de

coluna, é o índice de suas chaves de linhas. (Row Key)

Users = {

"edanuff" : {

Rowkey

email: "[email protected]"

}

}

Page 16: Apresentação cassandra

Índice Secundário

Índices secundários em Cassandra referem-se a índices

em valores de coluna (para distingui-los a partir do índice

principal linha de chave para uma família de coluna).

Índice Secundário é um índice alternativo pois não utiliza

de chave de linha (Rowkey).

Não é recomendado para valores de alta cardinalidade (ou seja, timestamps,

datas de nascimento, keyworlds, etc)

Requer pelo menos uma comparação de igualdade em uma consulta - não

eficiente para: menor que / maior que / intervalo de consultas

Page 17: Apresentação cassandra
Page 18: Apresentação cassandra

Você realmente precisa do SQL?

Page 19: Apresentação cassandra

• Select

Suponha que exista Column Family departamentos

e funcionários com relações um-para-muitos,

respectivamente. São elas Emps e Deps . Em Emps há ID

dos empregados utilizados como chaves e há Nome, Data

de nascimento e cidade. Em deps chaves são ID do

departamento e única coluna é Nome.

select * from EMPS onde Data de nascimento = '12/10/1990' ???

Page 20: Apresentação cassandra

• Select

Solução:

Adicionar uma Column Family DataNasc_emps em

que a chave é uma data e o nome das colunas são IDs

dos empregados que nasceram na data, essas colunas

não precisam ser preenchidas podendo ser vazias

representadas por um '-'. Para responder a consulta

precisamos apenas recuperar todas as colunas para a

chave '12/10/1990', lembrando que sempre que um

empregado for acrescentado ou excluído DataNasc_emps precisa ser atualizada.

Page 21: Apresentação cassandra

• Join

Como fazer a consulta:

select * from Emps e, d Deps onde e.dep_id = d.dep_id ???

Page 22: Apresentação cassandra

• Join

Solução:

Basta criarmos uma Column Family Dept_emps

onde as chaves serão os IDs de departamento e as

colunas serão os IDs dos empregados. Assim a consulta

poderia ser facilmente realizada retornando as colunas de

cada chave.

Page 23: Apresentação cassandra

• Group by

select count(*) from Emps group by cidade ????

Page 24: Apresentação cassandra

• Group by

Solução:

Basicamente será feito a mesma coisa do Select,

criando uma nova Column Family Cidade_emps tendo

como chave uma cidade e IDs dos empregados como

colunas. Neste caso você vai contar o número de

empregados recuperados. Ou pode ter uma coluna count

com o número de empregados pré-calculados.

Page 25: Apresentação cassandra

• Order by

Os registros podem ser ordenados pela chave

usando o

OrderPreservingPartitioner. Para manter os dados

ordenados você pode usar o automaticamente ordenação

por nomes de coluna.

Page 26: Apresentação cassandra

Mais sobre o que há de novo no Cassandra-

1.2?

*Collections*

Page 27: Apresentação cassandra

Colletions - Set

Um Set armazena um grupo de elementos que são

retornados na ordem de classificação, quando consultada.

A coluna de tipo consiste conjunto de desordenado de

valores únicos.

CREATE TABLE users (

user_id text PRIMARY KEY,

first_name text,

last_name text,

emails set<text>

);

Page 28: Apresentação cassandra

Colletions - Set

Insertion

INSERT INTO users (user_id, first_name, last_name,

emails) VALUES('user', 'User', 'User', {'[email protected]',

'[email protected]'});

Update

UPDATE users

SET emails = emails + {'[email protected]'} WHERE user_id

= 'user';

Page 29: Apresentação cassandra

Colletions - Set

Remove

UPDATE users

SET emails = emails - {'[email protected]'} WHERE user_id =

'user';

Retrieval

SELECT user_id, emails FROM users WHERE user_id =

'user';

Page 30: Apresentação cassandra

Colletions - List

Quando a ordem dos elementos é considerada, o que

pode não ser a ordem natural ditada pelo tipo de

elementos, usar uma lista. Além disso, use uma lista

quando você precisa armazenar mesmo valor várias

vezes. Os valores da lista são retornados de acordo com o

índice, já no Set é retornado em ordem alfabética.

Insertion

ALTER TABLE users ADD top_cidades list<text>;

UPDATE users SET top_cidades = [ 'goiania', 'recife' ]

WHERE user_id = 'user';

Page 31: Apresentação cassandra

Colletions - List

Addition

UPDATE users

SET top_cidades = [ 'sao paulo' ] + top_cidades WHERE

user_id = 'user';

Delete

UPDATE users

SET top_cidades = top_cidades - ['recife'] WHERE

user_id = 'user';

Page 32: Apresentação cassandra

Colletions - Map

Como o seu nome indica, um mapa mapeia uma coisa a

outra. Um mapa é um par de chaves únicas chave e

valores. Um caso de uso para o tipo mapa é armazenar

informações timestamp relacionado em perfis de usuários.

Insertion

ALTER TABLE users ADD todo map<timestamp,

reminder_text>;

Page 33: Apresentação cassandra

Colletions - Map

Modification and replacement

UPDATE users

SET todo =

{ '2012-9-24' : 'entrou em goiania',

'2012-10-2 12:00' : 'saiu de goiania' }

WHERE user_id = 'user';

UPDATE users SET todo['2012-10-2 12:00'] = 'ficou em

goiania' WHERE user_id = 'user';

Page 34: Apresentação cassandra

Colletions - Map

Usando TTL

UPDATE users USING TTL <computed_ttl>

SET todo['2012-10-1'] = 'precisa sair' WHERE user_id =

'user';

Delete

DELETE todo['2012-9-24'] FROM users WHERE user_id =

'user';

Page 35: Apresentação cassandra

Comandos CQL - Cassandra

Page 36: Apresentação cassandra
Page 37: Apresentação cassandra

Técnicas conceituais

Denormalização

Agregação

Agregação atômica

Chaves enumeráveis

Page 38: Apresentação cassandra

Denormalização

Cópia do mesmo dado em múltiplas tabelas.

Otimizar/simplificar as consultas.

Conseguir os resultados em um só lugar.

Dados estão altamente sendo modificados,

logo caso você queria fazer uma retenção nos

dados que são modificáveis pode perder a

integridade do banco.

Page 39: Apresentação cassandra

Agragação-Composição

Representação do tipo todo-parte.

Se usado junto com a denormalização pode

ter um grande impacto em performance e

consistência.

Page 40: Apresentação cassandra
Page 41: Apresentação cassandra

Agragação Atômica

Permite armazenar uma entidade inteira em

um documento, e atualizar de forma atômica.

Minimizar o comportamento transacional:

*Grande processamento de dados a todo

momento (insert, update, delete).

Page 42: Apresentação cassandra

Agregação Atômica

Page 43: Apresentação cassandra

Chaves enumeráveis

Apesar de ser dispendiosa uma ordenação,

seu uso é de grande benefício.

Ex.: E-mail

• Ordem das mensagens, através de qualquer

ID conhecido.

Varredura de e-mails - backward ou forward.

Page 44: Apresentação cassandra

Uma modelagem, itte r (Twissandra)! https://github.com/twissandra/twissandra

Usuários

Tweets

Followings

Followers

UserLine

TimeLine

Page 45: Apresentação cassandra
Page 46: Apresentação cassandra
Page 47: Apresentação cassandra

Pesquisando Dados no Twissandra:

Quem esta seguindo um usuário?

›  A quem segue um usuário?

›  Mostrar os meus tweets.

›  UserLine.

Mostrar os tweets de todos que eu estou

seguindo.

›  TimeLine.

Page 48: Apresentação cassandra

Quem segue 'alice'?

Page 49: Apresentação cassandra

Quem é seguido por 'alice'?

Page 50: Apresentação cassandra

UserLine

Page 51: Apresentação cassandra

TimeLine

Page 52: Apresentação cassandra

Atualização nas

CF's de User/TimeLine.

Você como desenvolvedor tem que

fazer isso.

Um novo tweet de 'bob'

Page 53: Apresentação cassandra

Disposição e Consulta de tweets

Page 54: Apresentação cassandra

Conclusão

Modelar bem o esquema para se obter

consultas otimizadas;

Não se perder durante o projeto;

Atender as necessidades:

Escalabilidade

Disponibilidade

Alto desempenho