SlideShare une entreprise Scribd logo
1  sur  60
Télécharger pour lire hors ligne
©2013 DataStax Confidential. Do not distribute without consent.
Um Tutorial
Ben Coverston @bcoverston
DSE Architect, Datastax Inc.
NoSQL Com Apache Cassandra
1
Wednesday, September 18, 13
Quem Sou?
• Ben Coverston
• DSE Architect
• DataStax Inc
• Morei em SC por dois anos (em 1994-1996)
Wednesday, September 18, 13
Objetivos Da Sessão
• O que é Apache Cassandra?
• Para que posso usá-lo?
• Discussão dos casos de uso
• Dar vocês experiência na utilização da Cassandra
• Questões
Wednesday, September 18, 13
O Que É Apache Cassandra?
• E um banco de dados
• Inicialmente criado pelo Facebook
• Em 2008 foi doada para Apache
• De 2008-2010 foi mantida de individuais
• Até que DataStax foi estabelecido em Abril 2010
Wednesday, September 18, 13
Wednesday, September 18, 13
O Que é Apache Cassandra (Cont.)
• Apache Cassandra é uma mistura
• Google Big Table
• Amazon Dynamo
• O modelo de dados vem de Big Table
• A maneira de distribuição vem de Dynamo
Wednesday, September 18, 13
• Massivamente Escalável
• Alto Desempenho
• Confiávil / Disponível
Wednesday, September 18, 13
VLDB Benchmark
Wednesday, September 18, 13
Endpoint Benchmark
Wednesday, September 18, 13
Wednesday, September 18, 13
Wednesday, September 18, 13
Porque é Popular?
• Um base de dados OLTP
• Focalizado em cenários de tempo real
• Disponibilidade é o mais importante
• Aplicações orientadas ou consumidor.
Wednesday, September 18, 13
O Que É ‘Real Time’?
• Sem JOIN
• Sem subqueries
• Sem Agregação (GROUP BY)
• ORDER BY é limitado
Wednesday, September 18, 13
Quando Devo Utilizar Cassandra
• Se Você Tem Qualquer De:
• Armazenamento além de uma região só
• Alto desempenho (High Performance)
• Alta disponibilidade (High Availability)
• Cassandra deve ser considerado
Wednesday, September 18, 13
Em Outras Palavras
• Precisa uma presença em mais que um Centro de Dados (os ambos
ativos)
• Quando Estás Escalando De 0 ate .. não Sei!
• Precisa 100% disponibilidade, (tão perto de possível)
• Quando a aquisição disso com outro soluções é inviável ($)
. . . e também . . .
Wednesday, September 18, 13
O Modelo De Dados tem que estar
certo
Wednesday, September 18, 13
Antes de modelar, temos que Instalar.
Como Instalar Cassandra
Wednesday, September 18, 13
Maneiras De Installar Cassandra
• Instalador Embalado (packaged installer) (deb/rpm)
• Tarball (Vamos fazer isso hoje)
• Datastax Community (DSC) (há por Windows)
• Datastax Enterprise (DSE)
• Os arquivos necessários estão no USB
Wednesday, September 18, 13
Vamos Installar
• http://cassandra.apache.org
Wednesday, September 18, 13
Vamos Installar
Wednesday, September 18, 13
Vamos Installar
$ java --version
# Cassandra é uma aplicação baseada em Java Precisa Java para funcionar
# Pelas coisas que faremos hoje, OpenJDK talvez funcionará, mas precisamos
# alguma Java
Wednesday, September 18, 13
Vamos Installar (OS X, Linux)
$ tar -xvf apache-cassandra-1.2.8-bin.tar.gz
## modifica permissiões ou locais dos archivos
$ mv apache-cassandra-1.2.8-bin ~./cassandra
$ cd ~./cassandra
$ vim config/cassandra/cassandra.yaml
#change data directory
# saved caches
- saved_caches_directory: /user/lib/cassandra/saved_caches
+ saved_caches_directory: /home/user/(you)/cassandra/saved_caches
#data_file_directories:
- - /var/lib/cassandra/data
+ - /var/users/(you)/cassandra/data
# commit log
- commitlog_directory: /var/lib/cassandra/commitlog
+ commitlog_directory: /var/users/(you)/cassandra/commitlog
Wednesday, September 18, 13
Vamos Installar (cont.)
$ emacs conf/log4j-server.properties
- log4j.appender.R.File=/var/log/cassandra/system.log
+ (your home)/cassandra/log/system.log
# run cassandra, o -f significa ‘foreground’
$ bin/cassandra -f
# Abre uma nova ‘console’ e executa cqlsh
$ bin/cqlsh
Wednesday, September 18, 13
Vamos Fazer
• Quatro exemplos do mundo real
• O causo atual, o modelo para fazer
• Sao comum, talvez é seu causo de uso.
• Vamos Fazer os soluções im CQL3
Wednesday, September 18, 13
Cria Uma Tabulo
• Juntos
• E tenta um WHERE
• tracing on
Wednesday, September 18, 13
Simple Queries and Tracing
CREATE TABLE test (
a int PRIMARY KEY,
b text
);
INSERT INTO test (a, b) VALUES (1, 'example');
INSERT INTO test (a, b) VALUES (2, 'example');
INSERT INTO test (a, b) VALUES (3, 'example');
INSERT INTO test (a, b) VALUES (4, 'example');
INSERT INTO test (a, b) VALUES (5, 'example');
INSERT INTO test (a, b) VALUES (6, 'example');
INSERT INTO test (a, b) VALUES (7, 'example');
INSERT INTO test (a, b) VALUES (8, 'example');
INSERT INTO test (a, b) VALUES (9, 'example');
INSERT INTO test (a, b) VALUES (10, 'example');
Wednesday, September 18, 13
Simple Queries
set tracing on;
SELECT * FROM test;
# bom
SELECT * FROM test WHERE a = 1;
# mais uma vez, bom
SELECT * FROM test WHERE b = 'Example';
## Cassandra? O que?
Wednesday, September 18, 13
Secondary Indexes
CREATE INDEX ON test (b);
SELECT * FROM test WHERE b = 'Example';
Wednesday, September 18, 13
Espera!
CQL não faz ‘wide rows’!
Wednesday, September 18, 13
Faz, sim
• Faz na mesma maneira que Thrift
• É certo! Prometo!
• Leia Aqui:
http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows
...ou, pode confiar em mim, e vou demonstrar
Wednesday, September 18, 13
Também conhecido em Português como ‘Shopping Cart’,
Um bom motivo para ter disponibilidade é que os pessoas querem dar-lhe dinheiro.
Modelo do Carrinho De Compras
Wednesday, September 18, 13
‘Shopping Cart’ Caso De Uso
* Armazenar dados do Carrinho com segurança
* Minimizar, ou eliminar falhas (downtime). Multi-dc
* Escalar pela problema “Cyber Monday” problem
* Cada moment com falhas é $$
* Compradores on-line querem
velocidade
The bad
Wednesday, September 18, 13
O Modelo do ‘Shopping Cart’
• Cada consumidor pode ter max
que um ‘Cart’.
• De-normaliza por acesso rápido
• Um ‘Cart‘ == Um Partition
(storage row)
• Cada coluna é umitem
Wednesday, September 18, 13
O Modelo do ‘Shopping Cart’
CREATE TABLE user (
! username varchar,
! firstname varchar,
! lastname varchar,
! shopping_carts set<varchar>,
! PRIMARY KEY (username)
);
CREATE TABLE shopping_cart (
! username varchar,
! cart_name text
! item_id int,
! item_name varchar,
description varchar,
! price float,
! item_detail map<varchar,varchar>
! PRIMARY KEY ((username,cart_name),item_id)
);
INSERT INTO shopping_cart
(username,cart_name,item_id,item_name,description,price,item_detail)
VALUES ('bcoverston','Gadgets I want',8675309,'Garmin
910XT','Multisport training watch',349.99,
{'Related':'Timex sports watch',
'Volume Discount':'10'});
INSERT INTO shopping_cart
(username,cart_name,item_id,item_name,description,price,item_detail)
VALUES ('pmcfadin','Gadgets I want',9748575,'Polaris Foot
Pod','Bluetooth Smart foot pod',64.00
{'Related':'Timex foot pod',
'Volume Discount':'25'});
Um partition (storage row) de dados
Detalhas do item, flexível por qualquer coisa
Partition chave da linha pela ‘cart’ de um usuário só
Cria da chave pela linha (row key)
Wednesday, September 18, 13
Vamos Criar Nosso Modelo
$ bin/cqlsh
cqlsh> CREATE KEYSPACE cart
WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
cqlsh> USE cart;
cqlsh> CREATE TABLE user (
	 username varchar,
	 firstname varchar,
	 lastname varchar,
	 shopping_carts set<varchar>,
	 PRIMARY KEY (username)
);
Wednesday, September 18, 13
Nosso Modelo (cont)
cqlsh> CREATE TABLE shopping_cart (
	 username varchar,
	 cart_name text
	 item_id int,
	 item_name varchar,
description varchar,
	 price float,
	 item_detail map<varchar,varchar>
	 PRIMARY KEY ((username,cart_name),item_id)
);
Wednesday, September 18, 13
Inserir Dados
cqlsh> INSERT INTO shopping_cart
(username, cart_name, item_id, item_name, description, price, item_detail)
VALUES
('pmcfadin',
'Gadgets I want',
8675309, 'Garmin 910XT', 'Multisport training watch', 349.99,
{'Related':'Timex sports watch','Volume Discount':'10'});
cqlsh> INSERT INTO shopping_cart
(username,cart_name,item_id,item_name,description,price,item_detail)
VALUES ('pmcfadin',
'Gadgets I want',9748575,'Polaris Foot Pod','Bluetooth Smart pod',64.00
{'Related':'Timex foot pod', 'Volume Discount':'25'});
cqlsh> SELECT * FROM shopping_cart;
Wednesday, September 18, 13
Duvidas?
Wednesday, September 18, 13
Arrepiante, mas legal (com permissão)
Monitoração dos atividades de usuários
Wednesday, September 18, 13
Monitoração dos Usarios
* Reagir em ‘tempo real’
* Apoia por muitas aplicações simultâneos
* Escalar por velocidade
* Interações perdidos são caras
* ‘Batch’ (Hadoop) é muito lento
O mal
Wednesday, September 18, 13
O Modelo
* Os pontos de interação vão
em um ‘Users Table’
* Interações de longo prazo
vão em um tabulo com um
partition com um data (date).
* Dados de longo prazo pode
ser processado em ‘batch’.
* Os outros dados são na
ordem inversa.
Wednesday, September 18, 13
O Modelo de Actividades
CREATE TABLE user_activity (
! username varchar,
! interaction_time timeuuid,
! activity_code varchar,
! detail varchar,
! PRIMARY KEY (username, interaction_time)
) WITH CLUSTERING ORDER BY (interaction_time DESC);
CREATE TABLE user_activity_history (
! username varchar,
! interaction_date varchar,
! interaction_time timeuuid,
! activity_code varchar,
! detail varchar,
! PRIMARY KEY ((username,interaction_date),interaction_time)
);
INSERT INTO user_activity
(username,interaction_time,activity_code,detail)
VALUES ('bcoverston',0D1454E0-
D202-11E2-8B8B-0800200C9A66,'100','Normal login')
USING TTL 2592000;
INSERT INTO user_activity_history
(username,interaction_date,interaction_time,activity_code,detail)
VALUES ('bcoverston','20130605',0D1454E0-
D202-11E2-8B8B-0800200C9A66,'100','Normal login');
Ordem inversa baseado em timestamp
Expirar após de 30 dias
Wednesday, September 18, 13
O Modelo de Actividades
cqlsh> CREATE TABLE user_activity (
	 username varchar,
	 interaction_time timeuuid,
	 activity_code varchar,
	 detail varchar,
	 PRIMARY KEY (username, interaction_time)
) WITH CLUSTERING ORDER BY (interaction_time DESC);
cqlsh> CREATE TABLE user_activity_history (
	 username varchar,
	 interaction_date varchar,
	 interaction_time timeuuid,
	 activity_code varchar,
	 detail varchar,
	 PRIMARY KEY ((username,interaction_date),interaction_time)
);
Wednesday, September 18, 13
O Modelo de Actividades
cqlsh> INSERT INTO user_activity
(username,interaction_time,activity_code,detail)
VALUES ('bcoverston',
0D1454E0-D202-11E2-8B8B-0800200C9A66,'100','Normal login')
USING TTL 2592000;
cqlsh> INSERT INTO user_activity_history
(username,interaction_date,interaction_time,activity_code,detail)
VALUES ('bcoverston','20130605',
0D1454E0-D202-11E2-8B8B-0800200C9A66,'100','Normal login');
Wednesday, September 18, 13
Os Dados em Ação
username | interaction_time | detail | activity_code
----------+--------------------------------------+------------------------------------------+------------------
pmcfadin | 9ccc9df0-d076-11e2-923e-5d8390e664ec | Entered shopping area: Jewelry | 301
pmcfadin | 9c652990-d076-11e2-923e-5d8390e664ec | Created shopping cart: Anniversary gifts | 202
pmcfadin | 1b5cef90-d076-11e2-923e-5d8390e664ec | Deleted shopping cart: Gadgets I want | 205
pmcfadin | 1b0e5a60-d076-11e2-923e-5d8390e664ec | Opened shopping cart: Gadgets I want | 201
pmcfadin | 1b0be960-d076-11e2-923e-5d8390e664ec | Normal login | 100
select * from user_activity limit 5;
Talvez flores também?
Wednesday, September 18, 13
Em Pt, “Logging”? Maquinas gerem dados rapidamente, seja pronto.
Coleção de Dados (Logging)
Wednesday, September 18, 13
Causo por ‘Logging’
• Colher dados com alta velocidade
• Cassandra é perto de onde os dados são gerados
• Dados úteis, reportagem.
• RDBMS é caro pela escala essencial
• ‘Batch’ e muito lento
O mal
Wednesday, September 18, 13
Causo por ‘Logging’
• Flume para colher e distribuir dados
para tabelas vários.
• Tabelas por pesquisa pela origem e
tempo.
• Tabelas pela agregação e
sumarização dos dados.
Wednesday, September 18, 13
O Modelo de ‘Logs’
CREATE TABLE log_lookup (
! source varchar,
! date_to_minute varchar,
! timestamp timeuuid,
! raw_log blob,
! PRIMARY KEY ((source,date_to_minute),timestamp)
);
CREATE TABLE login_success (
! source varchar,
! date_to_minute varchar,
! successful_logins counter,
! PRIMARY KEY (source,date_to_minute)
) WITH CLUSTERING ORDER BY (date_to_minute DESC);
CREATE TABLE login_failure (
! source varchar,
! date_to_minute varchar,
! failed_logins counter,
! PRIMARY KEY (source,date_to_minute)
) WITH CLUSTERING ORDER BY (date_to_minute DESC);
raw_logs pode ser em GZIP
Wednesday, September 18, 13
Aggregação dos Logs
0
25
50
75
100
10:01 10:03 10:05 10:07 10:09 10:11 10:13 10:15 10:17 10:19
Sucessful Logins
Failed Logins
SELECT date_to_minute,successful_logins
FROM login_success
LIMIT 20;
SELECT date_to_minute,failed_logins
FROM login_failure
LIMIT 20;
Wednesday, September 18, 13
cqlsh> CREATE TABLE log_lookup (
	 source varchar,
	 date_to_minute varchar,
	 timestamp timeuuid,
	 raw_log blob,
	 PRIMARY KEY ((source,date_to_minute),timestamp)
);
cqlsh> CREATE TABLE login_success (
	 source varchar,
	 date_to_minute varchar,
	successful_logins counter,
	PRIMARY KEY (source,date_to_minute)
) WITH CLUSTERING ORDER BY (date_to_minute DESC);
cqlsh> CREATE TABLE login_failure (
	 source varchar,
	 date_to_minute varchar,
	failed_logins counter,
	PRIMARY KEY (source,date_to_minute)
) WITH CLUSTERING ORDER BY (date_to_minute DESC);
Wednesday, September 18, 13
Incrementing the Counters
cqlsh> UPDATE login_success
SET successful_logins = successful_logins + 2
WHERE source = 'foo' AND date_to_minute = 'bar';
cqlsh> UPDATE login_failure
SET successful_logins = successful_logins + 2
WHERE source = 'foo' AND date_to_minute = 'bar';
cqlsh> SELECT date_to_minute,successful_logins
FROM login_success
LIMIT 20;
cqlsh> SELECT date_to_minute,failed_logins
FROM login_failure
LIMIT 20;
Wednesday, September 18, 13
Porque errors erros acontecem
Controle de Versões
Wednesday, September 18, 13
Causo controle de versões
• Manter todas as versões
• Escalar a qualquer numero de usuários
• Cometer/Reverter (commit/rollback) numa formulário.
O mal
• Em um RDBMS, Muitos relaciones que precisam um ‘JOIN’
• Precisa ficar em o Cloud, e o centro de dados.
Wednesday, September 18, 13
Causo controle de versões
• Cada usuário tem um formulário
• Cada formulário precisa controle
de versões
• Um tabulo dedicado para
arquivar o versão actual
• Acesso exclusivo para um
formulário
Wednesday, September 18, 13
Causo controle de versões
CREATE TABLE working_version (
! username varchar,
! form_id int,
! version_number int,
! locked_by varchar,
! form_attributes map<varchar,varchar>
! PRIMARY KEY ((username, form_id), version_number)
) WITH CLUSTERING ORDER BY (version_number DESC);
INSERT INTO working_version
(username, form_id, version_number, locked_by, form_attributes)
VALUES ('pmcfadin',1138,1,'',
{'FirstName<text>':'First Name: ',
'LastName<text>':'Last Name: ',
'EmailAddress<text>':'Email Address: ',
'Newsletter<radio>':'Y,N'});
UPDATE working_version
SET locked_by = 'pmcfadin'
WHERE username = 'pmcfadin'
AND form_id = 1138
AND version_number = 1;
INSERT INTO working_version
(username, form_id, version_number, locked_by, form_attributes)
VALUES ('pmcfadin',1138,2,null,
{'FirstName<text>':'First Name: ',
'LastName<text>':'Last Name: ',
'EmailAddress<text>':'Email Address: ',
'Newsletter<checkbox>':'Y'});
1. A primera versão
2. ‘Lock’ por um usuário
3. Insere uma nova versão, liberar o ‘Lock’
Wednesday, September 18, 13
Causo controle de versões
cqlsh> CREATE TABLE working_version (
	 username varchar,
	 form_id int,
	 version_number int,
	 locked_by varchar,
	 form_attributes map<varchar,varchar>
	 PRIMARY KEY ((username, form_id), version_number)
) WITH CLUSTERING ORDER BY (version_number DESC);’
#a primeira versão
cqlsh> INSERT INTO working_version
(username, form_id, version_number, locked_by, form_attributes)
VALUES ('pmcfadin',1138,1,'',
{'FirstName<text>':'First Name: ',
'LastName<text>':'Last Name: ',
'EmailAddress<text>':'Email Address: ',
'Newsletter<radio>':'Y,N'});
Wednesday, September 18, 13
Causo controle de versões
cqlsh> UPDATE working_version
SET locked_by = 'pmcfadin'
WHERE username = 'pmcfadin'
AND form_id = 1138
AND version_number = 1;
cqlsh> INSERT INTO working_version
(username, form_id, version_number, locked_by, form_attributes)
VALUES ('pmcfadin',1138,2,null,
{'FirstName<text>':'First Name: ',
'LastName<text>':'Last Name: ',
'EmailAddress<text>':'Email Address: ',
'Newsletter<checkbox>':'Y'});
Wednesday, September 18, 13
É Tudo
• Duvidas?
Wednesday, September 18, 13
©2013 DataStax Confidential. Do not distribute without consent. 60
• Vai, e experimentar.
• Se tem duvidas, a comunidade existe para assistir.
• Se precisa mais, buscar por um espeicalista
• Me segue @bcoverston no Twitter.
Wednesday, September 18, 13

Contenu connexe

Similaire à NoSQL com Apache Cassandra

Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosFabrízio Mello
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDBBrunno Gomes
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated QueryDalton Valadares
 
BD I - Aula 15 B - Criacao de tabelas
BD I - Aula 15 B - Criacao de tabelasBD I - Aula 15 B - Criacao de tabelas
BD I - Aula 15 B - Criacao de tabelasRodrigo Kiyoshi Saito
 
Da argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguroDa argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguroMichael Castillo Granados
 
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...Aryel Tupinambá
 
Otimização e Escalabilidade
Otimização e EscalabilidadeOtimização e Escalabilidade
Otimização e Escalabilidademetzen
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
Portfólio ADS- sem 4 - atividade em grupo
Portfólio ADS- sem 4 - atividade em grupoPortfólio ADS- sem 4 - atividade em grupo
Portfólio ADS- sem 4 - atividade em grupoAdilson Nascimento
 
Prática de laboratório utilizando views, stored procedures e triggers
Prática de laboratório   utilizando views, stored procedures e triggersPrática de laboratório   utilizando views, stored procedures e triggers
Prática de laboratório utilizando views, stored procedures e triggersDaniel Maia
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopDiego Sana
 

Similaire à NoSQL com Apache Cassandra (20)

Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de Dados
 
Postgres Big data
Postgres Big dataPostgres Big data
Postgres Big data
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDB
 
Mongodb workshop cinlug
Mongodb workshop cinlugMongodb workshop cinlug
Mongodb workshop cinlug
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated Query
 
BD I - Aula 15 B - Criacao de tabelas
BD I - Aula 15 B - Criacao de tabelasBD I - Aula 15 B - Criacao de tabelas
BD I - Aula 15 B - Criacao de tabelas
 
Da argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguroDa argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguro
 
Qcon bigdata
Qcon bigdataQcon bigdata
Qcon bigdata
 
Qcon bigdata
Qcon bigdataQcon bigdata
Qcon bigdata
 
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
 
Otimização e Escalabilidade
Otimização e EscalabilidadeOtimização e Escalabilidade
Otimização e Escalabilidade
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Portfólio ADS- sem 4 - atividade em grupo
Portfólio ADS- sem 4 - atividade em grupoPortfólio ADS- sem 4 - atividade em grupo
Portfólio ADS- sem 4 - atividade em grupo
 
Apostila aed
Apostila aedApostila aed
Apostila aed
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
Dinamizando Sites Estáticos
Dinamizando Sites EstáticosDinamizando Sites Estáticos
Dinamizando Sites Estáticos
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Prática de laboratório utilizando views, stored procedures e triggers
Prática de laboratório   utilizando views, stored procedures e triggersPrática de laboratório   utilizando views, stored procedures e triggers
Prática de laboratório utilizando views, stored procedures e triggers
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day Workshop
 

NoSQL com Apache Cassandra

  • 1. ©2013 DataStax Confidential. Do not distribute without consent. Um Tutorial Ben Coverston @bcoverston DSE Architect, Datastax Inc. NoSQL Com Apache Cassandra 1 Wednesday, September 18, 13
  • 2. Quem Sou? • Ben Coverston • DSE Architect • DataStax Inc • Morei em SC por dois anos (em 1994-1996) Wednesday, September 18, 13
  • 3. Objetivos Da Sessão • O que é Apache Cassandra? • Para que posso usá-lo? • Discussão dos casos de uso • Dar vocês experiência na utilização da Cassandra • Questões Wednesday, September 18, 13
  • 4. O Que É Apache Cassandra? • E um banco de dados • Inicialmente criado pelo Facebook • Em 2008 foi doada para Apache • De 2008-2010 foi mantida de individuais • Até que DataStax foi estabelecido em Abril 2010 Wednesday, September 18, 13
  • 6. O Que é Apache Cassandra (Cont.) • Apache Cassandra é uma mistura • Google Big Table • Amazon Dynamo • O modelo de dados vem de Big Table • A maneira de distribuição vem de Dynamo Wednesday, September 18, 13
  • 7. • Massivamente Escalável • Alto Desempenho • Confiávil / Disponível Wednesday, September 18, 13
  • 12. Porque é Popular? • Um base de dados OLTP • Focalizado em cenários de tempo real • Disponibilidade é o mais importante • Aplicações orientadas ou consumidor. Wednesday, September 18, 13
  • 13. O Que É ‘Real Time’? • Sem JOIN • Sem subqueries • Sem Agregação (GROUP BY) • ORDER BY é limitado Wednesday, September 18, 13
  • 14. Quando Devo Utilizar Cassandra • Se Você Tem Qualquer De: • Armazenamento além de uma região só • Alto desempenho (High Performance) • Alta disponibilidade (High Availability) • Cassandra deve ser considerado Wednesday, September 18, 13
  • 15. Em Outras Palavras • Precisa uma presença em mais que um Centro de Dados (os ambos ativos) • Quando Estás Escalando De 0 ate .. não Sei! • Precisa 100% disponibilidade, (tão perto de possível) • Quando a aquisição disso com outro soluções é inviável ($) . . . e também . . . Wednesday, September 18, 13
  • 16. O Modelo De Dados tem que estar certo Wednesday, September 18, 13
  • 17. Antes de modelar, temos que Instalar. Como Instalar Cassandra Wednesday, September 18, 13
  • 18. Maneiras De Installar Cassandra • Instalador Embalado (packaged installer) (deb/rpm) • Tarball (Vamos fazer isso hoje) • Datastax Community (DSC) (há por Windows) • Datastax Enterprise (DSE) • Os arquivos necessários estão no USB Wednesday, September 18, 13
  • 21. Vamos Installar $ java --version # Cassandra é uma aplicação baseada em Java Precisa Java para funcionar # Pelas coisas que faremos hoje, OpenJDK talvez funcionará, mas precisamos # alguma Java Wednesday, September 18, 13
  • 22. Vamos Installar (OS X, Linux) $ tar -xvf apache-cassandra-1.2.8-bin.tar.gz ## modifica permissiões ou locais dos archivos $ mv apache-cassandra-1.2.8-bin ~./cassandra $ cd ~./cassandra $ vim config/cassandra/cassandra.yaml #change data directory # saved caches - saved_caches_directory: /user/lib/cassandra/saved_caches + saved_caches_directory: /home/user/(you)/cassandra/saved_caches #data_file_directories: - - /var/lib/cassandra/data + - /var/users/(you)/cassandra/data # commit log - commitlog_directory: /var/lib/cassandra/commitlog + commitlog_directory: /var/users/(you)/cassandra/commitlog Wednesday, September 18, 13
  • 23. Vamos Installar (cont.) $ emacs conf/log4j-server.properties - log4j.appender.R.File=/var/log/cassandra/system.log + (your home)/cassandra/log/system.log # run cassandra, o -f significa ‘foreground’ $ bin/cassandra -f # Abre uma nova ‘console’ e executa cqlsh $ bin/cqlsh Wednesday, September 18, 13
  • 24. Vamos Fazer • Quatro exemplos do mundo real • O causo atual, o modelo para fazer • Sao comum, talvez é seu causo de uso. • Vamos Fazer os soluções im CQL3 Wednesday, September 18, 13
  • 25. Cria Uma Tabulo • Juntos • E tenta um WHERE • tracing on Wednesday, September 18, 13
  • 26. Simple Queries and Tracing CREATE TABLE test ( a int PRIMARY KEY, b text ); INSERT INTO test (a, b) VALUES (1, 'example'); INSERT INTO test (a, b) VALUES (2, 'example'); INSERT INTO test (a, b) VALUES (3, 'example'); INSERT INTO test (a, b) VALUES (4, 'example'); INSERT INTO test (a, b) VALUES (5, 'example'); INSERT INTO test (a, b) VALUES (6, 'example'); INSERT INTO test (a, b) VALUES (7, 'example'); INSERT INTO test (a, b) VALUES (8, 'example'); INSERT INTO test (a, b) VALUES (9, 'example'); INSERT INTO test (a, b) VALUES (10, 'example'); Wednesday, September 18, 13
  • 27. Simple Queries set tracing on; SELECT * FROM test; # bom SELECT * FROM test WHERE a = 1; # mais uma vez, bom SELECT * FROM test WHERE b = 'Example'; ## Cassandra? O que? Wednesday, September 18, 13
  • 28. Secondary Indexes CREATE INDEX ON test (b); SELECT * FROM test WHERE b = 'Example'; Wednesday, September 18, 13
  • 29. Espera! CQL não faz ‘wide rows’! Wednesday, September 18, 13
  • 30. Faz, sim • Faz na mesma maneira que Thrift • É certo! Prometo! • Leia Aqui: http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows ...ou, pode confiar em mim, e vou demonstrar Wednesday, September 18, 13
  • 31. Também conhecido em Português como ‘Shopping Cart’, Um bom motivo para ter disponibilidade é que os pessoas querem dar-lhe dinheiro. Modelo do Carrinho De Compras Wednesday, September 18, 13
  • 32. ‘Shopping Cart’ Caso De Uso * Armazenar dados do Carrinho com segurança * Minimizar, ou eliminar falhas (downtime). Multi-dc * Escalar pela problema “Cyber Monday” problem * Cada moment com falhas é $$ * Compradores on-line querem velocidade The bad Wednesday, September 18, 13
  • 33. O Modelo do ‘Shopping Cart’ • Cada consumidor pode ter max que um ‘Cart’. • De-normaliza por acesso rápido • Um ‘Cart‘ == Um Partition (storage row) • Cada coluna é umitem Wednesday, September 18, 13
  • 34. O Modelo do ‘Shopping Cart’ CREATE TABLE user ( ! username varchar, ! firstname varchar, ! lastname varchar, ! shopping_carts set<varchar>, ! PRIMARY KEY (username) ); CREATE TABLE shopping_cart ( ! username varchar, ! cart_name text ! item_id int, ! item_name varchar, description varchar, ! price float, ! item_detail map<varchar,varchar> ! PRIMARY KEY ((username,cart_name),item_id) ); INSERT INTO shopping_cart (username,cart_name,item_id,item_name,description,price,item_detail) VALUES ('bcoverston','Gadgets I want',8675309,'Garmin 910XT','Multisport training watch',349.99, {'Related':'Timex sports watch', 'Volume Discount':'10'}); INSERT INTO shopping_cart (username,cart_name,item_id,item_name,description,price,item_detail) VALUES ('pmcfadin','Gadgets I want',9748575,'Polaris Foot Pod','Bluetooth Smart foot pod',64.00 {'Related':'Timex foot pod', 'Volume Discount':'25'}); Um partition (storage row) de dados Detalhas do item, flexível por qualquer coisa Partition chave da linha pela ‘cart’ de um usuário só Cria da chave pela linha (row key) Wednesday, September 18, 13
  • 35. Vamos Criar Nosso Modelo $ bin/cqlsh cqlsh> CREATE KEYSPACE cart WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}; cqlsh> USE cart; cqlsh> CREATE TABLE user ( username varchar, firstname varchar, lastname varchar, shopping_carts set<varchar>, PRIMARY KEY (username) ); Wednesday, September 18, 13
  • 36. Nosso Modelo (cont) cqlsh> CREATE TABLE shopping_cart ( username varchar, cart_name text item_id int, item_name varchar, description varchar, price float, item_detail map<varchar,varchar> PRIMARY KEY ((username,cart_name),item_id) ); Wednesday, September 18, 13
  • 37. Inserir Dados cqlsh> INSERT INTO shopping_cart (username, cart_name, item_id, item_name, description, price, item_detail) VALUES ('pmcfadin', 'Gadgets I want', 8675309, 'Garmin 910XT', 'Multisport training watch', 349.99, {'Related':'Timex sports watch','Volume Discount':'10'}); cqlsh> INSERT INTO shopping_cart (username,cart_name,item_id,item_name,description,price,item_detail) VALUES ('pmcfadin', 'Gadgets I want',9748575,'Polaris Foot Pod','Bluetooth Smart pod',64.00 {'Related':'Timex foot pod', 'Volume Discount':'25'}); cqlsh> SELECT * FROM shopping_cart; Wednesday, September 18, 13
  • 39. Arrepiante, mas legal (com permissão) Monitoração dos atividades de usuários Wednesday, September 18, 13
  • 40. Monitoração dos Usarios * Reagir em ‘tempo real’ * Apoia por muitas aplicações simultâneos * Escalar por velocidade * Interações perdidos são caras * ‘Batch’ (Hadoop) é muito lento O mal Wednesday, September 18, 13
  • 41. O Modelo * Os pontos de interação vão em um ‘Users Table’ * Interações de longo prazo vão em um tabulo com um partition com um data (date). * Dados de longo prazo pode ser processado em ‘batch’. * Os outros dados são na ordem inversa. Wednesday, September 18, 13
  • 42. O Modelo de Actividades CREATE TABLE user_activity ( ! username varchar, ! interaction_time timeuuid, ! activity_code varchar, ! detail varchar, ! PRIMARY KEY (username, interaction_time) ) WITH CLUSTERING ORDER BY (interaction_time DESC); CREATE TABLE user_activity_history ( ! username varchar, ! interaction_date varchar, ! interaction_time timeuuid, ! activity_code varchar, ! detail varchar, ! PRIMARY KEY ((username,interaction_date),interaction_time) ); INSERT INTO user_activity (username,interaction_time,activity_code,detail) VALUES ('bcoverston',0D1454E0- D202-11E2-8B8B-0800200C9A66,'100','Normal login') USING TTL 2592000; INSERT INTO user_activity_history (username,interaction_date,interaction_time,activity_code,detail) VALUES ('bcoverston','20130605',0D1454E0- D202-11E2-8B8B-0800200C9A66,'100','Normal login'); Ordem inversa baseado em timestamp Expirar após de 30 dias Wednesday, September 18, 13
  • 43. O Modelo de Actividades cqlsh> CREATE TABLE user_activity ( username varchar, interaction_time timeuuid, activity_code varchar, detail varchar, PRIMARY KEY (username, interaction_time) ) WITH CLUSTERING ORDER BY (interaction_time DESC); cqlsh> CREATE TABLE user_activity_history ( username varchar, interaction_date varchar, interaction_time timeuuid, activity_code varchar, detail varchar, PRIMARY KEY ((username,interaction_date),interaction_time) ); Wednesday, September 18, 13
  • 44. O Modelo de Actividades cqlsh> INSERT INTO user_activity (username,interaction_time,activity_code,detail) VALUES ('bcoverston', 0D1454E0-D202-11E2-8B8B-0800200C9A66,'100','Normal login') USING TTL 2592000; cqlsh> INSERT INTO user_activity_history (username,interaction_date,interaction_time,activity_code,detail) VALUES ('bcoverston','20130605', 0D1454E0-D202-11E2-8B8B-0800200C9A66,'100','Normal login'); Wednesday, September 18, 13
  • 45. Os Dados em Ação username | interaction_time | detail | activity_code ----------+--------------------------------------+------------------------------------------+------------------ pmcfadin | 9ccc9df0-d076-11e2-923e-5d8390e664ec | Entered shopping area: Jewelry | 301 pmcfadin | 9c652990-d076-11e2-923e-5d8390e664ec | Created shopping cart: Anniversary gifts | 202 pmcfadin | 1b5cef90-d076-11e2-923e-5d8390e664ec | Deleted shopping cart: Gadgets I want | 205 pmcfadin | 1b0e5a60-d076-11e2-923e-5d8390e664ec | Opened shopping cart: Gadgets I want | 201 pmcfadin | 1b0be960-d076-11e2-923e-5d8390e664ec | Normal login | 100 select * from user_activity limit 5; Talvez flores também? Wednesday, September 18, 13
  • 46. Em Pt, “Logging”? Maquinas gerem dados rapidamente, seja pronto. Coleção de Dados (Logging) Wednesday, September 18, 13
  • 47. Causo por ‘Logging’ • Colher dados com alta velocidade • Cassandra é perto de onde os dados são gerados • Dados úteis, reportagem. • RDBMS é caro pela escala essencial • ‘Batch’ e muito lento O mal Wednesday, September 18, 13
  • 48. Causo por ‘Logging’ • Flume para colher e distribuir dados para tabelas vários. • Tabelas por pesquisa pela origem e tempo. • Tabelas pela agregação e sumarização dos dados. Wednesday, September 18, 13
  • 49. O Modelo de ‘Logs’ CREATE TABLE log_lookup ( ! source varchar, ! date_to_minute varchar, ! timestamp timeuuid, ! raw_log blob, ! PRIMARY KEY ((source,date_to_minute),timestamp) ); CREATE TABLE login_success ( ! source varchar, ! date_to_minute varchar, ! successful_logins counter, ! PRIMARY KEY (source,date_to_minute) ) WITH CLUSTERING ORDER BY (date_to_minute DESC); CREATE TABLE login_failure ( ! source varchar, ! date_to_minute varchar, ! failed_logins counter, ! PRIMARY KEY (source,date_to_minute) ) WITH CLUSTERING ORDER BY (date_to_minute DESC); raw_logs pode ser em GZIP Wednesday, September 18, 13
  • 50. Aggregação dos Logs 0 25 50 75 100 10:01 10:03 10:05 10:07 10:09 10:11 10:13 10:15 10:17 10:19 Sucessful Logins Failed Logins SELECT date_to_minute,successful_logins FROM login_success LIMIT 20; SELECT date_to_minute,failed_logins FROM login_failure LIMIT 20; Wednesday, September 18, 13
  • 51. cqlsh> CREATE TABLE log_lookup ( source varchar, date_to_minute varchar, timestamp timeuuid, raw_log blob, PRIMARY KEY ((source,date_to_minute),timestamp) ); cqlsh> CREATE TABLE login_success ( source varchar, date_to_minute varchar, successful_logins counter, PRIMARY KEY (source,date_to_minute) ) WITH CLUSTERING ORDER BY (date_to_minute DESC); cqlsh> CREATE TABLE login_failure ( source varchar, date_to_minute varchar, failed_logins counter, PRIMARY KEY (source,date_to_minute) ) WITH CLUSTERING ORDER BY (date_to_minute DESC); Wednesday, September 18, 13
  • 52. Incrementing the Counters cqlsh> UPDATE login_success SET successful_logins = successful_logins + 2 WHERE source = 'foo' AND date_to_minute = 'bar'; cqlsh> UPDATE login_failure SET successful_logins = successful_logins + 2 WHERE source = 'foo' AND date_to_minute = 'bar'; cqlsh> SELECT date_to_minute,successful_logins FROM login_success LIMIT 20; cqlsh> SELECT date_to_minute,failed_logins FROM login_failure LIMIT 20; Wednesday, September 18, 13
  • 53. Porque errors erros acontecem Controle de Versões Wednesday, September 18, 13
  • 54. Causo controle de versões • Manter todas as versões • Escalar a qualquer numero de usuários • Cometer/Reverter (commit/rollback) numa formulário. O mal • Em um RDBMS, Muitos relaciones que precisam um ‘JOIN’ • Precisa ficar em o Cloud, e o centro de dados. Wednesday, September 18, 13
  • 55. Causo controle de versões • Cada usuário tem um formulário • Cada formulário precisa controle de versões • Um tabulo dedicado para arquivar o versão actual • Acesso exclusivo para um formulário Wednesday, September 18, 13
  • 56. Causo controle de versões CREATE TABLE working_version ( ! username varchar, ! form_id int, ! version_number int, ! locked_by varchar, ! form_attributes map<varchar,varchar> ! PRIMARY KEY ((username, form_id), version_number) ) WITH CLUSTERING ORDER BY (version_number DESC); INSERT INTO working_version (username, form_id, version_number, locked_by, form_attributes) VALUES ('pmcfadin',1138,1,'', {'FirstName<text>':'First Name: ', 'LastName<text>':'Last Name: ', 'EmailAddress<text>':'Email Address: ', 'Newsletter<radio>':'Y,N'}); UPDATE working_version SET locked_by = 'pmcfadin' WHERE username = 'pmcfadin' AND form_id = 1138 AND version_number = 1; INSERT INTO working_version (username, form_id, version_number, locked_by, form_attributes) VALUES ('pmcfadin',1138,2,null, {'FirstName<text>':'First Name: ', 'LastName<text>':'Last Name: ', 'EmailAddress<text>':'Email Address: ', 'Newsletter<checkbox>':'Y'}); 1. A primera versão 2. ‘Lock’ por um usuário 3. Insere uma nova versão, liberar o ‘Lock’ Wednesday, September 18, 13
  • 57. Causo controle de versões cqlsh> CREATE TABLE working_version ( username varchar, form_id int, version_number int, locked_by varchar, form_attributes map<varchar,varchar> PRIMARY KEY ((username, form_id), version_number) ) WITH CLUSTERING ORDER BY (version_number DESC);’ #a primeira versão cqlsh> INSERT INTO working_version (username, form_id, version_number, locked_by, form_attributes) VALUES ('pmcfadin',1138,1,'', {'FirstName<text>':'First Name: ', 'LastName<text>':'Last Name: ', 'EmailAddress<text>':'Email Address: ', 'Newsletter<radio>':'Y,N'}); Wednesday, September 18, 13
  • 58. Causo controle de versões cqlsh> UPDATE working_version SET locked_by = 'pmcfadin' WHERE username = 'pmcfadin' AND form_id = 1138 AND version_number = 1; cqlsh> INSERT INTO working_version (username, form_id, version_number, locked_by, form_attributes) VALUES ('pmcfadin',1138,2,null, {'FirstName<text>':'First Name: ', 'LastName<text>':'Last Name: ', 'EmailAddress<text>':'Email Address: ', 'Newsletter<checkbox>':'Y'}); Wednesday, September 18, 13
  • 60. ©2013 DataStax Confidential. Do not distribute without consent. 60 • Vai, e experimentar. • Se tem duvidas, a comunidade existe para assistir. • Se precisa mais, buscar por um espeicalista • Me segue @bcoverston no Twitter. Wednesday, September 18, 13