I Encontro NOSQL Brasil

maio 12th, 2010 | by | mongodb, nosql

mai
12

Sobre

O movimento noSQL está transformando completamente a forma com que as pessoas olham para os dados – empresas como Twitter, Facebook e Google são alguns dos usuários desta tecnologia.

Os motivos que levam estas e outras empresas ao redor do mundo a utilizar um noSQL são variadas. Em geral, envolvem escalabidade e performance que não conseguimos obter com os tradicionais bancos de dados relacional.

O noSQL Brasil é o primeiro encontro brasileiro que visa apresentar, promover e discutir as tecnologias “noSQL”. Para isso, serão realizadas palestras sobre as diversas abordagens noSQL com exemplos práticos e demonstrações, bem como um painel onde será discutido como e quando utilizar noSQL.

O movimento noSQL está transformando completamente a forma com que as pessoas olham para os dados – empresas como Twitter, Facebook e Google são alguns dos usuários desta tecnologia.


Os motivos que levam estas e outras empresas ao redor do mundo a utilizar um noSQL são variadas. Em geral, envolvem escalabidade e performance que não conseguimos obter com os tradicionais bancos de dados relacional.


O noSQL Brasil é o primeiro encontro brasileiro que visa apresentar, promover e discutir as tecnologias “noSQL”. Para isso, serão realizadas palestras sobre as diversas abordagens noSQL com exemplos práticos e demonstrações, bem como um painel onde será discutido como e quando utilizar noSQL.

Agenda

Sábado, 15 de Maio de 2010
08.00 - Credenciamento
08.30 - Abertura
Alexandre Porcelli, OpenSpotLight
09.00 - noSQL anti-patterns
Gleicon Moraes, Locaweb
10.00 - Performance e simplicidade com Chave/Valor utilizando REDIS
Luiz Fernando Teston, OpenSpotLight
10.45 - Coffee break
11.20 - O papel do REST no Neo4J e CouchDB, um comparativo
Guilherme Silveira, Caelum
12.10 - Introdução ao MongoDB – direto da fonte!
Alberto Lerner, 10gen
13.00 - Almoço livre (não incluso)
14.30 - Tio: um NoSQL made in Brasil
Rodrigo Strauss, 1bit
15.20 - Nas Nuvens com KVM, JBoss REST-Easy e InfiniSpan
Edgar SilvaSamuel Tauil, Red Hat Brasil
16.10 - Coffee break
17.00 - Divide et impera – Processamento massivo com Hadoop, Pig e HBase
Vinicius Carvalho, SambaTech
17.50 - Estudo de caso: avaliando o Apache Cassandra como cache distribuído
Julio Viegas, GlobalCode
18.40 - Painel de Discussão
19.30 - Happy Hour!

(*) Esta agenda pode ser alterada sem aviso prévio.

maiores informações

http://nosqlbr.com/

1 Comment »

Como fazer um benchmark com PHP

maio 11th, 2010 | by | benchmark, escalabilidade, mongodb, nosql

mai
11

Quem está começando com nosql deve estar maravilhado com todo o potencial. E para o ego ficar maior ainda, é legal medir o tempo de carregamento e fazer um benchmark no seu código.

É só você usar essa função:

[php]
function getTime(){
static $tempo;
if( $tempo == NULL ){
$tempo = microtime(true);
}
else{
echo ‘Tempo (segundos): ‘.(microtime(true)-$tempo).”;
}
}
[/php]

Com isso você vai saber o tempo extado que o seu script vai levar para carregar. Para você usar essa função é muito fácil também:

[php]
getTime();
//aqui você coloca o teu código
getTime();
[/php]

E é isso ai, aproveitem e coloquem aqui nos comentários o benchmark de vocês. @suissacorp obrigado pela função.

2 Comments »

Páginação PHP com MongoDB

maio 11th, 2010 | by | mongodb, mysql, nosql, uncategorized

mai
11

Um post rápido sobre a fácilidade de páginação com o MongoDB e PHP e todas as outras linguagens.

Com esse simples código, você pode começar a fazer a sua páginação em PHP e MongoDB:

[php]
$cursor->limit(400)->skip(0);
[/php]

Esse é o “substituto” do LIMIT 0,400
Essa fácilidade ainda vem com um forte aliado, o count:

[php]
$cursor->count(true);
$cursor->count();
[/php]

O primeiro count vai retornar a quantidade TOTAL de todos os registros que foram retornados na consulta sem o limit. No nosso exemplo aqui, estamos limitando a 400 registros, mas a quantidade de registros total era de 5 milhões. No segundo count retornamos só o que esta sendo exibido, no caso 400 registros.

A partir dai você já sabe, só da um for na quantidade total dos registros, e montar as páginas.
Mas tome cuidado com esse exemplo que te dei, pois ele pode retornar muitas, muitas páginas mesmo, dependendo da quantidade de registros que você tenha, por isso, faça uma páginação mais detalhada #ficadica.

Como vocês podem ver, a páginação é algo muito simples em relação ao MySQL por exemplo, pois não precisamos consultar novamente o banco de dados para saber a quantidade total de registros.

1 Comment »

Lighttpd + MongoDB + PHP + MySQL + Servidor direto do pendrive(USB)

maio 7th, 2010 | by | escalabilidade, mongodb, mysql, nosql

mai
07

Quem já não teve vontade de testar o mundo nosql, mas ou não conseguiu instalar, ou teve preguiça ou não queria mudar para o linux? Aposto que mais de 90%.

Vendo essa necessidade, aproveitei o programa Lighty2Go que já vem com Lighttpd, php e MySQL, aproveitei e fiz algumas modificações e coloquei o MongoDB e PHP juntos, e de bonus o phpmoadmin, que serve para administrar o MongoDB.

Ele funciona de forma extremamente simples, depois de você baixar os arquivos extraia no pendrive ou em qualquer lugar do seu computador. Depois é só iniciar o servidor

Quando você iniciar o servidor, ele vai estar na porta 81, ou seja, para acessar ele você deve entrar em http://localhost:81

Para administrar o MySQL acesse:
http://localhost:81/phpmyadmin/

Para ver o phpinfo:
http://localhost:81/phpinfo

Para ver o phpmoadmin:
http://localhost:81/moadmin.php

Os arquivos do seu site você pode colocar tudo dentro de HTDOCS.
Fica ai esse excelente pacote, com um dos melhores servidores web o lighttpd, com a melhor programação o PHP, com o melhor banco de dados MongoDB, e o antigo melhor, MySQL.

Download

http://www.megaupload.com/?d=A1MVB1YP
http://rapidshare.com/files/384566309/Lighty2Go.rar.html

3 Comments »

Armazenar arquivos com MongoDB

maio 7th, 2010 | by | escalabilidade, mongodb, nosql

mai
07

O MongoDB também oferece recursos que vão além das operações de banco de dados. Por exemplo, ele oferece uma boa solução para armazenar arquivos grandes e pequenos no banco de dados.

Os arquivos são automaticamente divididos em blocos. Se MongoDB é executado em um ambiente de auto-sharded, pedaços de arquivo também são replicados em vários servidores.

Armazenar arquivos é surpreendentemente muito difícil, um problema para resolver de forma eficiente, especialmente quando você precisa gerenciar um grande número de arquivos. Salve arquivos em um sistema de arquivos local muitas vezes não é boa solução.

Um exemplo dessa dificuldade é o problema que o YouTube tinha eficientemente servir miniaturas de milhões de vídeos , ou mesmo os cortes realizados pelo Facebook eficientemente servir milhares de milhões de fotos .

MongoDB resolve este problema através da criação de duas coleções internas: os arquivos collection para manter informações sobre os metadados de arquivos e os chunks collection mantém informações sobre os pedaços do arquivo.

Se você quer armazenar um arquivo de vídeo grande, você usaria um código como este:

[php]$metadata = array(
<pre> "filename" => "path.avi",
"downloads" => 0,
"comment" => "This file is foo bar",
"permissions" => array(
 "crodas" => "write",
 "everybody" => "read",
)
);
$grid = $db->getGridFS();
$grid->storeFile("/file/to/path.avi", $metadata);[/php]

Como você pode ver é simples de entender. #ficadica

parte retirada do artigo: http://www.phpclasses.org/blog/post/118-Developing-scalable-PHP-applications-using-MongoDB.html


No Comments »

Eu tenho que me preocupar com SQL Injection no MongoDB?

maio 7th, 2010 | by | escalabilidade, javascript, mongodb, nosql, sql

mai
07

Geralmente, com MongoDB não estamos construindo a partir de consultas SQL,  logo ataques SQL Injection não são um problema.

No MongoDB as consultas são representados como BSON. Normalmente a linguagem de programação oferece uma maneira conveniente de construir estes objetos que está livre da injeção. Qualquer caracter especial não afetará o banco pois ele será apenas uma string.

Javascript

Alguns cuidados são apropriados quando utilizando Javascript. Por exemplo, quando usando o $ em uma consulta, não concatenar fornecido usuário declaração de dados para compilar o código Javascript, o que seria análogo a uma vulnerabilidade de injeção SQL. Felizmente, a maioria das consultas em MongoDB pode ser expresso sem Javascript. Além disso, podemos misturar os dois modos. É uma boa idéia para fazer todos os campos fornecidos pelo usuário ir direto para um campo BSON.

Você pode usar db.eval () com valores fornecidos usuário, você pode usar o CodeWScope ou você pode fornecer argumentos extras para sua função. Algo como: function (db.eval (userVal ){…}, user_value); Isto irá assegurar que você obterá user_value enviadas como dados em vez de código.

As vezes é útil construir um objeto BSON onde a chave é fornecida pelo usuário. Nessas situações, as chaves precisam ter substituições.  O usuário pode enviar uma $ valor com a_chave.meu_objeto onde {$algo: “coisas”}. Então podemos ver alguns casos:

  • Inserindo. Inserção no banco de dados não fará nenhum dano. Nós não estamos executando esse objeto como uma consulta, estamos inserindo os dados no banco de dados.
  • Update. Atualização (consulta, obj) permite $ operadores no domínio obj. $ Onde não é suportado em atualização. Alguns operadores são possíveis, que manipulam o documento único – assim, as chaves devem ser escapadas.
  • Consultando. Geralmente este não é um problema, como por (x: user_obj), cifrões não são de nível superior e não ter nenhum efeito. Em teoria, pode-se deixar o usuário criar uma consulta completamente dele e fornecê-la ao banco de dados. Nesse caso, a verificação por $ nas chaves é importante. No entanto, isso seria um caso muito raro.

Artigo semi traduzido de http://www.mongodb.org/pages/viewpage.action?pageId=7209106

No Comments »

Como Instalar MongoDB no Windows com Wamp

maio 6th, 2010 | by | escalabilidade, mongodb, nosql, wamp

mai
06

Postei recentemente no nosso grupo de nosql no google groups, sobre como instalar o MongoDB e PHP no Windows. Achei a instalação extremamente fácil e vou ensinar pra vocês agora.

Baixe o mongodb essa é a versão 32 bits se o teu pc for 64, baixa esse a versão 64 bits aqui. Enquanto baixa, vai lá no C: e cria duas pastas:
mongodb
data
Dentro da pasta data cria uma pasta chamada db

Vai ficar extamente assim:

c:/mongodb
c:/data/db

Assim que acabar o download do mongodb, extraia todos os arquivos para a pasta mongodb, todos aqueles bin, includes e etc…

Pronto, agora vamos em Iniciar > Executar > e digite: CMD
Agora no prompt de comando digite “cd..” sem aspas, até chegar no c:\
Dai entre na pasta bin do mongodb com o comando:
cd mongodb\bin
e digite mongod
mongod mesmo, com o d no final

Pronto o teu servidor está rodando.
Se quiser pode acessar a página do mongodb em http://localhost:27017 se entrar esta tudo ok.
Agora vamos juntar o MongoDB e PHP instalando as dll’s do driver php usando o wamp, mas o processo é bem semelhante se você quiser instalar o MongDB e PHP sem usar o WAMP.
O WAMP usa o php 5.3 vc6 ts. Vamos baixar esse drive:
http://github.com/downloads/mongodb/mongo-php-driver/mongo-1.0.6-r1-php5.3vc6ts.zip

No site do MongoDB tem um monte de drivers pra outros projetos e outras versões do PHP:
http://www.mongodb.org/display/DOCS/Downloads
Extraia a dll do MongoDB para a pasta do PHP, no WAMP você coloca em:
C:\wamp\bin\php\php5.3.1\ext
obs.: esse caminho é do meu wamp, veja onde tu instalou ele.

Agora vai lá no iconezinho do WAMP fecha ele e abre denovo, quando aberto clica uma vez nele vai em PHP > php extensions e procura por php_mongo.dll a hailita ele.
Fecha e abre o WAMP novamente.

Pronto, já é pra tudo funcionar. Entrem em http://www.phpmoadmin.com/
Baixa ele e coloca na tua pasta do apache, a que tu usa para rodar as páginas.

Aqui esta um exemplo de uma página:

[php]
<?php
$conexao = new Mongo();
$db = $conexao->testebd;
$collection = $db->usuarios;

function getTime(){
static $tempo;
if( $tempo == NULL ){
$tempo = microtime(true);
}else{
echo ‘Tempo (segundos): ‘.(microtime(true)-$tempo).”;
}
}

getTime();

for($i=0;$i<1000000;$i++){ //1 milhão de registros.
$obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );
$collection->insert($obj);
}
$filter = array(
"title" => "Calvin and Hobbes"
);
$cursor = $collection->find($filter);
$cursor->sort(array("title" => 1))->limit(4)->skip(0);
var_dump($cursor->count(true));
var_dump($cursor->count());
getTime();

echo "<br/><br/><br/>";

foreach ($cursor as $obj) {
echo $obj["title"]. " – " . $obj["_id"] . "<br/>\n";
}
$conexao->close();
?>
[/php]

Isso mesmo, ele vai inserir 1 milhão de registros e vai retornar o tempo, já botem o resultado aqui para agente comparar.

Abraços

3 Comments »

Meu Benchmark – pequeno comparativo MySQL e MongoDB

maio 6th, 2010 | by | benchmark, mongodb, mysql, nosql

mai
06

Inserindo/lendo
array(“title” => “Calvin and Hobbes”);
No MYSQL – Inserção
inserindo 50k
Tempo (segundos): 26.963586091995
inserindo 50k
Tempo (segundos): 35.74323797226
inserindo 50k
Tempo (segundos): 27.360780954361
inserindo 50k
Tempo (segundos): 27.239809989929
LEITURA dos 200k: Tempo (segundos): 0.16633296012878
MongoDB – Inserção
inserindo 50k
Tempo (segundos): 6.9094848632812
inserindo 50k
Tempo (segundos): 9.049604177475
inserindo 50k
Tempo (segundos): 4.2792370319366
inserindo 50k
Tempo (segundos): 10.331115007401
LEITURA dos 200k: Tempo (segundos): 0.14360809326172
As vezes a uma diferença de 100% mas provavelmente pode ser pelo sistema estar escrevendo outras coisas no HD, pq não deixei só os testes rodando.
Mas já é uma boa comparação.
Leitura Mysql:
$q = “select COUNT(*) total from teste_mysql where title=’Calvin and Hobbes’”;
getTime();
mysql_query($q);
Leitura Mongo
getTime();
$filter = array( “title” => “Calvin and Hobbes” );
$cursor = $collection->find($filter);
//$cursor->sort(array(“title” => 1))->limit(4)->skip(0);
var_dump($cursor->count(true));
//var_dump($cursor->count());
getTime();
Código mysql

[php]
<?php
$linkk = mysql_connect("localhost","root","****");
mysql_select_db("testes", $linkk);
function getTime(){ static $tempo; if( $tempo == NULL ){ $tempo = microtime(true); } else{ echo ‘Tempo (segundos): ‘.(microtime(true)-$tempo).”; } }
$q = "insert into teste_mysql VALUES(‘Calvin and Hobbes’)";
getTime();
for($i=0;$i<50000;$i++){
mysql_query($q);
}
getTime();
echo "<br />";
exit;
?>
[/php]

Código mongoDB

[php]
<?php
$conexao = new Mongo();
$db = $conexao->testes2;
$collection = $db->teste_mongo2;

function getTime(){static $tempo; if( $tempo == NULL ){ $tempo = microtime(true); } else{ echo ‘Tempo (segundos): ‘.(microtime(true)-$tempo).”; } }

getTime();

for($i=0;$i<50000;$i++){
$obj = array( "title" => "Calvin and Hobbes" );
$collection->insert($obj);
}

getTime();
$filter = array( "title" => "Calvin and Hobbes" );
$cursor = $collection->find($filter);
var_dump($cursor->count(true));
getTime();

echo "<br />";

$conexao->close();
exit;
?>
[/php]

1 Comment »