bigdata - nosql
TRANSCRIPT
Octubre 2014
José Alvarez MuguerzaBig Data Architect
@jamuguerza josealvarezmuguerza josealvarezmuguerza
Q&A
GoogleWorkshop (Teórico / Práctico)
muchos Bookmarks !!
? ??
???
??
?
Modalidad
irc
NoSql
➢ NoSql- Conceptos- Alternativas
➢ Cassandra- Historia- Arquitectura- Escritura / Lectura- Conceptos- Herramientas- CQL- Modelado de Datos- Administración y Rendimiento- Drivers- Buenas Prácticas
Agenda
Objetivo???
NoSQL: qué es?
DatabaseNo 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
➢ Diseñados para escalar (linear)
➢ Performance escalable
➢ Simplicidad de uso
➢ Esquema dinámico
Impedance Mismatch
NoSql: Database landscape
NoSql: Tipos - Clave valor
RiakRedisMemcachedDBAmz DynamoDBVoldemortBerkeley
RDBMS K,V Ej: RIAK
DB Instance Riak Cluster
table bucket
row key,value
row id keyDynamoDB open source
MongoDBCouchDBTerrastoreRavenDB
NoSql: Tipos - Documentos
RDBMS Documentos Ej: Mongo
DB Instance Mongo Instance
Schema Database
Table Collection
Row Document
Row id _id
CassandraHBaseHypertableAmz SimpleDB
NoSql: Tipos - Columnar
RDBMS ColumnarEj: Cassandra
DB Instance Ring / Cluster
Database Keyspace
Table Column Family
Row Row
Column (# fijo) Column (# variable)
Neo4jInfinite GraphOrientDB
NoSql: Tipos - Grafos
fmi: http://en.wikipedia.org/wiki/Graph_database
“A Graph —records data in→ Nodes —which have→ Properties”
Apache Cassandra
C*: Origen
C*: Proyecto Cassandra
EscalabilidadPerformance
Disponibilidad
Simplicidad
Cassandra: Arquitectura - Ring
A
B
C
DE
F
G
Cassandra ring
Cassandra: Arquitectura - RingMultiDatacenter
Cassandra: Arquitectura - Schema
C*: Escritura
C*: Compaction
➢ Fusiona varias SSTables en 1
➢ Elimina los “descartados”
➢ Optimiza disco
➢ Proceso pesado
➢ automático o manualnodetool compact
C*: Lectura
C*: Lectura - cache
C*: repair
➢ Repara discrepancias
➢ CL QUORUM & ALL
➢ DELETES, nulls y restaurado de nodos
➢ Proceso pesado
➢ automático o manualnodetool 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 nodoEventual / Strong consistency for dummies: Aquí!!!
C*: Los Tokens
0
2550
75
Generador de TokensON-LINE HERE !!!
C*: Partitiones
➢ ByteOrderedPartitioner
➢ RandomPartitioner
➢ Murmur3Partitioner
C*: Virtual Nodes
C*: SnitchesDataStax Doco!
SimpleSnitchDynamicSnitchPropertyFileSnitchRackInferingSnitch
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 familiesset 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 CFdrop column family Accounts;
//connect to a clusterconnect 127.0.0.1/9160;
//Creating the databasecreate keyspace Bank;
//Using the Databaseuse Bank;
//Creating a CF create column family Accounts;
//Making Cassandra aware of the data typeassume Accounts keys as utf8;
//Adding data to the Column familiesset 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
Datacenter: datacenter1=======================Status=Up/Down|/ State=Normal/Leaving/Joining/Moving-- Address Load Tokens Owns (effective) Host ID RackUJ 192.168.2.104 29.19 KB 256 ? d82a7a31-591f-4ffd-998f-1557b6b95510 rack1UN 192.168.2.101 84.66 KB 256 70.7% e3677182-3860-49c8-992e-6cc9019eab2f rack1UN 192.168.2.103 71.46 KB 256 61.2% 82b84eb1-0830-45b5-8968-c1a263c3e66a rack1UN 192.168.2.102 55.26 KB 256 68.2% 0f9a1f05-085d-4591-9edd-85174aa55458 rack1
argumentos CLICKHERE !!!
ClusterSSH
clusters = node1 node2 node3 node4 ringnode1 = [email protected] = [email protected] = [email protected] = [email protected] = node1 node2 node3 node4
$ vi .csshrc
$ cssh ring
Cassandra: CQL
CREATE TABLE usuarios ( usuario varchar, clave varchar, nombre varchar, token varchar, sexo varchar, nacimiento bigint, PRIMARY KEY (usuario));
CREATE TABLE eventos ( tipo text, fecha timestamp, evento blob, PRIMARY KEY (tipo, fecha))
WITH CLUSTERING ORDER BY (fecha DESC);
C*: CQL
partition keyDDL
SELECT * FROM system.schema_keyspaces;
C*: CQL
DML
Cassandra: CQL
Data Types
➢ List
➢ Set
➢ Map
C*: Colecciones
CREATE TABLE colecciones ( id int PRIMARY KEY, ejemplo_list list<text>, ejemplo_set set<text>, ejemplo_map map<int,text>)
C*: Colecciones - List
ejemplo_list list<text>
Respeta orden de inserción!!!
Nombre de Colección Tipo de Colección Tipo CQL de los elementos
C*: Colecciones - Set
ejemplo_set set<text>
orden en base a Comparator !!
Nombre de Colección Tipo de Colección Tipo CQL de los elementos
C*: Colecciones - Map
ejemplo_map map<int,text>
Nombre de Colección Tipo de Colección Tipo CQL de los elementos
orden en base a Comparator !!
C*: Colecciones - List - EjemplosINSERT 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);
UPDATE colecciones SET ejemplo_list = ejemplo_list - ['pedro'] WHERE id = 1);
id ejemplo_list
1 [ 'mario', 'juan', 'pedro', 'luis']
C*: Colecciones - Set - EjemplosINSERT 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);
UPDATE colecciones SET ejemplo_set = ejemplo_set - {'pedro'} WHERE id = 1);
id ejemplo_map
1 [ 'juan', 'luis', 'mario', 'pedro',]
llaves!!
C*: Colecciones - Map - EjemplosINSERT INTO colecciones (id, ejemplo_map) VALUES (1, {1:'juan', 2:'pedro'});
UPDATE colecciones SET ejemplo_map[7] = 'luis' WHERE id = 1);
DELETE ejemplo_map[7] FROM colecciones WHERE id = 1);
id ejemplo_map
1 [ 1 :'juan' , 2 :pedro' , 7 :'luis' ]
C*: TTL
INSERT INTO usuarios (usuario, clave) VALUES ('juan001', '123abc') USING TTL 86400
UPDATE usuarios USING TTL 432000 SET clave = '678xzy'
WHERE usuario = 'juan001';
SELECT clave, TTL(clave) from usuarios WHERE usuario = 'juan001';
1 día5 días
segundos!!
CREATE TABLE websites.visitas
(visitas counter,
url varchar,
pagina varchar,
PRIMARY KEY (url, pagina)
);
UPDATE websites.visitas
SET visitas = visitas + 2
WHERE url='www.planetcassandra.org' AND pagina='home';
C*: Counters
+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
C*: Timestamps
Cell
NAME‘Edad'
VALUE65
TIMESTAMP1357866010549000
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
cassandra.yaml authenticator: AllowAllAuthenticator|PasswordAuthenticator
CREATE USER 'jose' WITH PASSWORD '123456' SUPERMANAGER;
ALTER USER 'cassandra' WITH PASSWORD 'nueva_pass';
ó
DROP USER 'cassandra';
C*: Autenticación
cassandra.yaml authority: AllowAllAuthority|CassandraAuthorizer
GRANT select ON tabla1 TO 'jose';
LIST ALL PERMISSIONS ON keyspace1.tabla1 OF 'jose'
C*: Autorización
GRANT LISTREVOKE
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.metricsmétricas internas de las operaciones arriba mencionadas, latencias
org.apache.cassandra.netEn relación a transmisión de datos en la red, fallas, origen->destino, etc
org.apache.cassandra.requestreads, blocked tasks, pools, etc
C*: manipulando nodos
- Retirar un nodo
- Re-insertar un nodo (seeds)
- Agregar un nuevo nodo<< auto_bootstrap >>
A
B
C
DE
F
G
Cassandra ring
nodetool decommission
nodetool repair
C*: Backups
nodetool snapshot [snapshotName]
nodetool clearsnapshot [snapshotName]
snapshots
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-stressCreated 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,1087791,6516,6516,2.3,15.8,528.3,20183523,9573,9573,1.6,11.7,212.0,30
argumentos CLICKHERE !!!
# de operaciones desde que inició el test
# de operaciones en este intervalo (10 seg por defecto)
# de keys manipuladas en este intervalo
latencia promedio x operación en este intervalo
95% por debajo de esta latencia
99% por debajo de esta latencia
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 clustersDiferentes versiones / branches de C*Diferentes yaml por cluster
https://github.com/datastax/cstar_perfhttp://datastax.github.io/cstar_perf/
Drivers
C*: Clientes
JavaPHP
Perl
C++Node.js .NetClojure
Python
ScalaErlang
Ruby
https://wiki.apache.org/cassandra/ClientOptions
CQL
Ejercicios
C* + Java
➢ CPU con Múltiples cores ➢ Mínimo 2 HD (SSTables y commitLog separados)➢ Net: Gossip y Data por dif interfases
Buenas Prácticas
➢ 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
Hardware
Software
C*: Conceptos
Anillo (Ring o Cluster)KeyspaceColumn Family (Table)
Primary KeyPartition KeyMemtableSSTableCommitLog
CounterTTLSnappy
ESTRUCTURA
C*: Conceptos (cont.)
CompactionCoordinatorFlushingReplication FactorConsistency LevelQuorumRead Repair
CAPACIDADES
TokenCQLSeq I/O vs Random I/OSnitchBootstrapHinted handoffGossip
http://www.datastax.com/documentation/cassandra/2.1/
http://planetcassandra.org/documentation/
C*: Principales Fuentes de Doc
Blogsgoogle