Upload
ivan-rosolen-phpsp
View
4.156
Download
0
Embed Size (px)
DESCRIPTION
O que é preciso para instalar e utilizar Cassandra (NoSQL) com PHP de uma forma simples e direta
Citation preview
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
CASSANDRA
O que? De onde? Quem?
Amazon Dynamo
Google Big Table
NoSQL
Pontos Positivos
- 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
Colunas
- Modelar os dados do jeito que você vai buscar, desnormalizado
[KeySpace][ColumnFamily][Key][SuperColumn][SubColumn]
Database = [KeySpace]
Tabela = [ColumnFamily]
Linha = [Key]
Valores = [Column][SuperColumn][SubColumn]
Keyspace 1
Column Family 1
RowKey 1
RowKey 2
Name ValueTimestamp
Name ValueTimestamp
Name ValueTimestamp
Name ValueTimestamp
Name ValueTimestamp
Name ValueTimestamp
Cases
NoSQL at Netflix
http://goo.gl/dtkRw1
2011 Cassandra SF: Cassandra at Twitter Presentation
http://goo.gl/Z6akmx
C* Summit 2013: Cassandra at Instagram
http://goo.gl/UtCMH9
Mais...http://www.planetcassandra.org/Company/ViewCompany
Devo Usar?
- 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 $$?
PHP
Dependências
- 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
- Cassandra-Cli
- CQL - Cassandra Query Languagehttp://cassandra.apache.org/doc/cql/CQL.html
Criando
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”;
- 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
PHPCassa
- Compatível com Cassandra 0.7 até 1.2
- PHP 5.3+
- CQL 2.0
https://github.com/thobbs/phpcassa
https://groups.google.com/forum/#!forum/phpcassa
http://thobbs.github.io/phpcassa/
http://itsallabtamil.blogspot.com.br/2012/03/cassandra-phpcassa-composite-types.html
http://www.fuzzy.cz/en/articles/php-and-cassandra-twissandra/
Links
Criando
<?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();
Sem PHPCassa
<?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';
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";}
Com PHPCassa
<?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();
<?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();
$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();
Insert e Batch Insert
$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")));
Select e Multi Select
$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);
$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
Where e Limit
<?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();
// 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));
Delete
<?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();
Referências / Links
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