Este documento describe el modelo de datos de Cassandra, una base de datos NoSQL clave-valor. Explica que Cassandra se compone de clusters, keyspaces, column families y columnas. También cubre conceptos como supercolumnas e índices, y proporciona ejemplos de cómo crear estructuras, insertar, consultar y borrar datos en Cassandra.
1. Cassandra [Parte práctica]
Base de Datos NoSQL clave/valor
___________________________________________________________________________
Jesús Rodríguez Pérez
2. Modelo de datos de Cassandra
Antes de empezar con el diseño de una base datos en cassandra debemos al
menos repasar los conceptos básicos de su modelo de datos.
● Cluster: nodos que ejecutan una instancia de Cassandra, estos pueden
contener varios keyspaces.
● Keyspace: un espacio de nombres que permite agrupar varias
ColumnFamilies. Sería el equivalente a una BBDD en el modelo relacional.
● ColumnFamily: puede contener varias columns. Sería equivalente a una
tabla en el modelo relacional. No todas las filas de una ColumnFamily tienen
el porque tener el mismo número de columnas. Cada fila se identifica por su
row key
● Column: unidad básica de almacenamiento. Están compuestas por name,
value y timestamp.
● SuperColumn: son columnas que pueden almacenar otras columnas. No se
suelen utilizar.
Será necesario también conocer cómo funcionan los índices ya que estos nos
permiten hacer consultas más complejas.
4. Creando estructuras
Crear el keyspace
create keyspace Comercio with
placement_strategy=
'org.apache.cassandra.locator.SimpleStrategy' and
strategy_options={replication_factor:1};
Una vez creado la indicamos que vamos a
trabajar con dicho keyspace.
use Comercio;
5. Creando estructuras(2)
Una familia de columnas
create column family usuario with comparator=UTF8Type and
key_validation_class=IntegerType and
default_validation_class=UTF8Type and
column_metadata =[
{column_name: nombre, validation_class: UTF8Type},
{column_name: mail, validation_class: UTF8Type},
{column_name: pais, validation_class: UTF8Type,
index_type: KEYS},
{column_name: fechaIngreso, validation_class: DateType}
];
6. Consultando datos
Row key
ColumnFamily Column
get usuario[1][mail]; Solo si hemos
creado el
get usuario[1]; índice.
list usuario;
get venta where pagada=false;
list producto limit 3;
7. Insertando datos
set usuario[1][nombre] = 'Jesus'; Un usuario
set usuario[1][mail] = 'jesus@mail.net';
set usuario[1][fechaIngreso]='2012-05-12';
set usuario[1][trololo]='yes';
set IdPorMail['jesus@mail.net'][keyUsuario]=1; Un producto
INCR login_counter[1][login] BY 0;
set producto['product1'][nombre]='aceite oliva';
Una venta
set venta[1][keyUsuario]=1;
set venta[1][pagada]=false;
set venta[1]['product1']=5;
set venta[1][pagada]=false;
9. Introducción a CQL
Creación de estructuras
CREATE KEYSPACE tpv WITH strategy_class =
'NetworkTopologyStrategy'
AND strategy_options:DC1 = 2 AND strategy_options:
DC2 = 2;
CREATE COLUMNFAMILY usuarios(
ID uuid PRIMARY KEY,
nombre varchar, password varchar, mail varchar
) WITH replicate_on_write=true AND
default_validation=varchar AND comparator=varchar;
10. Introducción a CQL(2)
Inserción y consulta
INSERT INTO usuarios (ID, nombre, mail) VALUES (1, 'jesus',
'jesus@mail.net') USING CONSISTENCY LOCAL_QUORUM AND TTL 600;
SELECT nombre, mail FROM usuarios;
SELECT * FROM usuarios;
SELECT * FROM producto
WHERE referencia in ('product1', 'product2');
11. Introducción a phpcassa
Después de instalar Cassandra(la distribución
de Datastax Community Edition), apache2 y
PHP5 ahora toca phpcassa.
Simplemente nos descargamos phpcassa y lo
descomprimimos en un directorio accesible por
apache.
Para cargarla solo tenemos que poner:
require_once(__DIR__.'/../lib/autoload.php');
12. Introducción a phpcassa(2)
Y un poco más de código para usarla
Conexión
use phpcassaConnectionConnectionPool;
use phpcassaSystemManager;
$sys = new SystemManager('127.0.0.1');
$pool = new ConnectionPool('Comercio', array
('127.0.0.1'));
// ...
// ...
$pool->close();
$sys->close();
13. Introducción a phpcassa(2)
Consultas simples
use phpcassaColumnFamily;
$usuario = new ColumnFamily($pool, 'usuario');
$IdPorMail = new ColumnFamily($pool, 'IdPorMail');
$user1 = $usuario->get(1);
$nombre = $user1["nombre"];
echo "Usuario $nombre";
$id=$IdPorMail->get($user1["mail"]);
echo $id["keyUsuario"];
14. Introducción a phpcassa(3)
Consultas algo más complejas
use phpcassaColumnSlice;
use phpcassaIndexIndexExpression;
use phpcassaIndexIndexClause;
$venta = new ColumnFamily($pool, 'venta');
$producto = new ColumnFamily($pool, 'producto');
$n=$venta->get_count('1');
echo $n;
$index_KeyUser = new IndexExpression('keyUsuario', 1);
$index_pay = new IndexExpression('pagada', false);
$index_clause = new IndexClause(array($index_KeyUser ,$index_pay));
$rows = $venta->get_indexed_slices($index_clause);
foreach($rows as $key => $columns) {
Print_r($columns);
}
15. Thrift y otros clientes
Thrift es un conjunto de herramientas y
librerías que permite crear interfaces
genéricas con las que podemos
generar todo el código necesario para
utilizarlo en otros lenguajes.
thrift --gen <language> <Thrift filename>
16. Herramientas de administración
gráficas
● Cassandra-Cluster-Admin
El equivalente a phpMyAdmin
https://github.com/sebgiroux/Cassandra-Cluster-Admin
● OpsCenter
Viene en con Datastax Comunity Edition.
Es el más completo, muestra estadísticas de rendimiento de
los nodos...
http://www.datastax.com/products/opscenter
● Cassandra-gui
De forma bastante simple permite administrar Cassandra.
http://code.google.com/a/apache-extras.org/p/cassandra-gui/
17. Para seguir aprendiendo
● Tutorial sobre CQL
● Una serie de tutoriales de un blog
● Grupo de NoSQL de google
● Tutorial sobre Hector
● Blog
● Post sobre cassandra en C++
● Casos prácticos de clientes
● NosqlTape (entrevistas)
● Videotutoriales de Cassandra
19. Bonus Track: Supercolumnas
Creación
create column family pruebaSuper
with comparator=UTF8Type and
key_validation_class=UTF8Type and
default_validation_class=UTF8Type and
column_type = 'Super' and
subcomparator = 'UTF8Type' and
column_metadata =[
{column_name: supercol,
validation_class: UTF8Type}
];
20. Bonus Track: Super columnas
Inserción
set pruebasuper[1][supercol1][col]='1-1-1';
set pruebasuper[1][supercol1][col2]='1-1-2';
set pruebasuper[key][supercol2][col2]='2-2';
set pruebasuper[esto][es][free]='style';
21. Bonus Track: Super columnas
Consultas
get pruebasuper[1];
Listar las filas
list pruebasuper;