Octubre 2014
José Alvarez Muguerza 
Big Data Architect 
jose.muguerza@globant.com 
@jamuguerza josealvarezmuguerza josealvarezmuguerza
Modalidad 
Workshop (Teórico / Práctico) 
Google 
Q&A 
muchos Bookmarks !! 
? ? 
? 
? 
? 
? 
? 
? 
? 
irc
NoSql
Agenda 
➢ NoSql 
- Conceptos 
- Alternativas 
➢ Cassandra 
- Historia 
- Arquitectura 
- Escritura / Lectura 
- Conceptos 
- Herramientas 
- CQL 
- Modelado de Datos 
- Administración y Rendimiento 
- Drivers 
- Buenas Prácticas 
Objetivo???
NoSQL: qué es? 
Database 
No Relacional 
Distribuída 
Open Source 
Escala horizontalmente
NoSQL: Escalando en RDBMS 
decremento de 
performance 
al escalar 
consistencia y performance deseada 
Database Query 
Performance 
Escalabilidad 
Mayor 
atención en 
Sharding, 
Cache, 
SPoF….
NoSQL: Data Model en RDBMS 
Modelo de Datos 
<k, V>
NoSQL: Modelo Agregado en RDBMS 
Modelo Agregado 
< i,< <ki,Vi>,<ki,Vi>,<ki,Vi> >>
NoSQL: ACID en RDBMS 
Atomicity 
Consistency 
Isolation 
Durability 
Basic Availability 
Soft-state 
Eventual consistency
NoSql: CAP Theorem 
R+W>N. 
R+W=N+1
NoSql: CAP Theorem
NoSql: Ventajas sobre RDMS 
Polyglot Persistence 
➢ Esquema dinámico 
➢ Diseñados para escalar (linear) 
➢ Performance escalable 
➢ Simplicidad de uso 
Impedance Mismatch
NoSql: Database landscape
NoSql: Tipos - Clave valor 
Riak 
Redis 
MemcachedDB 
Amz DynamoDB 
Voldemort 
Berkeley 
RDBMS K,V 
Ej: RIAK 
DB Instance Riak Cluster 
table bucket 
row key,value 
row id key 
DynamoDB open source
NoSql: Tipos - Documentos 
MongoDB 
CouchDB 
Terrastore 
RavenDB 
RDBMS Documentos 
Ej: Mongo 
DB Instance Mongo Instance 
Schema Database 
Table Collection 
Row Document 
Row id _id
NoSql: Tipos - Columnar 
Cassandra 
HBase 
Hypertable 
Amz SimpleDB 
RDBMS Columnar 
Ej: Cassandra 
DB Instance Ring / Cluster 
Database Keyspace 
Table Column Family 
Row Row 
Column (# fijo) Column (# variable)
NoSql: Tipos - Grafos 
Neo4j 
Infinite Graph 
OrientDB 
“A Graph —records data in→ Nodes —which have→ Properties” 
fmi: http://en.wikipedia.org/wiki/Graph_database
Apache 
Cassandra
C*: Origen
C*: Proyecto Cassandra 
Escalabilidad 
Performance 
Disponibilidad 
Simplicidad
Cassandra: Arquitectura - Ring 
A 
B 
C 
D 
E 
F 
G 
Cassandra 
ring
Cassandra: Arquitectura - Ring MultiDatacenter
Cassandra: Arquitectura - Schema
C*: Escritura
C*: Compaction 
➢ Fusiona varias SSTables en 1 
➢ Elimina los “descartados” 
➢ Optimiza disco 
➢ Proceso pesado 
➢ automático o manual 
nodetool compact
C*: Lectura
C*: Lectura - cache
C*: repair 
➢ Repara discrepancias 
➢ CL QUORUM & ALL 
➢ DELETES, nulls y restaurado de nodos 
➢ Proceso pesado 
➢ automático o manual 
nodetool repair
C*: R/W en cluster 
CONSISTENCY LEVEL 
ALL= ACK de todos los nodos 
QUORUM = > 51% de los nodos 
LOCAL_QUORUM = > 51% en mi DC 
ONE = ACK de 1 nodo 
Eventual / Strong consistency for dummies: Aquí!!!
C*: Los Tokens 
0 
25 
75 
50 
Generador de Tokens 
ON-LINE HERE !!!
C*: Partitiones 
➢ ByteOrderedPartitioner 
➢ RandomPartitioner 
➢ Murmur3Partitioner
C*: Virtual Nodes
C*: Snitches DataStax Doco! 
SimpleSnitch 
DynamicSnitch 
PropertyFileSnitch 
RackInferingSnitch
C*: Snitches para AWS
Cassandra: Snitches para AWS
C*: Snitches para AWS 
EC2Snitch 
EC2MultiRegionSnitch
C*: Quienes lo usan? casos de Usos
Ejercicios 
Instalación
Ejercicios 
Conociendo los Keyspaces
C*: Tools - cassadra-cli 
//Adding data to the Column families 
set Accounts['1234']['balance'] = long(1000); 
//Reading the columns 
[default@Bank] get Accounts [utf8('1234')]; 
=> (column=62616c616e6365, value=1000, 
timestamp=1389652586026000) 
=> (column=6e616d65, value=John, 
timestamp=1389652425044000) 
Returned 2 results. 
//Drop CF 
drop column family Accounts; 
//connect to a cluster 
connect 127.0.0.1/9160; 
//Creating the database 
create keyspace Bank; 
//Using the Database 
use Bank; 
//Creating a CF 
create column family Accounts; 
//Making Cassandra aware of the data type 
assume Accounts keys as utf8; 
//Adding data to the Column families 
set Accounts['1234']['name'] = 'Jose'; 
Deprecado !!!
Ejercicios 
Múltiples nodos en local
C*: Tools - nodetool 
[cassandra-home]/bin/nodetool 
~/tools/apache-cassandra-2.0.8/tools/bin$ ./nodetool -h 192.168.1.104 status 
argumentos CLICK 
Datacenter: datacenter1 
======================= 
Status=Up/Down 
|/ State=Normal/Leaving/Joining/Moving 
-- Address Load Tokens Owns (effective) Host ID Rack 
UJ 192.168.2.104 29.19 KB 256 ? d82a7a31-591f-4ffd-998f-1557b6b95510 rack1 
UN 192.168.2.101 84.66 KB 256 70.7% e3677182-3860-49c8-992e-6cc9019eab2f rack1 
UN 192.168.2.103 71.46 KB 256 61.2% 82b84eb1-0830-45b5-8968-c1a263c3e66a rack1 
UN 192.168.2.102 55.26 KB 256 68.2% 0f9a1f05-085d-4591-9edd-85174aa55458 rack1 
HERE !!!
ClusterSSH 
cssh
ClusterSSH 
$ vi .csshrc 
clusters = node1 node2 node3 node4 ring 
node1 = jose@192.168.2.101 
node2 = jose@192.168.2.102 
node3 = jose@192.168.2.103 
node4 = jose@192.168.2.104 
ring = node1 node2 node3 node4 
$ cssh ring
Cassandra: 
CQL 
CREATE TABLE usuarios ( 
usuario varchar, 
clave varchar, 
nombre varchar, 
token varchar, 
sexo varchar, 
nacimiento bigint, 
PRIMARY KEY (usuario));
C*: CQL 
CREATE TABLE eventos ( 
tipo text, 
fecha timestamp, 
evento blob, 
PRIMARY KEY (tipo, fecha) 
) 
WITH CLUSTERING ORDER BY (fecha DESC); 
partition key 
DDL
C*: CQL 
DML 
SELECT * FROM system.schema_keyspaces;
Cassandra: CQL 
Data Types
C*: Colecciones 
➢ List 
➢ Set 
➢ Map 
CREATE TABLE colecciones ( 
id int PRIMARY KEY, 
ejemplo_list list<text>, 
ejemplo_set set<text>, 
ejemplo_map map<int,text>)
C*: Colecciones - List 
Respeta orden de inserción!!! 
ejemplo_list list<text> 
Nombre de Colección Tipo de Colección Tipo CQL de los 
elementos
C*: Colecciones - Set 
orden en base a Comparator !! 
ejemplo_set set<text> 
Nombre de Colección Tipo de Colección Tipo CQL de los 
elementos
C*: Colecciones - Map 
orden en base a Comparator !! 
ejemplo_map map<int,text> 
Nombre de Colección Tipo de Colección Tipo CQL de los 
elementos
C*: Colecciones - List - Ejemplos 
INSERT INTO colecciones (id, ejemplo_list) 
VALUES (1, ['juan', 'pedro']); 
UPDATE colecciones SET ejemplo_list = ejemplo_list + ['luis'] 
WHERE id = 1); 
UPDATE colecciones SET ejemplo_list = ['mario'] + ejemplo_list 
WHERE id = 1); 
id ejemplo_list 
1 [ 'mario', 'juan', 'pedro', 'luis'] 
UPDATE colecciones SET ejemplo_list = ejemplo_list - ['pedro'] 
WHERE id = 1);
C*: Colecciones - Set - Ejemplos 
INSERT INTO colecciones (id, ejemplo_set) 
VALUES (1, {'juan', 'pedro'}); 
UPDATE colecciones SET ejemplo_set = ejemplo_set + {'luis'} 
WHERE id = 1); 
UPDATE colecciones SET ejemplo_set = ['mario'] + ejemplo_set 
WHERE id = 1); 
id ejemplo_map 
1 [ 'juan', 'luis', 'mario', 'pedro',] 
UPDATE colecciones SET ejemplo_set = ejemplo_set - {'pedro'} 
WHERE id = 1); 
llaves!!
C*: Colecciones - Map - Ejemplos 
INSERT INTO colecciones (id, ejemplo_map) 
VALUES (1, {1:'juan', 2:'pedro'}); 
UPDATE colecciones SET ejemplo_map[7] = 'luis' 
WHERE id = 1); 
id ejemplo_map 
1 [ 1 :'juan' , 2 :pedro' , 7 :'luis' ] 
DELETE ejemplo_map[7] FROM colecciones WHERE id = 1);
C*: TTL 
INSERT INTO usuarios (usuario, clave) 
segundos!! 
VALUES ('juan001', '123abc') USING TTL 86400 
1 día 5 días 
UPDATE usuarios USING TTL 432000 SET clave = '678xzy' 
WHERE usuario = 'juan001'; 
SELECT clave, TTL(clave) from usuarios WHERE usuario = 'juan001';
C*: Counters 
CREATE TABLE websites.visitas 
(visitas counter, 
url varchar, 
pagina varchar, 
PRIMARY KEY (url, pagina) 
); 
UPDATE websites.visitas 
+1 
0 
-3 
➢ tabla dedicada a contadores 
➢ No soporta Index ni delete 
➢ Tampoco TTL ni TIMESTAMPS 
➢ No puede ser KEY 
➢ Sólo por in/de-crementos, no 
se puede setear 
➢ No reutilizables 
SET visitas = visitas + 2 
WHERE url='www.planetcassandra.org' AND pagina='home';
C*: Timestamps 
Cell 
NAME 
‘Edad' 
VALUE 
65 
TIMESTAMP 
1357866010549000 
public interface Cell extends 
OnDiskAtom { 
… 
public CellName More name(); 
public ByteBuffer More value(); 
public long More timestamp() 
… 
microsegundos!!! } INSERT INTO usuarios (usuario, clave) 
VALUES ('juan001', '123abc') USING TIMESTAMP 1357866010549000
Ejercicios 
Prácticas CQL
C*: Tools - DevCenter 
http://www.datastax.com/download#dl-devcenter
Data Model
C*: Principios en Modelado 
➢ Pensar en Entidades y en Consultas 
➢ “write many, read one” 
➢ Des-normalizar, datos duplicados, JOIN 
➢ Wide-rows: múltiples columnas 
➢ Timeseries 
➢ Iterativo 
➢ Partition-keys compuestas
Administración 
& 
Rendimiento
C*: Autenticación 
cassandra.yaml 
authenticator: AllowAllAuthenticator|PasswordAuthenticator 
CREATE USER 'jose' WITH PASSWORD '123456' SUPERMANAGER; 
ALTER USER 'cassandra' WITH PASSWORD 'nueva_pass'; 
ó 
DROP USER 'cassandra';
C*: Autorización 
cassandra.yaml 
authority: AllowAllAuthority|CassandraAuthorizer 
GRANT select ON tabla1 TO 'jose'; 
LIST ALL PERMISSIONS ON keyspace1.tabla1 OF 'jose' 
GRANT LIST 
REVOK 
E
C*: Tools - JMX 
Métricas
C*: Tools - JMX 
org.apache.cassandra.db: 
cache, table metric, commitlog, compaction, cluster info, 
org.apache.cassandra.internal: 
operaciones internas del server: cache, gossip, flush, hinted off 
org.apache.cassandra.metrics 
métricas internas de las operaciones arriba mencionadas, latencias 
org.apache.cassandra.net 
En relación a transmisión de datos en la red, fallas, origen->destino, etc 
org.apache.cassandra.request 
reads, blocked tasks, pools, etc
C*: manipulando nodos 
- Retirar un nodo 
- Re-insertar un nodo 
(seeds) 
- Agregar un nuevo nodo 
<< auto_bootstrap >> 
A 
B 
C 
D 
E 
F 
G 
Cassandra 
ring 
nodetool decommission 
nodetool repair
C*: Backups 
snapshots 
nodetool snapshot [snapshotName] 
nodetool clearsnapshot [snapshotName]
Ejercicios 
Rendimiento
C*: Tools - tracing en CQL 
TRACING ON; 
INSERT INTO empleados 
(ID, departamento, nombre, apellido) 
VALUES (104, 15, 'juan', 'perez');
C*: Tools - cassandra-stress 
[cassandra-home]/tools/bin/cassandra-stress 
~/tools/apache-cassandra-2.0.8/tools/bin$ ./cassandra-stress 
Created keyspaces. Sleeping 1s for propagation. 
total,interval_op_rate,interval_key_rate,latency,95th,99.9th,elapsed_time 
22623,2262,2262,7.4,32.5,793.8,10 
87791,6516,6516,2.3,15.8,528.3,20 
183523,9573,9573,1.6,11.7,212.0,30 
argumentos CLICK 
HERE !!! 
99% por debajo de esta latencia 
95% por debajo de esta latencia 
latencia promedio x operación en este intervalo 
# de keys manipuladas en este intervalo 
# de operaciones en este intervalo (10 seg por defecto) 
# de operaciones desde que inició el test 
tiempo desde que se inició el test
C*: Tools - OpsCenter 
http://www.datastax.com/documentation/opscenter/5.0/opsc/about_c.html
C*: Tools - cstar_perf 
Stress tests en múltiples clusters 
Diferentes versiones / branches de C* 
Diferentes yaml por cluster 
https://github.com/datastax/cstar_perf 
http://datastax.github.io/cstar_perf/
Drivers
C*: Clientes 
Java 
PHP 
Perl 
Ruby 
C++ 
Python 
CQL 
Node.js .Net Clojure 
Scala Erlang 
https://wiki.apache.org/cassandra/ClientOptions
Ejercicios 
C* + Java
Buenas Prácticas 
Hardware 
➢ CPU con Múltiples cores 
➢ Mínimo 2 HD (SSTables y commitLog separados) 
➢ Net: Gossip y Data por dif interfases 
Software 
➢ Usarlo bajo ‘nix - 
➢ Updates no “Leer antes de Escribir” - 
➢ Evitar SuperColumns - 
➢ usar Murmur3Partitioner - 
➢ Oracle JVM (no otra) - 
➢ Usar secuencia de baja, no Ctrl+C - 
➢ Backups 
➢ Monitorear
C*: Conceptos 
Anillo (Ring o Cluster) 
Keyspace 
Column Family (Table) 
Primary Key 
Partition Key 
Memtable 
SSTable 
CommitLog 
Counter 
TTL 
Snappy 
ESTRUCTURA
C*: Conceptos (cont.) 
Compaction 
Coordinator 
Flushing 
Replication Factor 
Consistency Level 
Quorum 
Read Repair 
Token 
CQL 
Seq I/O vs Random I/O 
Snitch 
Bootstrap 
Hinted handoff 
Gossip 
CAPACIDADES
C*: Principales Fuentes de Doc 
http://www.datastax.com/documentation/cassandra/2.1/ 
http://planetcassandra.org/documentation/ 
Blogs 
google

BigData - NoSQL

  • 1.
  • 2.
    José Alvarez Muguerza Big Data Architect jose.muguerza@globant.com @jamuguerza josealvarezmuguerza josealvarezmuguerza
  • 3.
    Modalidad Workshop (Teórico/ Práctico) Google Q&A muchos Bookmarks !! ? ? ? ? ? ? ? ? ? irc
  • 4.
  • 5.
    Agenda ➢ NoSql - Conceptos - Alternativas ➢ Cassandra - Historia - Arquitectura - Escritura / Lectura - Conceptos - Herramientas - CQL - Modelado de Datos - Administración y Rendimiento - Drivers - Buenas Prácticas Objetivo???
  • 6.
    NoSQL: qué es? Database No Relacional Distribuída Open Source Escala horizontalmente
  • 7.
    NoSQL: Escalando enRDBMS decremento de performance al escalar consistencia y performance deseada Database Query Performance Escalabilidad Mayor atención en Sharding, Cache, SPoF….
  • 8.
    NoSQL: Data Modelen RDBMS Modelo de Datos <k, V>
  • 9.
    NoSQL: Modelo Agregadoen RDBMS Modelo Agregado < i,< <ki,Vi>,<ki,Vi>,<ki,Vi> >>
  • 10.
    NoSQL: ACID enRDBMS Atomicity Consistency Isolation Durability Basic Availability Soft-state Eventual consistency
  • 11.
    NoSql: CAP Theorem R+W>N. R+W=N+1
  • 12.
  • 13.
    NoSql: Ventajas sobreRDMS Polyglot Persistence ➢ Esquema dinámico ➢ Diseñados para escalar (linear) ➢ Performance escalable ➢ Simplicidad de uso Impedance Mismatch
  • 14.
  • 15.
    NoSql: Tipos -Clave valor Riak Redis MemcachedDB Amz DynamoDB Voldemort Berkeley RDBMS K,V Ej: RIAK DB Instance Riak Cluster table bucket row key,value row id key DynamoDB open source
  • 16.
    NoSql: Tipos -Documentos MongoDB CouchDB Terrastore RavenDB RDBMS Documentos Ej: Mongo DB Instance Mongo Instance Schema Database Table Collection Row Document Row id _id
  • 17.
    NoSql: Tipos -Columnar Cassandra HBase Hypertable Amz SimpleDB RDBMS Columnar Ej: Cassandra DB Instance Ring / Cluster Database Keyspace Table Column Family Row Row Column (# fijo) Column (# variable)
  • 18.
    NoSql: Tipos -Grafos Neo4j Infinite Graph OrientDB “A Graph —records data in→ Nodes —which have→ Properties” fmi: http://en.wikipedia.org/wiki/Graph_database
  • 19.
  • 20.
  • 21.
    C*: Proyecto Cassandra Escalabilidad Performance Disponibilidad Simplicidad
  • 22.
    Cassandra: Arquitectura -Ring A B C D E F G Cassandra ring
  • 23.
    Cassandra: Arquitectura -Ring MultiDatacenter
  • 24.
  • 25.
  • 26.
    C*: Compaction ➢Fusiona varias SSTables en 1 ➢ Elimina los “descartados” ➢ Optimiza disco ➢ Proceso pesado ➢ automático o manual nodetool compact
  • 27.
  • 28.
  • 29.
    C*: repair ➢Repara discrepancias ➢ CL QUORUM & ALL ➢ DELETES, nulls y restaurado de nodos ➢ Proceso pesado ➢ automático o manual nodetool repair
  • 30.
    C*: R/W encluster CONSISTENCY LEVEL ALL= ACK de todos los nodos QUORUM = > 51% de los nodos LOCAL_QUORUM = > 51% en mi DC ONE = ACK de 1 nodo Eventual / Strong consistency for dummies: Aquí!!!
  • 31.
    C*: Los Tokens 0 25 75 50 Generador de Tokens ON-LINE HERE !!!
  • 32.
    C*: Partitiones ➢ByteOrderedPartitioner ➢ RandomPartitioner ➢ Murmur3Partitioner
  • 33.
  • 34.
    C*: Snitches DataStaxDoco! SimpleSnitch DynamicSnitch PropertyFileSnitch RackInferingSnitch
  • 35.
  • 36.
  • 37.
    C*: Snitches paraAWS EC2Snitch EC2MultiRegionSnitch
  • 38.
    C*: Quienes lousan? casos de Usos
  • 39.
  • 40.
  • 41.
    C*: Tools -cassadra-cli //Adding data to the Column families set Accounts['1234']['balance'] = long(1000); //Reading the columns [default@Bank] get Accounts [utf8('1234')]; => (column=62616c616e6365, value=1000, timestamp=1389652586026000) => (column=6e616d65, value=John, timestamp=1389652425044000) Returned 2 results. //Drop CF drop column family Accounts; //connect to a cluster connect 127.0.0.1/9160; //Creating the database create keyspace Bank; //Using the Database use Bank; //Creating a CF create column family Accounts; //Making Cassandra aware of the data type assume Accounts keys as utf8; //Adding data to the Column families set Accounts['1234']['name'] = 'Jose'; Deprecado !!!
  • 42.
  • 43.
    C*: Tools -nodetool [cassandra-home]/bin/nodetool ~/tools/apache-cassandra-2.0.8/tools/bin$ ./nodetool -h 192.168.1.104 status argumentos CLICK Datacenter: datacenter1 ======================= Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UJ 192.168.2.104 29.19 KB 256 ? d82a7a31-591f-4ffd-998f-1557b6b95510 rack1 UN 192.168.2.101 84.66 KB 256 70.7% e3677182-3860-49c8-992e-6cc9019eab2f rack1 UN 192.168.2.103 71.46 KB 256 61.2% 82b84eb1-0830-45b5-8968-c1a263c3e66a rack1 UN 192.168.2.102 55.26 KB 256 68.2% 0f9a1f05-085d-4591-9edd-85174aa55458 rack1 HERE !!!
  • 44.
  • 45.
    ClusterSSH $ vi.csshrc clusters = node1 node2 node3 node4 ring node1 = jose@192.168.2.101 node2 = jose@192.168.2.102 node3 = jose@192.168.2.103 node4 = jose@192.168.2.104 ring = node1 node2 node3 node4 $ cssh ring
  • 46.
    Cassandra: CQL CREATETABLE usuarios ( usuario varchar, clave varchar, nombre varchar, token varchar, sexo varchar, nacimiento bigint, PRIMARY KEY (usuario));
  • 47.
    C*: CQL CREATETABLE eventos ( tipo text, fecha timestamp, evento blob, PRIMARY KEY (tipo, fecha) ) WITH CLUSTERING ORDER BY (fecha DESC); partition key DDL
  • 48.
    C*: CQL DML SELECT * FROM system.schema_keyspaces;
  • 49.
  • 50.
    C*: Colecciones ➢List ➢ Set ➢ Map CREATE TABLE colecciones ( id int PRIMARY KEY, ejemplo_list list<text>, ejemplo_set set<text>, ejemplo_map map<int,text>)
  • 51.
    C*: Colecciones -List Respeta orden de inserción!!! ejemplo_list list<text> Nombre de Colección Tipo de Colección Tipo CQL de los elementos
  • 52.
    C*: Colecciones -Set orden en base a Comparator !! ejemplo_set set<text> Nombre de Colección Tipo de Colección Tipo CQL de los elementos
  • 53.
    C*: Colecciones -Map orden en base a Comparator !! ejemplo_map map<int,text> Nombre de Colección Tipo de Colección Tipo CQL de los elementos
  • 54.
    C*: Colecciones -List - Ejemplos INSERT INTO colecciones (id, ejemplo_list) VALUES (1, ['juan', 'pedro']); UPDATE colecciones SET ejemplo_list = ejemplo_list + ['luis'] WHERE id = 1); UPDATE colecciones SET ejemplo_list = ['mario'] + ejemplo_list WHERE id = 1); id ejemplo_list 1 [ 'mario', 'juan', 'pedro', 'luis'] UPDATE colecciones SET ejemplo_list = ejemplo_list - ['pedro'] WHERE id = 1);
  • 55.
    C*: Colecciones -Set - Ejemplos INSERT INTO colecciones (id, ejemplo_set) VALUES (1, {'juan', 'pedro'}); UPDATE colecciones SET ejemplo_set = ejemplo_set + {'luis'} WHERE id = 1); UPDATE colecciones SET ejemplo_set = ['mario'] + ejemplo_set WHERE id = 1); id ejemplo_map 1 [ 'juan', 'luis', 'mario', 'pedro',] UPDATE colecciones SET ejemplo_set = ejemplo_set - {'pedro'} WHERE id = 1); llaves!!
  • 56.
    C*: Colecciones -Map - Ejemplos INSERT INTO colecciones (id, ejemplo_map) VALUES (1, {1:'juan', 2:'pedro'}); UPDATE colecciones SET ejemplo_map[7] = 'luis' WHERE id = 1); id ejemplo_map 1 [ 1 :'juan' , 2 :pedro' , 7 :'luis' ] DELETE ejemplo_map[7] FROM colecciones WHERE id = 1);
  • 57.
    C*: TTL INSERTINTO usuarios (usuario, clave) segundos!! VALUES ('juan001', '123abc') USING TTL 86400 1 día 5 días UPDATE usuarios USING TTL 432000 SET clave = '678xzy' WHERE usuario = 'juan001'; SELECT clave, TTL(clave) from usuarios WHERE usuario = 'juan001';
  • 58.
    C*: Counters CREATETABLE websites.visitas (visitas counter, url varchar, pagina varchar, PRIMARY KEY (url, pagina) ); UPDATE websites.visitas +1 0 -3 ➢ tabla dedicada a contadores ➢ No soporta Index ni delete ➢ Tampoco TTL ni TIMESTAMPS ➢ No puede ser KEY ➢ Sólo por in/de-crementos, no se puede setear ➢ No reutilizables SET visitas = visitas + 2 WHERE url='www.planetcassandra.org' AND pagina='home';
  • 59.
    C*: Timestamps Cell NAME ‘Edad' VALUE 65 TIMESTAMP 1357866010549000 public interface Cell extends OnDiskAtom { … public CellName More name(); public ByteBuffer More value(); public long More timestamp() … microsegundos!!! } INSERT INTO usuarios (usuario, clave) VALUES ('juan001', '123abc') USING TIMESTAMP 1357866010549000
  • 60.
  • 61.
    C*: Tools -DevCenter http://www.datastax.com/download#dl-devcenter
  • 62.
  • 63.
    C*: Principios enModelado ➢ Pensar en Entidades y en Consultas ➢ “write many, read one” ➢ Des-normalizar, datos duplicados, JOIN ➢ Wide-rows: múltiples columnas ➢ Timeseries ➢ Iterativo ➢ Partition-keys compuestas
  • 64.
  • 65.
    C*: Autenticación cassandra.yaml authenticator: AllowAllAuthenticator|PasswordAuthenticator CREATE USER 'jose' WITH PASSWORD '123456' SUPERMANAGER; ALTER USER 'cassandra' WITH PASSWORD 'nueva_pass'; ó DROP USER 'cassandra';
  • 66.
    C*: Autorización cassandra.yaml authority: AllowAllAuthority|CassandraAuthorizer GRANT select ON tabla1 TO 'jose'; LIST ALL PERMISSIONS ON keyspace1.tabla1 OF 'jose' GRANT LIST REVOK E
  • 67.
    C*: Tools -JMX Métricas
  • 68.
    C*: Tools -JMX org.apache.cassandra.db: cache, table metric, commitlog, compaction, cluster info, org.apache.cassandra.internal: operaciones internas del server: cache, gossip, flush, hinted off org.apache.cassandra.metrics métricas internas de las operaciones arriba mencionadas, latencias org.apache.cassandra.net En relación a transmisión de datos en la red, fallas, origen->destino, etc org.apache.cassandra.request reads, blocked tasks, pools, etc
  • 69.
    C*: manipulando nodos - Retirar un nodo - Re-insertar un nodo (seeds) - Agregar un nuevo nodo << auto_bootstrap >> A B C D E F G Cassandra ring nodetool decommission nodetool repair
  • 70.
    C*: Backups snapshots nodetool snapshot [snapshotName] nodetool clearsnapshot [snapshotName]
  • 71.
  • 72.
    C*: Tools -tracing en CQL TRACING ON; INSERT INTO empleados (ID, departamento, nombre, apellido) VALUES (104, 15, 'juan', 'perez');
  • 73.
    C*: Tools -cassandra-stress [cassandra-home]/tools/bin/cassandra-stress ~/tools/apache-cassandra-2.0.8/tools/bin$ ./cassandra-stress Created keyspaces. Sleeping 1s for propagation. total,interval_op_rate,interval_key_rate,latency,95th,99.9th,elapsed_time 22623,2262,2262,7.4,32.5,793.8,10 87791,6516,6516,2.3,15.8,528.3,20 183523,9573,9573,1.6,11.7,212.0,30 argumentos CLICK HERE !!! 99% por debajo de esta latencia 95% por debajo de esta latencia latencia promedio x operación en este intervalo # de keys manipuladas en este intervalo # de operaciones en este intervalo (10 seg por defecto) # de operaciones desde que inició el test tiempo desde que se inició el test
  • 74.
    C*: Tools -OpsCenter http://www.datastax.com/documentation/opscenter/5.0/opsc/about_c.html
  • 75.
    C*: Tools -cstar_perf Stress tests en múltiples clusters Diferentes versiones / branches de C* Diferentes yaml por cluster https://github.com/datastax/cstar_perf http://datastax.github.io/cstar_perf/
  • 76.
  • 77.
    C*: Clientes Java PHP Perl Ruby C++ Python CQL Node.js .Net Clojure Scala Erlang https://wiki.apache.org/cassandra/ClientOptions
  • 78.
  • 79.
    Buenas Prácticas Hardware ➢ CPU con Múltiples cores ➢ Mínimo 2 HD (SSTables y commitLog separados) ➢ Net: Gossip y Data por dif interfases Software ➢ Usarlo bajo ‘nix - ➢ Updates no “Leer antes de Escribir” - ➢ Evitar SuperColumns - ➢ usar Murmur3Partitioner - ➢ Oracle JVM (no otra) - ➢ Usar secuencia de baja, no Ctrl+C - ➢ Backups ➢ Monitorear
  • 80.
    C*: Conceptos Anillo(Ring o Cluster) Keyspace Column Family (Table) Primary Key Partition Key Memtable SSTable CommitLog Counter TTL Snappy ESTRUCTURA
  • 81.
    C*: Conceptos (cont.) Compaction Coordinator Flushing Replication Factor Consistency Level Quorum Read Repair Token CQL Seq I/O vs Random I/O Snitch Bootstrap Hinted handoff Gossip CAPACIDADES
  • 82.
    C*: Principales Fuentesde Doc http://www.datastax.com/documentation/cassandra/2.1/ http://planetcassandra.org/documentation/ Blogs google