Cassandra[Parte práctica]
Base de Datos NoSQL clave/valor___________________________________________________________________________
Jesús Rodríguez Pérez
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.
Diseño de una BD NoSQL
Creando estructuras
create keyspace Comercio with placement_strategy= 'org.apache.cassandra.locator.SimpleStrategy' and strategy_options={replication_factor:1};
Crear el keyspace
Una vez creado la indicamos que vamos a trabajar con dicho keyspace.
use Comercio;
Creando estructuras(2)
create column family usuario with comparator=UTF8Type andkey_validation_class=IntegerType anddefault_validation_class=UTF8Type andcolumn_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}];
Una familia de columnas
Consultando datos
get usuario[1][mail];
get usuario[1];
list usuario;
get venta where pagada=false;
list producto limit 3;
Solo si hemos creado el índice.
ColumnFamilyRow key
Column
Insertando datos
set usuario[1][nombre] = 'Jesus';set usuario[1][mail] = '[email protected]';set usuario[1][fechaIngreso]='2012-05-12';
set usuario[1][trololo]='yes';
set IdPorMail['[email protected]'][keyUsuario]=1;
INCR login_counter[1][login] BY 0;
set producto['product1'][nombre]='aceite oliva';
set venta[1][keyUsuario]=1;set venta[1][pagada]=false;set venta[1]['product1']=5;set venta[1][pagada]=false;
Un usuario
Un producto
Una venta
Borrando
del usuario[3][mail];
del usuario[3];
drop index on usuario.pais;
drop column family usuario;
drop keyspace comercio;
Introducción a CQL
Creación de estructurasCREATE 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;
Introducción a CQL(2)
Inserción y consultaINSERT INTO usuarios (ID, nombre, mail) VALUES (1, 'jesus', '[email protected]') USING CONSISTENCY LOCAL_QUORUM AND TTL 600;
SELECT nombre, mail FROM usuarios;
SELECT * FROM usuarios;
SELECT * FROM producto WHERE referencia in ('product1', 'product2');
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');
Introducción a phpcassa(2)
Y un poco más de código para usarla
use phpcassa\Connection\ConnectionPool;use phpcassa\SystemManager;
$sys = new SystemManager('127.0.0.1');$pool = new ConnectionPool('Comercio', array('127.0.0.1'));
// ...// ...
$pool->close();$sys->close();
Conexión
Introducción a phpcassa(2)
Consultas simples
use phpcassa\ColumnFamily;
$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"];
Introducción a phpcassa(3)
Consultas algo más complejasuse phpcassa\ColumnSlice;use phpcassa\Index\IndexExpression;use phpcassa\Index\IndexClause;
$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);
}
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>
Herramientas de administracióngráficas
● Cassandra-Cluster-AdminEl equivalente a phpMyAdminhttps://github.com/sebgiroux/Cassandra-Cluster-Admin
● OpsCenterViene 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-guiDe forma bastante simple permite administrar Cassandra.http://code.google.com/a/apache-extras.org/p/cassandra-gui/
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
¿PREGUNTAS?
Bonus Track: Supercolumnas
Creacióncreate column family pruebaSuperwith comparator=UTF8Type andkey_validation_class=UTF8Type anddefault_validation_class=UTF8Type andcolumn_type = 'Super' andsubcomparator = 'UTF8Type' andcolumn_metadata =[ {column_name: supercol, validation_class: UTF8Type}];
Bonus Track: Super columnas
Inserciónset 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';
Bonus Track: Super columnas
Consultasget pruebasuper[1];
list pruebasuper;
Listar las filas
Top Related