51
PHP e CASSANDRA

Php e Cassandra

Embed Size (px)

DESCRIPTION

O que é preciso para instalar e utilizar Cassandra (NoSQL) com PHP de uma forma simples e direta

Citation preview

Page 1: Php e Cassandra

PHP e CASSANDRA

Page 2: Php e Cassandra

Ivan RosolenGraduado em Sistemas de InformaçãoPós-graduado em Gerência de Projetos

Desenvolvedor a 10+ anosAutor de vários PHPT (testes para o PHP)

Gerente de Projetos na Arizona

Page 3: Php e Cassandra

CASSANDRA

Page 4: Php e Cassandra

O que? De onde? Quem?

Page 5: Php e Cassandra

Amazon Dynamo

Google Big Table

Facebook

NoSQL

Page 6: Php e Cassandra

Pontos Positivos

Page 7: Php e Cassandra

- Alta escalabilidade e disponibilidade

- Sem um único ponto de falha

- Baseado em colunas (wide-column)

- Rendimento de escrita muito alto

- Rendimento de leitura bom

- Consistência ajustável e suporte a replicação

Page 8: Php e Cassandra

Colunas

Page 9: Php e Cassandra

- Modelar os dados do jeito que você vai buscar, desnormalizado

[KeySpace][ColumnFamily][Key][SuperColumn][SubColumn]

Page 10: Php e Cassandra

Database = [KeySpace]

Tabela = [ColumnFamily]

Linha = [Key]

Valores = [Column][SuperColumn][SubColumn]

Page 11: Php e Cassandra

Keyspace 1

Column Family 1

RowKey 1

RowKey 2

Name ValueTimestamp

Name ValueTimestamp

Name ValueTimestamp

Name ValueTimestamp

Name ValueTimestamp

Name ValueTimestamp

Page 12: Php e Cassandra

Cases

Page 13: Php e Cassandra

NoSQL at Netflix

http://goo.gl/dtkRw1

Page 14: Php e Cassandra

2011 Cassandra SF: Cassandra at Twitter Presentation

http://goo.gl/Z6akmx

Page 15: Php e Cassandra

C* Summit 2013: Cassandra at Instagram

http://goo.gl/UtCMH9

Page 16: Php e Cassandra

Mais...http://www.planetcassandra.org/Company/ViewCompany

Page 17: Php e Cassandra

Devo Usar?

Page 18: Php e Cassandra

- Algum outro NoSQL não aguentou (MongoDB)

- Precisa de um modelo de dados mais rebuscado?

- Precisa de uma escrita ABSURDA?

- Está disposto a reformular sua aplicação? As vezes muito trabalhoso dependendo da arquitetura

- Está disposto a gastar $$?

Page 19: Php e Cassandra

PHP

Page 20: Php e Cassandra

Dependências

Page 21: Php e Cassandra

Cassandrahttp://cassandra.apache.org

Page 22: Php e Cassandra

- Não recomendado usar o java 7 ou o OpenJDK

- Oracle Java SE Runtime Environment (JRE) 6

- Apache disponibiliza “binary tarballs” e “Debian packages”- Java Native Access (JNA) é necessário para servidores de produção pois melhora a utilização de memória do Cassandra

Page 23: Php e Cassandra

- Cassandra-Cli

- CQL - Cassandra Query Languagehttp://cassandra.apache.org/doc/cql/CQL.html

Page 24: Php e Cassandra

Criando

Page 25: Php e Cassandra

cassandra-cli

create keyspace Palestra with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' and strategy_options = {replication_factor:1};

use Palestra;

create column family Users;

cqlsh

cqlsh:demo> select * from “Users”;

Page 26: Php e Cassandra

Thrifthttp://thrift.apache.org

Page 27: Php e Cassandra

- Habilitar APC para melhor performace

- Dependências / Installhttp://thrift.apache.org/docs/install/

- Módulo nativo do PHP (phpize)cd ext/thrift_protocolphpize./configuremakesudo make install

Page 28: Php e Cassandra

PHPCassa

Page 29: Php e Cassandra

- Compatível com Cassandra 0.7 até 1.2

- PHP 5.3+

- CQL 2.0

Page 31: Php e Cassandra

Criando

Page 32: Php e Cassandra

<?php

require_once(__DIR__.'/../lib/autoload.php');

use phpcassa\Connection\ConnectionPool;use phpcassa\ColumnFamily;use phpcassa\SystemManager;use phpcassa\Schema\StrategyClass;

$sys = new SystemManager('127.0.0.1');$sys->create_keyspace('Palestra', array( "strategy_class" => StrategyClass::SIMPLE_STRATEGY, "strategy_options" => array('replication_factor' => '1')));$sys->create_column_family('Palestra', 'Users');

$sys->close();

Page 33: Php e Cassandra

Sem PHPCassa

Page 34: Php e Cassandra

<?php$GLOBALS['THRIFT_ROOT'] = '/usr/share/php/Thrift';require_once $GLOBALS['THRIFT_ROOT'].'/packages/cassandra/Cassandra.php';require_once $GLOBALS['THRIFT_ROOT'].'/packages/cassandra/cassandra_types.php';require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php';require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php';require_once $GLOBALS['THRIFT_ROOT'].'/transport/TFramedTransport.php';require_once $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php';

Page 35: Php e Cassandra

try { $socket = new TSocket('127.0.0.1', 9160); $transport = new TBufferedTransport($socket, 1024, 1024); $protocol = new TBinaryProtocolAccelerated($transport); $client = new CassandraClient($protocol); $transport->open();

$keyspace = 'Palestra';

$keyUserId = "user0";

$columnPath = new cassandra_ColumnPath(); $columnPath->column_family = 'Users'; $columnPath->super_column = null; $columnPath->column = 'email';

$timestamp = time();

$consistency_level = cassandra_ConsistencyLevel::ZERO;

$value = '[email protected]'; $client->insert($keyspace, $keyUserId, $columnPath, $value, $timestamp, $consistency_level);

$transport->close();

} catch (TException $tx) { print 'TException: '.$tx->why. ' Error: '.$tx->getMessage() . "\n";}

Page 36: Php e Cassandra

Com PHPCassa

Page 37: Php e Cassandra

<?php

require_once(__DIR__.'/../lib/autoload.php');

use phpcassa\Connection\ConnectionPool;use phpcassa\ColumnFamily;

$pool = new ConnectionPool('Palestra', array('127.0.0.1'));$users = new ColumnFamily($pool, 'Users');

$users->insert('user0', array("email" => "[email protected]"));

$pool->close();

Page 38: Php e Cassandra

<?php

require_once(__DIR__.'/../lib/autoload.php');

use phpcassa\Connection\ConnectionPool;

$servers = array(“192.168.229.170:9160”,”192.168.229.171:9160”,”192.168.229.172:9160);$pool = new ConnectionPool ('Palestra',$servers);

$pool->close();

Page 39: Php e Cassandra

$sys = new SystemManager('127.0.0.1');

$pool = new ConnectionPool('Palestra', array('127.0.0.1'));$users = new ColumnFamily($pool, 'Users');

$users->truncate();

$sys->drop_keyspace("Palestra");

$pool->close();$sys->close();

Page 40: Php e Cassandra

Insert e Batch Insert

Page 41: Php e Cassandra

$users->insert('user0', array("name" => "ivan", "state" => "SP"));$users->insert('user1', array("name" => "elton", "state" => "SC"));

$users->batch_insert(array("user3" => array("name" => "er"), vvvvvvvvvvv"user4" => array("name" => "calvin")));

Page 42: Php e Cassandra

Select e Multi Select

Page 43: Php e Cassandra

$user = $users->get('user0');$name = $user["name"];echo "Nome do usuário $name\n";

$columnNames = array('name', 'state');$user = $users->get('user0',$column_slice = null, $column_names=$columnNames);

Page 44: Php e Cassandra

$many = $users->multiget(array('user0', 'user1'));foreach($many as $user_id => $columns) { echo "Estado do $user_id: ".$columns["state"]."\n";}

$users->get_count('user0');// retorna 2

Page 45: Php e Cassandra

Where e Limit

Page 46: Php e Cassandra

<?php

require_once(__DIR__.'/../lib/autoload.php');

use phpcassa\Connection\ConnectionPool;use phpcassa\ColumnFamily;use phpcassa\ColumnSlice;

$pool = new ConnectionPool('Palestra', array('127.0.0.1'));$letters = new ColumnFamily($pool, 'Letras');

$columns = array(1 => "a", 2 => "b", 3 => "c", 4 => "d", 5 => "e");$letters->insert('linha', $columns);

…….

$pool->close();

Page 47: Php e Cassandra

// Where >= 2$slice = new ColumnSlice(2);print_slice($letters->get('linha', $slice));

// Between 2 and 4$slice = new ColumnSlice(2, 4);print_slice($letters->get('linha', $slice));

// Limit 3$slice = new ColumnSlice('', '', $count=3);print_slice($letters->get('linha', $slice));

// 3 últimas$slice = new ColumnSlice('', '', $count=3, $reversed=true);print_slice($letters->get('linha', $slice));

// 2 últimas antes do 4$slice = new ColumnSlice(4, '', $count=2, $reversed=true);print_slice($letters->get('linha', $slice));

Page 48: Php e Cassandra

Delete

Page 49: Php e Cassandra

<?php

require_once(__DIR__.'/../lib/autoload.php');

use phpcassa\Connection\ConnectionPool;use phpcassa\ColumnFamily;

$pool = new ConnectionPool('Palestra', array('127.0.0.1'));$users = new ColumnFamily($pool, 'Users');

$users->remove("user4");

$users>remove("user0", array("state"));

$users->truncate();

$pool->close();

Page 50: Php e Cassandra

Referências / Links

Page 51: Php e Cassandra

Planet Cassandra http://www.planetcassandra.org/Cassandra Summit 2013http://www.youtube.com/watch?v=Qz6ElTdYjjU&list=PLqcm6qE9lgKJzVvwHprow9h7KMpb5hcUUUsing Cassandra with PHPhttps://pressflow.atlassian.net/wiki/display/PF/Using+Cassandra+with+PHPDataStaxhttp://www.datastax.com/docsDataStax Data modelinghttp://www.datastax.com/documentation/cql/3.0/webhelp/index.html#cql/ddl/ddl_anatomy_table_c.htmlApache Cassandra Wikihttp://wiki.apache.org/cassandra/ArticlesAndPresentationsQuadrinho de como o Cassandra Funcionahttp://blogs.atlassian.com/2013/09/do-you-know-cassandraPandrahttps://github.com/mjpearson/PandraCassandra PHP Client Libraryhttps://github.com/kallaspriit/Cassandra-PHP-Client-Library/Cassandra PDOhttps://github.com/Orange-OpenSource/YACassandraPDO