Tutorial para Instalação do Apache Cassandra
08/01/2013





Devcast – Iniciando com MongoDB
07/01/2013
Dia 23 de Dezembro de 2012 fiz o último Devcast do ano e o tema foi, nada melhor que, MongoDb. Então quem ainda não viu está ae o vídeo, fique a vontade para fazer perguntas.
ps: O seu Ofelquis conseguiu errar meu nome por isso está Sérgio Nascimento, mas meu nome é Jean Carlo Nascimento ;p
Replicação no CouchDB
04/01/2013
Tutorial para fazer replicações entre bases usando o Apache CouchDB.
Introdução ao modelo de dados do Apache Cassandra
07/11/2012
Autoras: Eliane Mara Casagrande e Jésika Pellegrini.
Histórico
Cassandra foi desenvolvido pelo Facebook para ajudar no funcionamento da caixa de busca do Facebook e armazenar/vasculhar todas as mensagens das caixas de entrada dos usuários. Foi liberado sob licença Open Source em julho de 2008. Cassandra começou como um projeto de incubação da Fundação Apache em janeiro de 2009. A primeira versão a ser lançada foi a 0.3 em março de 2010, encontrando-se atualmente na versão 1.1.6. Implementado em Java ele foi fortemente influenciado pelo Dynamo, da Amazon, pioneiro na criação de um banco de dados do tipo chave/valor. Cassandra implementa um modelo de replicação de dados parecido com o Dynamo – sem nenhum ponto único de falha. Porém a forma de armazenar os dados é mais semelhante ao Google Bigtable (orientado a colunas).
Cassandra se tornou tão popular por causa de suas excelentes características técnicas. É durável, facilmente escalável, eventualmente consistente e tolerante a falhas. Pode armazenar centenas de terabytes de dados com suporte para replicação em vários datacenters, é descentralizado e sem nenhum ponto único de falha, cada nó do cluster é idêntico. É altamente disponível e oferece um esquema livre de modelo de dados. Além de a administração do banco ser mínima.
Modelo de dados
O modelo de dados do Cassandra é projetado para dados distribuídos em uma escala muito grande, ou seja, milhares de dados distribuídos e replicados ao longo de várias máquinas (nós) que operam em conjunto de maneira a aparecem como uma única instância para o utilizador final. Desta forma Cassandra provavelmente não é a melhor escolha se você só precisa executar um único nó.
Cluster
A estrutura mais externa do Cassandra é o cluster, às vezes chamado de anel e é um recipiente para os keyspaces. Um cluster pode e geralmente tem mais de uma máquina ou nó que mantém uma réplica para diferentes faixas de dados. Se o primeiro nó para de funcionar, uma réplica pode responder a consultas. O protocolo peer-to-peer permite que os dados sejam replicados entre os nós de uma forma transparente para o usuário, e o fator de replicação é o número de máquinas do cluster que irá receber cópias dos mesmos dados.
Keyspace
Um keyspace é o contêiner mais alto para dados no Cassandra. O keyspace corresponde a um banco de dados no mundo relacional e assim como no mundo relacional os keyspaces possuem nomes e atributos que definem o seu comportamento. O Cassandra permite a criação de vários keyspaces por cluster ou aplicação, uma prática que não é muito recomendada. Por exemplo, se seu aplicativo é chamado Twitter, você provavelmente teria um cluster chamado Twitter-Cluster e um keyspace chamado Twitter.
Em Cassandra, os atributos básicos que podem ser definidas por keyspace são:
Replication factor: O fator de replicação refere-se ao número de nós que atuarão como cópias (réplicas) de cada linha de dados inseridos . Se o seu fator de replicação é 3, então, três nós no anel terão cópias de cada linha inserida, e essa replicação é transparente aos clientes. O fator de replicação essencialmente permite você decidir o quanto você quer pagar em desempenho para ganhar mais consistência. Ou seja, o seu nível de consistência para a leitura e escrita de dados baseia-se no fator de replicação.
Replica placement strategy: refere-se a forma como as réplicas serão colocados no anel. Existem diferentes estratégias para determinar quais nós vão receber as cópias de que chaves (keys), que podem ser:
SimpleStrategy – usada por padrão esta estratégia replica os dados em único data center, de uma forma que o usuário não tem noção da sua colocação no rack de dados.
OldNetworkTopologyStrategy - utilizado para distribuir os dados em diferentes racks no mesmo data center. Indicado para quando quiser assegurar alta disponibilidade no acesso aos dados.
NetworkTopologyStrategy - possibilita especificar como as réplicas dos dados serão colocados nos data centers.
Column Family: da mesma forma que uma base de dados relacional é um recipiente para tabelas, um keyspace é um recipiente para obter uma lista de uma ou mais famílias de coluna. Cada keyspace tem pelo menos uma e frequentemente muitas famílias de coluna.
Column Family
Uma família de coluna é aproximadamente análogo a uma tabela no modelo relacional, e é um recipiente para uma coleção de linhas. Cada linha contém colunas ordenadas. Column family representam a estrutura de seus dados.
No mundo relacional, quando você cria fisicamente seu banco de dados a partir de um modelo, especificando o nome do banco de dados (keyspace), os nomes das tabelas, e em seguida, defini os nomes das colunas que estarão em cada tabela.
Mas as semelhanças param por aí, Cassandra é considerado livre de esquema porque, embora as column family são definidas, as colunas não são. Você pode adicionar livremente qualquer coluna para qualquer column family a qualquer momento. Uma column family possui dois atributos: um nome e um comparador (indicada como as colunas serão organizadas quando retornadas por uma query). As colunas estão armazenadas em arquivos separados no disco, é importante manter colunas relacionadas definidos em conjunto na mesma coluna família.
Super Column Family
É um conjunto de colunas, ou seja, para cada linha da ColumnFamily, podemos ter SuperColumns que possuam várias colunas. Por padrão column families são configuradas com o tipo Standart, para uma super column Family você configura seu padrão para o tipo super.
Column
Situada dentro de uma column family ou super column Family, a coluna é a unidade mais básica da estrutura de dados no modelo de dados Cassandra. Uma coluna é composta de um nome, um valor e um timestamp. Os tipos de dados para o nome e valor são matrizes de bytes Java, frequentemente fornecidos como strings. Uma vez que o nome e o valor são tipos binários, que podem ser de qualquer comprimento. O campo timestamp funciona como uma bússola verificando o campo mais atual entre as replicas.
Exemplo modelo de dados do Cassandra:
Fonte: Adaptado de Demoiselle Cassandra
Na imagem acima tem-se um exemplo simplificado do banco de dados do Twitter, onde:
O Twitter Cluster é a estrutura mais externa, e possui duas máquinas (nós) conectados (nó 01 e nó 02), todos os dados salvos ou alterações feitas no nó 01 são replicados no nó 02, assim se uma das máquinas parar de funcionar, o sistema não cairá e o usuário conseguirá acessar normalmente sua conta e suas informações. O keyspace Twitter possui 3 columns families – users, following e followers. Na column Family Users existem 3 usuários cadastrados, a usuária Iara não informou sua idade e nem seu peso ao criar sua conta, desta forma, estas duas colunas não existem, o que economiza espaço na memória e é uma das grandes vantagens do Cassandra, no momento em que ela cadastrar estas informações no sistema, o Cassandra automaticamente criará a coluna para salvar estes dados. Quando a usuária Iara passou a seguir a usuária Nice, criou-se uma nova coluna para salvar o nome do usuário que ela passou a seguir (column family Following), ao mesmo tempo em que adicionou-se uma nova coluna na usuária Nice para que ela possa saber quem começou a segui-la (column family Followers).
Mais informações em : http://cadmintool.blogspot.com.br/
Referências:
Apache Cassandra: The Definitive Guide – http://bigdata.googlecode.com
The Apache Software Foundantion – http://cassandra.apache.org
Demoiselle Cassandra –
http://demoiselle.sourceforge.net/docs/guide-cassandra/1.0-v1/html_single/
DATASTAX – http://datastax.com
Estou fazendo meu TCC sobre NoSQL, por onde começo?
06/11/2012
Primeiramente antes de tudo, o trabalho de conclusão de curso é uma espécie de pesadelo que atormenta várias pessoas, que pretendem se graduar em um determinado curso superior. E como é de se esperar, escolher um campo de estudo e elaborar um tema é uma tarefa difícil.
Comigo não foi diferente, pois decidi fazer meu trabalho abordando os novos tipos de bancos de dados, que solucionasse algo para tal situação. Mas antes de tudo, pensar em um tema que fosse abordar um problema e uma possível solução estava difícil. E assim várias possibilidades
de tema foram surgindo com os novos bancos de dados (BD), que foram especialmente criados para soluções distribuídas : os bancos de dados Not Only SQL (NoSQL).
Os BD NoSQL surgiram para solucionar os problemas dos BD relacionais, tais como problemas de escalabilidade e desempenho. Há também o custo computacional que é necessário para alcançar solucionar estes principais problemas. Em ambientes distribuídos por exemplo a Internet, utilizando um BD relacional como meio de armazenamento de dados de uma aplicação Web, por exemplo uma rede social, conseguimos facilmente chegar a estes dois problemas, o qual gera lentidões no tráfego de dados pela Internet.
Assim, analisando este caso tenho dois problemas e uma possível solução, onde para escalar uma aplicação na Web devemos ter meios e/ou mecanismos de armazenamento de dados, que possibilitem de forma simples e fácil, chegar a escalabilidade e conseguir um bom desempenho.
Portanto escalar é incorporar os limites físicos à questão do desempenho.
Então várias ideias foram surgindo conforme analisava este caso. Pode-se citar alguns possíveis trabalhos utilizando BD NoSQL, onde o foco é conseguir um bom desempenho em aplicações Web no qual há um acesso aos dados, de forma concorrente e massiva:
- replicação de BD relacional para BD NoSQL;
- estudo de replicação de um determinado BD NoSQL;
- comparativo entre BD relacional e BD NoSQL, mostrando as suas diferenças e casos de usos em situações reais;
- estudo comparativo com uso de Benchmark; e
- outros inúmeros possíveis temas abordando os BD NoSQL.
Podemos ver que há um grande campo a se explorar nesta área, onde o mais interessante dos BD NoSQL tem de vantagem : a liberdade de modelagem dos dados, sem a necessidade de um padrão, o que rompe o império de mais 30 anos dos BD relacionais, bem conhecidos por grande parte dos desenvolvedores de aplicações Web e Desktop.
Portanto, a princípio tomei a decisão de efetuar um comparativo entre um BD NoSQL e um BD relacional, no qual resultou em um pequeno projeto de Benchmark entre o MongoDB e MySQL.
Porém, meu orientador pediu para restringir o comparativo apenas para BD NoSQL, o qual iria estudar apenas os dois bancos de dados mais utilizados. Mas como há vários tipos de BD NoSQL, escolhi um BD orientado à documentos (MongoDB) e um orientado à colunas
(Cassandra).
Encontrar materiais sobre ambos os BD NoSQL, encontrei nos sites de cada um destes BD, o qual todo estava em inglês. Basicamente é uma selva a desbravar, pois foi um desafio conseguir referências sobre o assunto geral, sendo o NoSQL uma tecnologia nova, no qual a maioria dos
materiais referentes ao assunto estão em inglês, porém graças ao grupo NoSQL Brasil no Facebook, encontrei muitas referências interessantes.
Portanto, o meu trabalho resulta a um estudo comparativo, baseado em um Benchmark baseado no OSDB – Open Source Databases Benchmark, o qual é apenas utilizado em BD relacionais, adaptando-o para BD NoSQL.
Então, a ideia geral do meu trabalho é fazer um Benchmark entre dois BD NoSQL (MongoDB e Cassandra), como mencionado é baseado no OSDB. Assim, o OSDB é composto por 3 módulos:
- módulo de estrutura e carga;
- módulo mono-usuário; e
- módulo multi-usuário.
Sendo estes três módulos que ajudarão na obtenção dos resultados, no qual estou fazendo os testes de desempenho, onde coleto o tempo de resposta de cada BD. Logo mais terei o resultado final do Benchmark entre os dois BD NoSQL, onde cada um destes possuí uma característica própria, por exemplo o modelo de dados de ambos são diferentes porém poderosos, capazes de armazenar informações diversas e de forma rápida, o que impressiona a forma como estes trabalham.
Bom é isso galera, espero ter ajudado a vocês que talvez estejam em dúvida do que estudar, que tema abordar, qual BD NoSQL estudar.
Modelos Ricos: Um outro motivo para usar NoSQL
06/11/2012
Mais um ótimo conteúdo do meu querido amigo e mestre Luciano Ramalho. Nessa apresentação o Luciano mostra como os bancos NoSQL podem agregar em sistemas complexos com modelos diferentes.
Slides: http://www.slideshare.net/ramalho/modelos-ricos
Video: http://www.youtube.com/watch?v=piSbDWeu3pM
Entendendo o DBRef do MongoDb, por que e quando usar.
05/11/2012
No post passado o Douglas mostrou alguns problemas que ele estava tendo e como resolveu, nesse caso ele esta usando DBRef e algumas pessoas já vieram me perguntar se é aconselhável usar, então vou falar algo que sempre falo nas minhas palestras: depende.
Ta mas por que depende?
Depende da modelagem do seu objeto, pois quando você referencia um objeto com DBRef você sempre irá consultá-lo quando o seu objeto “pai” for consultado, ou seja, se você estiver referenciando um objeto que vai crescer bastante isso irá onerar bastante sua consulta, logo nesses caso é melhor você criar a referencia manualmente com _id.
Fora que você só irá conseguir utilizar seu objeto referenciado após um fetch(), o qual te limita a manipulação desse objeto.
“The drivers [1] do not automatically resolve DBRefs into documents”
Mas se ele me limita tanto por que usá-lo?
Bom eu aconselho a usar o DBRef quando seu objeto referenciado for pequeno e não for aumentar ou caso sua collection possa mudar de nome, pois nesse caso fica mais fácil para atualizar os valores. Também é aconselhável para objetos que você sempre quer pegar seus valores. Por exemplo uma listagem de pacientes em que o meu sistema sempre vai querer saber quais são seus remédios, nesse caso o uso do DBRef é muito aconselhável. Exemplo de estrutura: https://gist.github.com/3858732
Espero ter dado uma clareada em seus pensamentos e qualquer dúvida é só comentar aqui.
Mude seu jeito de pensar quando utilizar MongoDB
05/11/2012
Antes de falar um pouco da minha experiência com o MongoDB, gostaria de agradecer a oportunidade disponibilizada pelo Suissa para compartilhar essa informação no NoSQLBr. Muito obrigado!!
Há meses estou submerso em um projeto que utiliza o MongoDB, foi escolhido depois de uma longa discussão com a equipe, sua eficiência e agilidade de processamento, quando bem configurado a coisa fica monstra. Porem me deparei com um problema que deve afetar todos ao trabalhar com um banco de dados NoSQL a FORMA DE SE PENSAR E PROJETAR o banco. Como sempre trabalhei com banco de dados relacionais, projetei o MongoDB de forma idêntica a um banco de dados relacional e ai começou a minha dor de cabeça. Estava tendo que tirar leite de pedra para alimentar um monstrinho com muita fome, ou seja, tinha que ter um esforço fora do comum para alimentar um aplicativo que exigia informações relacionadas e simples ao usuário final. Por exemplo:
[Usuários] -> Onde são cadastrados todos os usuários.
[Amigos] -> Onde são cadastradas os relacionamentos dos amigos de cada usuário.
Sendo assim em um banco relacional teríamos isso:
[Usuário] 1 -> N [Amigo]
Foi ai que deu inicio ao caos (rssss). Na hora de resgatar algumas informações tinha um trabalho imenso e neste caso estava tendo que executar dois processos.
1 – Listar os ID’s que estavam na tabela de Amigos
2 – Verificar os ID’s encontrados no passo 1 e verificar suas informações
Em PHP seria algo assim:
<?php … $collection = new MongoCollection($db, 'amigo'); $query = array('idUsuario' => new MongoId(123)); $list = $collection->find($query); foreach ($list as $value) { $temp[] = new MongoId($value->idAmigo); } … $collection = new MongoCollection($db, 'usuario'); $queryAmigo = array('_id' => array('$in' => $temp)); $listAmigo = $collection->find($queryAmigo); … // Executaria dois processos… para algo relativamente simples, agora // imagine um relacionamento envolvendo mais tabelas… ?>
Solução do problema:
<?php
$conexao = new Mongo(); // Iniciando uma conexão com o MongoDB
$db = $conexao->testandoomongo; // Criando uma base de dados
// Usuarios inseridos.
$db->usuarios->insert(array("_id"=>1,"name"=>"User01"));
$db->usuarios->insert(array("_id"=>2,"name"=>"User02"));
$db->usuarios->insert(array("_id"=>3,"name"=>"User03"));
// Criando referencia de um usuario.
$infoUser = $db->usuarios->findOne(array('_id' => 2));
$refUser = $db->usuarios->createDBRef($infoUser);
// Adiciona a referencia
$db->usuarios->update(array('_id'=>1),array('$push'=>array('amigos'=> $refUser)));
// Consulta o usuario 1
$consulta = $db->usuarios->findOne(array("_id"=>1));
foreach ($consulta["amigos"] as $con) {
// pega a referencia do usuario
$ref = $db->usuarios->getDBRef($con);
print_r($ref);
}
?>
Então comecei a perceber que estava na hora de mudar a forma de pensar e de utilizar o MongoDB. Quando pensar em MongoDB pense como se fosse um grande objeto. Abaixo listei 3 dicas que não esquecerei jamais:
1 – Não utilize técnicas de banco relacional no MongoDB;
2 – Pense que as tabelas do MongoDB são grandes objetos que a qualquer momento podem mudar sua forma “física”;
3 – Quando for programar tente ao máximo utilizar o raciocínio lógico, explorando ao máximo seu objeto evitando o excesso de processamento do MongoDB.
Grande abraço a todos e fica a dica, qualquer coisa manda a dúvida que agente discute e tentar encontrar a melhor solução. Valeuuu!!
Trabalhando com Relacionamentos: bancos de dados baseados em grafos e o Neo4j
24/09/2012
“Imagine uma aplicação que deve manter as informações relativas a viagens e locais onde pessoas moraram. Com isso, deve ser possível saber quando uma pessoa viajou ou qual o período em que ela viveu em determinada cidade.”
Nesse artigo da Caelum podemos perceber como a modelagem em grafos é mais simplista que a relacional e como devemos trabalhar com eles.
artigo: http://blog.caelum.com.br/trabalhando-com-relacionamentos-bancos-de-dados-baseados-em-grafos-e-o-neo4j
[Dica da Semana] Como renomear campos com MongoDB
07/08/2012
Venho por meio deste artigo reviver esse blog que por falta de tempo minha acabou às traças. Bom sem mais delongas vamos aprender como renomear campos das nossas collections com MongoDB.
Para o pessoal relacional é uma coisa até simples executar um comando como esse: ALTER TABLE users RENAME COLUMN user_name to name. Porém com o MongoDB não possui essa “facilidade” apesar de ser bem fácil fazer o mesmo no MongoDB.
Vamos ao que interessa, nós utilizaremos o modificador $rename
db.users.update( {} , { $rename : { ‘user_name’ : ‘name’ }}, true, true );
- {} – o conjunto vazio é porque queremos todos os registros
- $rename – o modificador para o comando de atualização que, neste caso: substituiu “user_name” por “name”
- false – permitir upserts caso o registro não exista
- true – multi option: significa aplicar comando para todos os registros, já que, por padrão, o update() atualiza apenas o primeiro registro
Essa técnica é simples porém não esqueça de deletar seus índices antigos que utilizem a nomenclatura antiga e refaçam para a nova.
Servidor free que roda Mongo
30/01/2012
Opa o grande Rodrigo Santiago me deu uma dica de um host que roda PHP e MongoDB, se vc não acredita olha isso http://phpinfo.cloudcontrolled.com/
Já me cadastrei mas ainda não testei o serviço, mas com certeza farei isso. https://www.cloudcontrolled.com/
Scalable SQL and NoSQL Data Stores – pdf
27/01/2012
Pessoal achei um pdf interessante sobre NOSQL do Rick Cattell quem quiser dar uma olhada está aí o link: http://cattell.net/datastores/Datastores.pdf
Reparar o MongoDB no Ubuntu
25/01/2012
Nesse post vou explicar como reparar o MongoDB no Ubuntu de forma fácil e rapida. Eu particularmente tive um problema com o mongo esses dias, onde sempre que eu tentava efetuar uma conexão com o mongo recebia o seguinte erro:
Error: couldn't connect to server 127.0.0.1} (anon):1137
Pesquisando um pouco na net, descobri que esse erro acontece devido algum desligamento incorreto efetuado anteriormente. Vamos ver agora como corrigir.
Por que o mongodb não inicia?
Infelizmente até o momento o mongodb não consegue se recuperar muito bem quando ele crasha o que nos força a ter que recuperá-lo na unha.
- Para iniciar vamos tentar conectar no mongo (digite
mongono terminal). Você provavelmente recebeu o erro citado acima. - Agora vamos verificar se ele está rodando. Para isso digite
sudo status mongodb, isso deverá retornarmongodb stop/waiting. - Tente iniciar o serviço com o comando sudo start mongodb. No terminal vai aparecer que o serviço foi iniciado (
mongodb start/running, process XXXX), porém se você der umsudo status mondodbnovamente, verá que ele continua paradostop/waiting. - Abra o arquivo de logs do mongo para ver se o seu problema é igual o meu. Ele fica em /var/log/mongodb/mongodb.log.
************** old lock file: /var/lib/mongodb/mongod.lock. probably means unclean shutdown recommend removing file and running --repair see: http://dochub.mongodb.org/core/repair for more information *************
Vamos agora a correção do problema:
- Vamos remover manualmente o arquivo .lock com o comando:
sudo rm /var/lib/mongodb/mongod.lock - Agora vamos executar o script para reparar o mongo:
sudo -u mongodb mongod -f /etc/mongodb.conf --repair. - Após executar o script inicie o serviço do mongo:
sudo start mongodb. Verifique se o serviço está mesmo rodando(sudo status mondodb) e depois tente conectar a base de test(mongo test).
Espero que isso ajude todos que tiverem o mesmo problema que eu.
Valeu galera e até a próxima!
Grupo do NoSQL Brasil no facebook
28/12/2011
Pessoal como o facebook anda movimentando bastante os grupos de desenvolvedores resolvi criar o grupo para discutirmos sobre NOSQL la e quem sabe agregar mais colaboradores para o portal, lembrando que quem quiser escrever algum artigo é só me avisar que eu adiciono como autor.
Como o grupo foi criado hoje ainda não possui uma url amigável mas quando tivermos um número suficiente terá. Conto com vocês!!!
link grupo: http://www.facebook.com/groups/207239866029581/
Como instalar MongoDB no Linux
23/11/2011
Vou demonstrar como instalar o MongoDB no Linux (Ubuntu):
Abra o terminal e vamos instalar o MongoDB via apt-get:
sudo apt-get install mongodb
Agora precisamos criar 2 pastas:
sudo mkdir /data
cd /data
sudo mkdir db
sudo chown seu_usuario_linux db
PRONTO! Agora podemos rodar nosso MongoDB com o comando mongod para iniciar o serviço e com mongo nós abrimos o cliente no terminal.
Qualquer problema na instalação posta aqui nos comentários para que possamos ajudar.
ps: quase sempre é problema de permissão nas pastas.
GridFS no MongoDB
14/11/2011
A propriedade GridFS no MongoDB é indicada pra se trabalhar com um grande volume de arquivos e muitos acessos simultâneos. Ela também é ideal para trabalhar com arquivos maiores que 4MB.
Isso não quer dizer que ela não seja indicada para arquivos menores, muito pelo contrário. A diferença é que, em arquivos maiores que 4MB o GridFS automaticamente divide o arquivo em partes (ou chunks) praticamente automatizando o autosharding .Uma mão na roda.
Mas agora, vamos ao que interessa.
Por quê usar a propriedade GridFS?
- Você não irá precisar se preocupar com as limitações dos sitemas operacionais, como nomes de arquivos com acentos e nomes estranhos;
- O Mongo gera automaticamente um hash MD5 e o salva junto com o documento, o que é útil para saber se o arquivo foi enviado corretamente ou se ele já existe no servidor;
- Caso seus arquivos sejam muito grandes, o MongoDB automaticamente quebra ela em diversas partes para que seja processado pelo sistema operacional sem problemas;
- Se seu servidor estiver configurado para autosharding e/ou replicate a propriedade GridFS já fará esse trabalho automaticamente.
Fazendo UPLOAD usando GridFS via MongoDB Driver
PHP::
// conectar ao mongo e a collection
$mongo = new Mongo();
$db = $mongo->teste;
// usando a clase GridFS
$grid = $db->getGridFS();
// caminho do arquivo a ser enviado
$caminho = "/tmp/";
// nome do arquivo
$arquivo = "imagem-teste.png";
// armazenando as informações de metadata do arquivo
$metadata = array(
"filename" => $arquivo,
"downloads" => 0,
"comment" => "Meu primeiro arquivo no Mongo"
);
$grid->storeFile($caminho . $arquivo, $metadata);
::PHP
Para que esse pequeno script funcione é preciso ter instalado o driver do MongoDB para o PHP e tê-lo inicializado. Este exemplo acima funciona perfeitamente utilizando forms multipart/form-data e $_FILES.
Metadata
Para o PHP o uso da Metadata não é de suma importância, porém em outras linguages esses dados são necessários. O MongoDB fornece essa opção fazendo que seus dados possam ser acessados por outras linguagens em outros dispositivos caso seja necessário. Você também pode inserir qualquer campo metadata que necessitar.
Resgatar um arquivo com GridFS
PHP::
// conectar ao mongo e a collection
$mongo = new Mongo();
$db = $mongo->teste;
// usando a clase GridFS
$grid = $db->getGridFS();
// procurando a imagem pelo nome
$imagem = $grid->findOne("imagem-teste.png");
// retorna imagem ao browser
header('Content-type: image/jpeg');
echo $image->getBytes();
::PHP
Nos próximos artigos vou comentar sobre os outros recursos da classe GridFS, que facilita muito a vida do desenvolvedor. Espero que tenham gostado do meu primeito post aqui no NoSQL BR e espero poder contribuir cada vez mais para que essa comunidade só venha a crescer. Um obrigado especial ao Suissa pelo espaço e enjoy
Modelos ricos: outro motivo para usar NoSQL
03/11/2011
“A motivação mais comum que leva as empresas a usar NoSQL é a escalabilidade. Mas se você lida com objetos complexos em sua aplicação, como entidades espalhadas em dezenas de tabelas normalizadas, pode ser que uma alternativa NoSQL seja útil para o seu projeto, mesmo que ele não tenha zilhões de usuários simultâneos”. Essa pertinente colocação levouLuciano Ramalho, supervisor de desenvolvimento na BIREME/OPAS/OMS e referência no mundo Python, a apresentar noNoSQLBr 2011 o case OpenTrials para o Registro Brasileiro de Ensaios Clínicos. Trata-se de uma plataforma virtual de acesso livre financiada pelo Ministério da Saúde, entre outras entidades, e que tem por finalidade registrar estudos experimentais e não-experimentais realizados em seres humanos, por pesquisadores brasileiros e estrangeiros.
Luciano conta que a missão dele e de sua equipe era a de renovar métodos, práticas e ferramentas de desenvolvimento. Como primeiro passo, o desafio foi migrar do “PHP sem framework” para Python com Django. E explicou em detalhes como foi realizado esse projeto, desde a criação, a partir de ferramentas open source e práticas ágeis, até as lições aprendidas no processo fazendo uso da persistência poliglota com um “mix” de BD relacional com banco de dados NoSQL, e a “solução” para o OpenTrials com o CouchDB (considerando que o MongoDB também seria apropriado para o projeto em questão).
Assista ao vídeo com a íntegra da palestra de Luciano Ramalho no NoSQLBr 2011:
http://www.gonow.com.br/blog/2011/11/02/modelos-ricos-outro-motivo-para-usar-nosql/
Klaus Wuestefeld e o Prevayler: afinal, por que você ainda usa banco de dados?
03/11/2011
Em um teste de escalabilidade e resultados, enquanto o Prevayler, open source, retorna 228.369 queries por segundo, um sistema Oracle responde de forma 9983 vezes mais lenta que o Prevayler. Você acreditaria nesse cálculo impressionante? Esse é, contudo, um dos projetos de software livre brasileiros mais conhecidos no mundo. E quem o apresenta “sem maquiagem alguma”, como gosta de ressaltar, é Klaus Wuestefeld, pioneiro de Extreme Programming no Brasil e criador do Prevayler.
“O Prevayler é a implementação do conceito de prevalência. E a prevalência é o terceiro mecanismo de persistência mais simples possível”, resume ele. Em sua palestra com o provocativo nome “Você ainda usa banco de dados?”, na segunda edição do encontro NoSQLBr, em São Paulo, Klaus fez uma apresentação bastante inusitada dos conceitos que permeiam o produto. Preocupou-se mais em fornecer uma breve introdução sobre o que vem a ser esse pattern de prevalência de sistemas“1 mil a 10 mil vezes mais rápido que um banco de dados relacional” para, em seguida, listar as perguntas do público presente sobre a eficiência do Prevayler.
Ele anotou uma a uma e defendeu o uso do Prevayler com base nas seguintes contestações:
- Schema Evolution
- Dependência de um sistema externo
- Dados sem schema
- Meu sistema irá crescer “300 mil vezes”
- OLAP / Análise
- Clustering
- Sistema pesado em escrita
- Ambiente híbrido / Vários sistemas acessando os mesmos dados
- Paralelismo, concorrência
- Corrupção de dados
- Alta disponibilidade
- Segurança
E as duas perguntas mais intrigantes de todas:
1. Por que não tem mais gente usando?
2. Quem vai me ajudar se der tudo errado?
As respostas para essas e outras questões sobre o Prevayler, incluindo as características que definem sua persistência e espelhamento transparentes e transações ACID “ridiculamente simples”, você vê em detalhes no vídeo com a íntegra da palestra de Klaus Wuestefeld no NoSQLBr 2011:
OpenShift: NoSQL “a la carte” em um PaaS 100% open source
30/10/2011
Edgar Silva é Solutions Architect Manager na Red Hat Brasil, responsável pelo time que define as tecnologias e soluções de plataformas Linux, middleware, virtualização e cloud computing. Na segunda edição do NoSQLBr, Edgar fez uma apresentação sobre o OpenShift, o PaaS da Red Hat, com demonstrações práticas de como utilizá-lo em conjunto com tecnologias como MongoDB e Infinispan para recurso de armazenamento de aplicações (que podem estar escritas em diversas linguagens, entre elas Python, PHP, Java e Ruby).
Edgar tem como missão na empresa pesquisar como combinar vários conceitos computacionais e de negócios para encontrar a solução mais adequada aos desafios de projetos propostos por seus clientes. “Até que ponto são relevantes questões como sistema operacional ou linguagem? As empresas querem ser bem atendidas, não importa muito tecnologia, linguagem ou sistema operacional. A questão está cada vez mais focada em negócios mesmo”, diz ele.
Com a “nova onda” de Cloud, várias soluções de PaaS surgem como alternativa para empreendedores e pequenos investidores atrairem negócios e transformar meras ideias em casos de sucesso. Projetos relacionados a dados públicos, jogos online em HTML5 para dispositivos móveis e geolocalização, entre outros, são casos de uso candidatos para começarem a ser desenvolvidos nesse tipo de infraestrutura – gratuita – como o OpenShift.
Assista ao vídeo com a íntegra da palestra de Edgar Silva no NoSQLBr 2011: clique aqui
Referência: Gonow Tecnologia - http://www.gonow.com.br/blog/2011/10/26/openshift-nosql-a-la-carte-em-um-paas-100-open-source/
Por que escolher um banco de dados baseado em grafos?
29/10/2011
Antes de responder a pergunta acima, pense primeiro numa questão mais abrangente: o que é modelagem de dados? E ainda numa segunda, esta um pouco mais específica: como devemos consultar e atualizar um banco de dados? As respostas certamente não são tão simples, mas pelo menos agora já existem alternativas mais flexíveis das que haviam em um passado não muito distante. A modelagem em grafos, para o engenheiro de software inglês Alistair Jones, é uma delas.
Alistair trabalha na Neo Technology, empresa desenvolvedora do neo4j, um banco de dados baseado em grafos open source “poderoso e expressivo para armazenar, consultar e manipular dados”. Ele é considerado um “expert” em metodologias ágeis – especificamente para testes de desempenho – e, no segundo encontro NoSQLBr, ocorrido em São Paulo na semana passada, Jones apresentou um overview sobre a modelagem baseada em grafos, pontuando princípios e diferenças em relação aos modelos tradicionais de modelagem de dados.
“O melhor modelo é o que melhor resolve o seu problema”
Esse “mantra” você já deve ter ouvido – e entoado – algumas vezes, e não só em se tratando de modelagem de dados. Mas não custa reforçar que apegar-se a um modelo único como sendo a tal “bala de prata” que solucionará todos os seus problemas é algo bastante arriscado. E a respeito disso, voltando à pergunta inicial, por qual motivo você escolheria um banco de dados baseado em grafos? Esse modelo facilita o acesso a dados em redes ou hierarquias, via múltiplos nós.
E o mais importante: você precisa de flexibilidade para acessar os dados no futuro (um modelo baseado em grafos, ressalva Alistair Jones, é mais fácil de mudar que os outros). Como exemplo, ele mostra como poderia ser a modelagem de dados para um site disponível em vários idiomas.
O que há de diferente?
- Você deixa a manutenção dos relacionamentos para o banco de dados
- Chaves substitutas desaparecem ou são desnecessárias (com exceção do ID)
- Relacionamentos ganham um nome explícito
Princípios da modelagem em grafos
Os “nós” representam conceitos múltiplos: com isso, é possível quebrá-los e distingui-los uns dos outros.
Adotar o paradigma > Nós por identidade (ID) >> Relacionamentos por acesso
Relacionamentos para consultas ao banco
- Relacionamentos devem ser o principal meio para acessar dados em nós
- Fazer traverse é barato: essa é a principal vantagem de usar um banco de dados baseado em grafos
- A modelagem em grafos é similar à modelagem relacional, só que mais fácil
Assista ao vídeo com a íntegra da apresentação de Alistair Jones no NoSQLBr para entender em detalhes como funciona a modelagem de dados baseada em grafos:
Referência: Gonow Tecnologia - http://www.gonow.com.br/blog/2011/10/25/por-que-escolher-um-banco-de-dados-baseado-em-grafos/
Concorrência e Redis com Ruby
28/10/2011
Um ótimo artigo mostrando um pouco de código de Ruby com Redis e sua concorrência.
http://santosh-log.heroku.com/2011/07/02/concurrency-and-redis/
Como instalar Redis no Linux
28/10/2011
Quem não conhece o redis ele é um banco de dados NOSQL do tipo chave:valor persistente e distribuído, ou seja, ótimo para cache.
Para instalarmos ele é bem simples siga esses comandos:
$ wget http://redis.googlecode.com/files/redis-2.2.8.tar.gz
$ tar xzf redis-2.2.8.tar.gz
$ cd redis-2.2.8
$ make
Para rodar o servidor é 'so ir na pasta src e mandar rodar o redis-server:
$ cd src && ./redis-server
Para testá-lo com o cliente do redis é só seguir:
$ cd src && ./redis-cli redis> set nome Suissa OK redis> get nome "Suissa"
Simples e fácil como é o próprio banco.
Neo4j REST API
28/10/2011
Venho por meio deste compartilhar com vcs este ótimo post demonstrando a API REST do Neo4J. Ficando desta forma muito mais fácil de testá-lo.
http://plindenbaum.blogspot.com/2011/07/neo4j-rest-api-my-notebook.html
Palestra sobre Blog e Mídias Sociais + NOSQL
16/06/2010
Terça-feira, 15 de Junho, dei uma palestra na FAFIT-FACIC de Itararé-SP explicando como os blogs e as mídias sociais podem ser utilizadas para o nosso crescimento profissional e o case explicado nela foi esse blog sobre NOSQL e a conexão criada com o iMasters apartir do twitter, vocês podem conferir os slides da palestra abaixo.
http://www.slideshare.net/suissapg/blog-e-midiassociais
Santo Large Hadron Collider, Batman!
06/06/2010
Valentin Kuznetsov acaba de apresentar um trabalho na Conferência Internacional sobre Ciência Computacional sobre a utilização do CERN MongoDB para os dados do Large Hadron Collider. O papel, o CMS de agregação de dados do sistema, está disponível como um PDF no ScienceDirect.
Um resumo
“CMS” significa Compact Muon Solenoid, um detector de partículas da física construída sobre o Large Hadron Collider. O projeto CMS publicado possui alguns quadrinhos que proporcionam uma agradável e simples explicação do que o CMS / LHC faz.O LHC gera enormes quantidades de dados de todas as variedades, que é distribuído através de uma rede mundial. Ele envia mensagens de status para alguns dos computadores, informações do trabalho de monitoramento para outros computadores, informações contábeis ainda em outro lugar, e assim por diante.Isto significa que cada local tem consultas especializadas que pode fazer sobre os dados que possui, mas até agora tem sido muito difícil para consultar através de toda a rede.Como funciona
O sistema de totalização MongoDB usa como cache. Ele verifica se Mongo tem a agregação que o usuário está pedindo e retorna-o, caso contrário, o sistema faz a agregação e salva-o Mongo.Eles consultam o sistema usando uma SQL, linguagem simples, como a que eles transformam em uma consulta MongoDB. Então, algo como file = “abc”, execute> 10 torna-se “file:” abc “,” executar: (“$ (gt”: 10)). (Não é o mesmo que o SQL, mas o código para isso poderia ser interessante para pessoas que querem usar consultas SQL com MongoDB).Se o cache não contém a consulta solicitada, o sistema itera sobre todos os lugares do mundo que poderia ter essa informação e consulta-los, recolhendo os seus resultados. Em seguida, ele mescla todos os resultados, fazendo uma espécie de “GROUP BY” operação baseada em pré-identificação dos grupos e insere as informações agregadas no cache.Ele foi construído usando o driver Python.Objetivos
Eles estão ansiosos para testá-lo em campo e escalar horizontalmente o sistema com sharding. Como se trata de uma grid aggregation/querying tool, eles também estão interessados na sua aplicação a problemas fora do LHC e o CERN.
Sistema de prioridades em PHP e MongoDB
29/05/2010
Eu queria começar a aprender sobre NoSQL especificamente sobre o MongoDB e nada melhor como fazer algo na pratica. Passei por alguns momentos de dificuldade especialmente no update, já que era a primeira vez.
Eu fiz ele todo orientado a objetos, primeiro comecei com a conexão com o banco de dados
[php]
class conexao{
function __construct(){
$nome_banco = ‘prioridades’;
$nome_collection = ‘tarefas’;$this->conexao = new Mongo();
$this->db = $this->conexao->$nome_banco;
$this->collection = $this->db->$nome_collection;header (‘Content-type: text/html; charset=utf-8′);
}
}
[/php]Sem muitos problemas aqui, a unica coisa, foi o utf8, pois tive alguns problemas de codificação na hora de inserir os dados, se você rodar esse código, ele já vai criar o banco e a collection automaticamente caso ela não exista.
O metodo de mostrar um registro especifico tem um segredinho, que é a criação de um MongoID, sem ele não consegui encontrar o registro. O findOne, só retorna 1 documento.
[php]
function mostrar($_id){
$mongo_id = new MongoID($_id);
return $this->collection->findOne(array(‘_id’ => $mongo_id));
}
[/php]O metodo que usei para listar é bem simples
[php]
function listar($filter){
return $this->collection->find($filter);
}
[/php]A parte de inserir um documento no banco de dados, foi bem fácil também. Para inserir, você coloca em um array todas as informações, o campo e o valor dele.
[php]
function inserir(){
$this->query = array(
‘UsuarioID’ => $this->UsuarioID,
‘Usuario’ => $this->Usuario,
‘Tarefa’ => $this->Tarefa,
‘Tipo’ => $this->Tipo,//Obrigatório, idéia, outro
‘Prioridade’ => $this->Prioridade
);
$this->collection->insert($this->query);
}
[/php]O método de exclusão também não tem segredos, é só criar o MongoID que esta tudo certo
[php]
function excluir(){
$this->mongo_id = new MongoID($this->_id);
$this->collection->remove(array(‘_id’ => $this->mongo_id));
}
[/php]Agora vamos lá, a parte que eu tive mais dificuldade que foi o update. No update, é preciso usar o $set para alterar um campo especifico da collection, sem ele, ele vai alterar o documento todo, vai remover todo o resto e vai manter apenas o campo que você passar ali. Uma dificuldade que eu tive, foi que o $set só funciona com aspas simples, com aspas duplas ele definitivamente não funcionou.
[php]
function mudar_tarefa(){
$this->mongo_id = new MongoID($this->_id);
$this->collection->update(array(‘_id’ => $this->mongo_id), array(‘$set’ => array(‘Tarefa’ => $this->Tarefa)), false);
}function mudar_prioridade(){
$this->mongo_id = new MongoID($this->_id);if($this->modo==’up’){
$this->collection->update(array(‘_id’ => $this->mongo_id), array(‘$inc’ => array(‘Prioridade’ => 1)), false);
}elseif($this->modo==’down’){
$this->collection->update(array(‘_id’ => $this->mongo_id), array(‘$inc’ => array(‘Prioridade’ => -1)), false);
}
}
[/php]O $inc, serve para incrementar um valor em mais 1 ou menos 1, isso ai você pode especificar da maneira que você quiser. Lembrando que você tem que criar o MongoID para poder alterar o documento.
Essa ai é a classe que usei para fazer o sisteminha. As minhas dificuldades foram bobas, mas só vendo isso agora, pois não consegui encontrar em nenhum lugar sobre isso, principalmente sobre as aspas simples.
Ta aqui o download para quem quiser baixar.
http://www.megaupload.com/?d=5I0VX4I4
Mitos sobre NoSQL
29/05/2010
Com essa onda de NoSQL pra cá, NoSQL pra lá, muitos ainda tem muitas duvidas em relação ao NoSQL, de quando usar, como usar e etc. E como não podia deixar de ser, vários mitos estão rodeando esse novo conceito de banco de dados.
Afinal o que é NoSQL?
NoSQL é uma nova forma de bancos de dados, que não usam apenas os comandos SQL que você está acostumado, SELECT, UPDATE, DELETE e todas as váriaveis dele. Normalmente essas instruções foram trocadas por funções e muitas vezes já em oop.
Não é só porque ele não usa instruções SQL que ele é melhor que o banco de dados que você usa. Os bancos de dados atuais, são muito antigos, o MySQL por exemplo começou em 1994, utilizando o modelo relacional de tabelas, isso é um conceito tão antigo quanto esses bancos de dados. Os bancos de dados NoSQL aproveitam e corrigem erros como a dificuldade de escalar esses bancos de dados.
Pra que serve?
Um dos mitos do NoSQL é que só 10% dos sites de hoje em dia, devem usar o NoSQL. Isso na verdade é uma interpretação errada, a idéia na afirmação é que 90% dos sites não sentiriam uma melhora consideravel de performance. Isso é verdade imagine um blog com 10 visitas diárias, qualquer banco de dados atual serve pra essa aplicação, até mesmo se você tiver 10mil visitas diárias.
Mas isso não siguinifica que você não possa usar um banco de dados NoSQL para a sua aplicação. Se você quiser usar um banco de dadso NoSQL no seu blog de 10 visitas diárias, isso não te impede de nada.
Se não preciso porque usar?
Você pode ter um site, que é bastante visitado o seu banco de dados estar aguentando bem, mas você quer gerar alguns logs, seja para estatisticas ou para qualquer outra coisa. Seria bastante viavel usar um banco de dados desses, porque você vai ter muitos dados, você vai precisar consultar de forma rápida e fácil, um NoSQL seria ótimo para isso.
Onde usar?
Muito se tem visto sobre usar o NoSQL em aplicações web de grande porte, porem ela pode ser usada em qualquer tipo de aplicação, você pode usar na web ou no desktop, não tem limites para isso.
Não posso usar NoSQL com um banco de dados relacional
Você pode e deve usar um NoSQL com algum banco de dados relacional que você use. Você pode até usar vários tipos de NoSQL e um MySQL por exemplo. Pode usar um NoSQL para cache dos dados, outro para os registros de logs e assim por diante, claro que você não precisa disso, mas você pode fazer.
Qual posso usar?
Você pode usar qualquer NoSQL, porem se você quer começar no mundo NoSQL eu aconselharia um banco de dados orientado a documentos, eu creio que seja o mais próximo de um banco de dados relacional, e são extremamente faceis de se usar. Apesar de serem bastante parecidos, eles tem conceitos diferentes, por exemplo, você não precisa de uma tabela para comentarios e uma para posts, você coloca tudo no mesmo documento(como se fosse uma tabela).
Considerações finais
Como vocês puderam ver, um NoSQL pode ser usado para qualquer tipo de aplicação, seja web como desktop, pequena, média ou grande. Porem as vezes você pode sentir mais diferença estruturando corretamente o seu banco de dados atual do que mudando completamente para um NoSQL.
A vatagem de um NoSQL é a alta escalabilidade a velocidade de inserção e de consulta desses bancos são absurdos. Eles vieram para arrumar problemas que os bancos de dados relacionais tem e que não foram projetados nem imaginados na época que o sistema relacional foi criado.
VoltDB: Escalabilidade de NoSQL em SQL
29/05/2010
A empresa VoltDB (uma empresa fundada pelo Mike Stonebraker, o mesmo que criou o PostgreSQL) anunciou ontem o release oficial do VoltDB: um banco de dados relacional com suporte à ACID e, segundo a empresa, facilmente escalável como alguns bancos de dados NoSQL.
A premissa principal do VoltDB é simples: ele é diferente da maioria dos bancos de dados relacionais de hoje, que se baseiam em designs antigos e que foram concebidos bem antes dos bancos de dados com workloads “web-scale”. Os bancos de dados tradicionais podem “desperdiçar” mais de 90% do seu tempo com tarefas burocráticas, como logging, lagging e gerenciamento de buffer. O VoltDB utiliza processamento in-memory e elimina vários destes overheads que ocorrem em bancos de dados relacionais e ainda consegue manter a consistencia transacional (ACID). Com isso, o VoltDB consegue ser 50x mais rápido do que RDBMS tradicionais.
Em alguns testes, o VoltDB conseguiu se sair tão bem ou melhor se comparado com bancos de dados NoSQL que utilizam armazenamento key-value. Os mesmos testes demonstram que o VoltDB pode escalar quase linearmente: em uma determinada máquina, ele conseguiu processar 56.000 TPS e em um cluster com 12 máquinas, ele conseguiu processar 560.000 TPS.
Ao que parece, o VoltDB é uma grande promessa, pois possibilita uma escalabilidade fácil e eficiente sem abandonar o modelo relacional, no qual a maioria dos desenvolvedores hoje está acostumada e no qual boa parte dos sistemas é baseado.
artigo retirado de: http://escalabilidade.com/2010/05/26/voltdb-escalabilidade-de-nosql-em-sql/
Acho válido fazer alguns testes com ele pois ele possui 2 licensas a free e a paga(que por sinal é meio carinha)
Open-Source Community Project Commercial Subscription Recommended for developers and proof of concept deployments. This edition is unsupported and most likely to be used in non-mission critical applications. Recommended for production environments that demand scale and availability. Professional support, maintenance and commercial licensing terms make the Enterpise Edition the right choice for critical deployments. Base System High-performance, ACID-compliant DBMS Yes Yes Scale-out capability Yes Yes High availability, node failover (K-safety) Yes Yes Disk snap-shot persistence Yes Yes Data connector to file system (spooling) Yes Yes Support SLA Community forums Yes Yes Email, Phone Yes Operating system certification Yes Support hours 8AM – 5PM Response time 8 hours License License GPL Commercial Commercial embedding rights Within GPL products only Yes Annual Subscription Price Community Edition Commercial Edition Base-system – 4-node cluster (“node” = a server of any type, with any number of CPU cores, RAM, etc.) Free $15,000 USD/year Additional nodes (“node” = a server of any type, with any number of CPU cores, RAM, etc.) Price per node for nodes 5 through 12 Free $3,200/node/year Price per node for nodes 13 and above Free $2,800/node/year Three-year subscription discount 25% Additional Support Offerings
Enhanced Premium Support Extends the standard support SLA to include 24 x 7 support hours and 2-hour response time. Price is in addition to annual subscription above.
$18,000 Quick Start Service Five day professional services engagement to build initial proof of concept (POC), install it into the environment and run benchmarks. Includes full training on using and building VoltDB applications. Additional T&E charges may apply.
$25,000 Onsite Group Training (2 day) Onsite two-day training class on using and building VoltDB applications. Additional T&E charges may apply.
$7,500 Live Instructor-Led Online Training Classes VoltDB instructor-led online training in various aspects of VoltDB from installation and operation to building VoltDB client libraries and VoltDB applications. Each 3-hour course will include training materials, interactive training and question and answer.
$500 Converter MySQL para MongoDB
20/05/2010
Notando que a maioria dos programadores PHP utilizam MySQL e para você começar a usar o MongoDB ncessita de uma base de dados para começar a programar sua funções, tive a idéia de criar um conversor simples de MySQL para MongoDB. Aqui vou explicar o seu código e como é simples utilizar o MongoDB com PHP.
Criei uma interface bem simples para que possamos enviar os dados sem precisar ficar mudando no código.
Essa interface enviará, via POST, as variáveis de conexão com o banco de dados MySQL.
$host = isset($_REQUEST['host_mysql']) ? $_REQUEST['host_mysql'] : “localhost”;
$user = isset($_REQUEST['user_mysql']) ? $_REQUEST['user_mysql'] : “usuario”;
$pass = isset($_REQUEST['pass_mysql']) ? $_REQUEST['pass_mysql'] : “senha”;
$db = isset($_REQUEST['db_mysql']) ? $_REQUEST['db_mysql'] : “teste_latin”;
Agora é hora de criar a conexão com o MongoDB utilizando uma extensão instalada no php: http://github.com/downloads/mongodb/mongo-php-driver/mongo-1.0.6-r1-php5.3vc6ts.zip
try{
$conexao = new Mongo(); //abre conexão com o MongoDB
$db_mongo = $conexao->$db; //cria a database com o mesmo nome do MySQL
}
catch(MongoConnectionException $e){
die(“<h1 class=’erro’>Erro do banco de dados MONGODB – Inicie o servidor do MongoDD!</h1><span class=’dica’>Dica: Entre no prompt do windows<br />
cd \ <br />
cd mongodb<br />
cd bin<br />
mongod </span>”);
}
Caso o seu MongoDB não esteja rodando o script indicará o erro e mostrará a forma como iniciar seu MongoDB no Windows.Para conseguirmos pegar o nome de todas as tabelas da nossa database no MySQL utilizamos a seguinte query:
$query_pega_tabelas = “SHOW TABLES”;
O nome do nosso campo contendo as tabelas será:
$index_tabelas = “Tables_in_”.$db; //nome do array com o valor do nome das tabelas via SHOW TABLES
Onde a variável $db será o nome da nossa database no MySQL. Após pegarmos os nomes das nossas tabelas é hora de irmos tabela por tabela pegando seus dados e inserindo-os, não será necessário pegar os metadados(tipo, tamanho) dos campos pois o MongoDB não necessita dessas informações.if($result_pega_tabelas=mysql_query($query_pega_tabelas)){
while($arr_pega_tabelas[] = mysql_fetch_assoc($result_pega_tabelas)){
}
$rs_charset=mysql_query($query_charset);
foreach($arr_pega_tabelas as $c=>$v){
if(is_array($v)){
foreach($v as $a => $b){
echo “<h3>Tabela: “.$b.”</h3>”;
$nome_tabela = $b;
$query_pega_dados = “EXPLAIN “.$nome_tabela;
if($result_pega_dados=mysql_query($query_pega_dados)){
$arr_pega_dados = array();
while($arr_pega_dados = mysql_fetch_assoc($result_pega_dados)){
$arr_totalis[$nome_tabela][] = $arr_pega_dados;
}//fim while
}//fim if query pega dados
}//fim foreach
}//fim if array
}//fim foreeach
Geramos uma collection para cada tabela existente no MySQL.
foreach($arr_totalis as $c => $v){
$query = ‘select * from ‘.$c;
$collection = $db_mongo->$c;
$rs_select = mysql_query($query);
echo “Inserindo em “.$c.”<br />”;
echo “<pre>”;
while($arr_dados = mysql_fetch_assoc($rs_select)){
Precisamos codificar nossos valores, assim como os campos, em utf8. Porém caso nosso banco já esteja em utf8 não será necessária a conversão. Para isso criei um pequena função utilizando iconv.
foreach($arr_dados as $c => $v){
$obj[utf8_encode_suissa($c)] = utf8_encode_suissa($v);
}//fim foreach
$arr[] = $obj;
}//fim while
$erro = 0;
No caso meu banco que será convertido está codificado em latin1, correspondente ao charset iso-8859-1. Essa função vai ao final do script.
function utf8_encode_suissa($s) {
return iconv(‘iso-8859-1′, ‘utf-8′, $s);
}
Após a conversão para utf8 inserimos o objeto codificado, com a função insert(), na nossa collection que terá o mesmo nome que a tabela correspondente no MySQL.
foreach($arr as $cc => $vv){
if(!$collection->insert($vv)){
echo “Não inseriu”.print_r($c) ;
$erro++;
$var_erro[] = var_dump($vv);
}//fim if
}//fim foreach
Caso tenha ocorrido algum erro mostrará-o com var_dump, só para ter uma noção de como os dados estão estruturados.
if($erro > 0){
echo “<h3>Aconteceram os seguintes erros:</h3>”;
foreach($var_erro as $f => $g){
var_dump($g);
}//fim foreach
}//fim if
echo “</pre>”;
}//fim foreach
}//fim if
Ao término do script você poderá entrar no phpMoAdmin, ferramenta para manipular as bases e as collections do MongoDB, e ver na lista das databases sua nova base criada.
O scrip completo com a interface para inserir os dados se encontra em: http://www.nosqlbr.com.br/conversor_mysql_mongodb.zip
Introdução ao NoSQL
19/05/2010
O termo NoSQL foi usado pela primeira vez em 1998 como o nome de um banco de dados relacional de código aberto que não possuía um interface SQL. Seu autor, Carlo Strozzi, alega que o movimento NoSQL “é completamente distinto do modelo relacional e portanto deveria ser mais apropriadamente chamado “NoREL” ou algo que produzisse o mesmo efeito”. Porém o termo só voltou a ser assunto em 2009 por um funcionário do Rackspace, Eric Evans, quando Johan Oskarsson da Last.fm queria organizar um evento para discutir bancos de dados open source distribuídos.
NoSQL são diferentes sistemas de armazenamento que vieram para suprir necessidades que os bancos de dados tradicionais(Relacionais) são ineficazes. Muitas dessas bases apresentam características muito interessantes como alta performance, escalabilidade, replicação, suporte à dados estruturados e sub colunas.
O NoSQL surgiu da necessidade de uma performance superior e de uma alta escalabilidade. Os atuais bancos de dados relacionais são muito restritos a isso, sendo necessário a distribuição vertical de servidores, ou seja, quanto mais dados, mais memória e mais disco um servidor precisa. O NoSQL tem uma grande facilidade na distribuição horizontal, ou seja, mais dados, mais servidores, não necessariamente de alta performance. Um grande utilizador desse conceito é o google, que usa computadores de pequeno e médio porte, para a distribuição dos dados, essa forma de utilização e muito mais eficiente e econômica. Alem disso, os bancos de dados NoSQL são muito tolerantes a erros.
No caso dos bancos NoSQL toda a a informação necessária estará agrupada no mesmo registro, ou seja, em vez de você ter o relacionamento entre várias tabelas para formar uma informação ela estará em sua totalidade no mesmo registro.
Os bancos NoSQL são subdivididos pelo seu núcleo, ou seja, como ele trabalha com os dados. Que são: Wide Column Store/Column Families, Document Store, Key Value/Tuple Store, Eventually Consistent Key Value Store, Graph Databases, Object Databases, Grid Database Solutions, XML Databases. Lista retirada de http://nosql-database.org/
Key/Value Store
Esse é o tipo de banco de dados NoSQL mais simples o conceito dele é uma chave e um valor para essa chave, mas ele é o que aguenta mais carga de dados. Esses tipos de bancos de dados, são o que tem a maior escalabilidade.
Wide Columns Store
Fortemente inspirados pelo BigTable do google eles suportam várias linhas e colunas, alem disso ele permite subcolunas. Alem do BigTable do google outros que usam essa tecnologia são:
- HBase(Apache)
- HiperTable
- Cassandra(Apache)
Document Store
Baseado em documentos XML ou JSON, podem ser localizados pelo seu id unico ou por qualquer registro que tenha no documento.
Graph Store
Com uma complexibilidade maior esses bancos de dados guardam objetos e não registros como os outros tipos de NoSQL. A busca destes itens são feitas pela navegação destes objetos.
Column Oriented Store
Esses são bancos de dados relacionais, porem eles tem caracteristicas do NoSQL a principal diferença deles é que os dados são armazenados em colunas, ajudando na escalabilidade.
- Vertica
- MonetDB
- LucidDB
- Infobright
- Ingres/Vectorwise
Como apresentado no gráfico, os key-value aguentam maior quantidade de registros, enquanto os grafos são mais complexos, a vantagem disso é bla bla bla.
Em um projeto, não necessariamente você precisa usar só um banco de dados nosql, você pode usar ele com qualquer outro banco de dados. Os bancos nosql são indicados para grandes cargas de dados, exigência de velocidade na consulta e escrita em grandes volumes de dados. Ainda segundo o gráfico 90% dos sites atualmente podem usar sem problemas algum os bancos de dados tradicionais, pois o ganho de performance não seria tão siguinificativo, para os 10% restantes é aconselhavel o uso do NoSQL.
A idéia que o conceito NOSQL nos passa é que ele não pode ser generalizado como a resposta de todos seus problemas, mas sim para problemas específicos.
Banco de dados Relacionais
O que é: Baseia-se em que todos os dados estão guardados em tabelas, pelo conceito de entidade e relacionamento. Os dados são separados de forma única tentando diminuir ao máximo a redundância. Pois a informação é criada pelo conjunto dos dados, onde são as relações entre as tabelas que fazem esse serviço.
Características: tabelas, schema definido, hierarquia, redundância mínima, entidade e relacionamento, formas normais, transações ACID(Atomicidade, Consistência, Isolamento, Durabilidade).
Necessidades: Sistemas locais, sistemas financeiros, sistemas corporativos, segurança da informação, consistência dos dados.
Marcas: DB2, Firebird, InterBase, Microsoft SQL Server, MySQL, Oracle, PostgreSQL
Cases: SAP, OpenERP, Previdência Social, Caixa, Itaú, Salesforce, Vale.
Banco de Dados NOSQL
O que é: Uma solução alternativa para os bancos de dados relacionais, possuem uma alta escalabilidade e desempenho
Características: registros, schema-free, tolerância a falha, escalabilidade, clusterização, mapreduce, sharding.
Necessidades: Sistemas em nuvem, análises sociais, alta escalabilidade, performance na consulta/escrita, replicação.
Cases: Twitter, Facebook, Digg, Amazon, LinkedIN, Google, Yahoo, The New York Times, Bit.ly.
MongoDB vs CouchDB – Porque escolhi o MongoDB
14/05/2010
Aposto todas as minhas fichinhas que todos que quiseram estudar NoSQL ficaram na duvida de qual dos dois usar, MongoDB ou CouchDB, mesmo que tenha ido para um cassandra ou qualquer outro NoSQL.
A duvida fica muito maior, porque são dois banco de dados muito semelhantes(orientado a documentos) e bastante usados. Vou colocar aqui o meu relato sobre o MongoDB e o CouchDB.
CouchDB
Quando vi as possibilidades do NoSQL, o primeiro banco de dados que vi foi o CouchDB, fiquei louco para começar a aprender ele, fazer alguns projetos e tudo mais, porem, dei uma olhada muito rápida no site deles, e não vi uma versão pra Windows. Falem o que quiserem, mas muita, muita gente e todo mundo sabe disso, faz tudo no Windows e se não tiver uma versão pra ele, não vão usar, vão continuar com o MySQL.
Demorei meses para voltar para o NoSQL, mas sempre com aquela vontade de realmente aprender um desses novos bancos de dados. Voltando aquele tesão inicial em aprender o NoSQL, vi muitos códigos usando o CouchDB, muita gente usando, muitas coisas pela internet sobre ele. Isso foi um ponto forte pra mim em relação a outros, quando vi que o CouchDB era incubado pela Apache, a balança pesou mais um pouquinho.
Já que o NoSQL é uma técnologia extremamente nova, eu queria pensar a longo prazo, várias vezes fiquei me perguntando as vantagens entre esses bancos de dados. Confesso que quando vi uma pesquisa falando sobre os bancos de dados que as pessoas mais tinham vontade de aprender, apontando o CouchDB como segundo, ele ganhou mais um ponto, em primeiro vinha o cassandra, porem ele ainda não tinha instalação pra windows. O PHP é muito forte, e um dos fatores principais é a grande comunidade e excelente documentação que eles possuem, levei isso em consideração na hora da escolha do NoSQL.
O CouchDB vinha cada vez mais ganhando pontos comigo, mas na mesma pesquisa, o terceiro colocado era o MongoDB, resolvi olhar ele mais de perto, uma vez que queria dar o ponta pé inicial.
MongoDB
Cheguei para olhar o MongoDB só por olhar mesmo, só para ir pro CouchDB com a consciencia limpa. Lia alguma coisa sobre ele, já pensava, mas o CouchDB faz isso também. Mas uma coisa começou a me chamar a atenção, o MongoDB para instalar era só baixar no site e extrair em algum diretório. Isso me chamou a atenção, pois o CouchDB precisava de algumas dependencias para rodar. Logo baixei e instalei, naquele momento comecei a pensar mais sobre ele, um coraçãozinho cresceu.
Rodei uma linha de comando, e está lá, um NoSQL funcioando direitinho. Isso foi tão empolgante, que não achava que pudesse melhorar, olhei no site do MongoDB, e para rodar com o PHP bastava instalar uma DLL. Fui lá e instalei a dll.
A facilidade me encantou, porem ainda pesava a incubadora do CouchDB e todas os outros pontos. Analizando mais um pouco o CouchDB vi que era preciso vários includes para fazer ele funcionar com PHP, menos pontos pra ele, uma vez que o MongoDB se saiu muito bem nessa. Agora fui colocar lado a lado a documentação.
Não precisei olhar muito para saber o escolhido, na imensa documentação do php.net esta uma documentação para o MongoDB. Foi ali que parei de ler o CouchDB e ler sobre o MongoDB. MongoDB funcioando na minha maquina, documentação no php.net, documentação no próprio site do MongoDB era incrivel, não tive mais tempo para o CouchDB.
Benchmark
Felix Geisendörfer fez uma referência em PHP, que foi super-fácil para portar para MongoDB. Seu benchmark diz a respeito da inserção dos dados e não sobre consultas e atualizações. Agora comparando seus resultados para CouchDB com o meu para MongoDB (tempo em ms):Como você pode ver o MongoDB é um pouco melhor. Aqui estão os números:
N º de inserções
Couch Tempo Total (seg)
Couch / Doc (ms)
Mongo Tempo Total (seg)
Mongo / Doc (ms)
1 0,0015
1,46
0,0005
0,5
2 0,0015
0,75
0,0004
0,2096
3 0,0017
0,56
0,0005
0,1604
4 0,0017
0,44
0,0005
0,1190
5 0,0018
0,36
0,0005
0,1060
6 0,0019
0,32
0,0006
0,0931
7 0,0021
0,3
0,0006
0,0847
8 0,0022
0,27
0,0007
0,0789
9 0,0023
0,25
0,0007
0,0734
10 0,0025
0,25
0,0007
0,0721
50 0,007
0,14
0,0024
0,0476
100 0,0136
0,14
0,0044
0,0442
500 0,0687
0,14
0,0253
0,0505
1000 0,1361
0,14
0,0372
0,0372
2500 0,4686
0,19
0,0278
0,0372
5000 0,9165
0,18
0,0488
0,0371
7500 1,5116
0,2
0,0835
0,0098
10000 2,3111
0,23
0,1065
0,0111
25000 6,8684
0,27
0,2711
0,0107
50000 15,8227
0,32
0,5430
0,0109
100000 35,3071
0,35
1,7697 0,0177
250000 104.0009
0,42
6,4533
0,0258
500000 230.6021
0,46
11,7684
0,0235
750000 352.7959
0,47
17,0473
0,0227
1000000
487.3284
0,49
18,4376
0,0184
Analisando os dados do gráfico e da tabela podemos perceber que o tempo real do MongoDB quase sempre esta uma casa(decimal) abaixo do CouchDB, ou seja, enquanto o CouchDB demora 0,0025 o Mongo DB, para o mesmo conjunto de instruções, demora 0,0007 segundos. E por conseguinte notamos que no final da inserção de 1 milhão de registros o CouchDB demora 487.3284 e o MongoDB 18,4376 segundos ao total. É um tempo considerável a se levar em conta
Conclusão
Posso ter puxado o saco do MongoDB, mas a facilidade de instalação, sem dependencias nem nada, só instalar uma dll no meu php e rodar, foi fator decisivo. No meio do caminho da comparação, o processo foi tão simples que parei por ali. Ao ver a documentação do php.net vi que ali o MongoDB tinha o apoio que eu esperava. Apesar de muitas pessoas estarem entrando no NoSQL indo direto pro CouchDB o MongoDB tem uma comunidade bastante forte, a facilidade dele como um todo é incrivel, isso conta muitos pontos.
Eu escolhi o MongoDB, mas vou estudar o CouchDB e o Cassandra. Eles são tão faceis, que quero aprender nem que seja um pouco de cada um deles, mas estou estudando a fundo o MongoDB.
Diaspora um facebook mais seguro e descentralizado
13/05/2010
O Facebook vem recebendo muitas críticas por causa da privacidade dos dados, este projeto tem a intenção de descentralizar o servidor, ou seja, distribuí-lo em vários servidores e que não exista um central. Logo os dados vão “conversar” entre si.
E vocês acham que isso seria possível com que banco de dados? Na verdade a pergunta derradeira seria com qual banco NOSQL ele será possível.
Com certeza veremos novidades nessa área, provavelmente els vão modificar algum já existente. É esperar para ver!
I Encontro NOSQL Brasil
12/05/2010
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, OpenSpotLight09.00 - noSQL anti-patterns
Gleicon Moraes, Locaweb10.00 - Performance e simplicidade com Chave/Valor utilizando REDIS
Luiz Fernando Teston, OpenSpotLight10.45 - Coffee break 11.20 - O papel do REST no Neo4J e CouchDB, um comparativo
Guilherme Silveira, Caelum12.10 - Introdução ao MongoDB – direto da fonte!
Alberto Lerner, 10gen13.00 - Almoço livre (não incluso) 14.30 - Tio: um NoSQL made in Brasil
Rodrigo Strauss, 1bit15.20 - Nas Nuvens com KVM, JBoss REST-Easy e InfiniSpan
Edgar Silva & Samuel Tauil, Red Hat Brasil16.10 - Coffee break 17.00 - Divide et impera – Processamento massivo com Hadoop, Pig e HBase
Vinicius Carvalho, SambaTech17.50 - Estudo de caso: avaliando o Apache Cassandra como cache distribuído
Julio Viegas, GlobalCode18.40 - Painel de Discussão 19.30 - Happy Hour! (*) Esta agenda pode ser alterada sem aviso prévio.
maiores informações
Yahoo!, O Grande Case do Hadoop Para Big Data
12/05/2010
O Hadoop está ganhando cada vez mais mais aceitação comercial. Estamos vendo uma série de sinais de sua crescente popularidade. Conversamos recentemente com um executivo do Yahoo! e ficou bastante claro que a empresa está reconstruindo seu futuro no armazenamento distribuído e em tecnologias de análises de grandes volumes de dados.
É um caminho similar ao que estamos vendo com as grandes redes sociais e fornecedores de computação em nuvem. O Facebook usa o Hadoop para fazer análises sociais mais elaboradas que fortalecem a capacidade de fornecer o alto nível estabelecido de qualidade das suas recomendações sociais. O Windows Azure também está adotando o Hadoop.
Em uma ligação recente do Eric Baldeschwieler, vice-presidente do Hadoop, para o Yahoo!, foi falado que o Hadoop está no núcleo da reconstrução do Yahoo!, sendo indispensável para seu futuro.
Perguntamos para ele por email o que o Hadoop acrescentará para o futuro do Yahoo!.
Aqui está sua declaração preparada:
“A visão do Yahoo! é se tornar o centro da vida das pessoas online fornecendo experiências relevantes na web. Pense no Hadoop como uma camada da fundação sob dois dos mais preciosos empreendimentos do Yahoo!: seus dados de usuários e sua coleção de conteúdo diversificado. Para o Yahoo!, o processamento e análise de dados é a chave para a compreensão da sua enorme audiência global, enriquecendo produtos e conectando os usuários com anunciantes.
Como o Hadoop está cada vez mais se tornando um armazém de dados para o Yahoo!, a empresa espera acelerar o ritmo de inovação em todas as experiências de seus consumidores e anunciantes.”
O Yahoo! começou a usar o Hadoop inicialmente em 2006 como um projeto de ciência para processar e analisar grandes conjuntos de dados. Eles desenvolveram um protótipo em 20 nodes(instâncias). Hoje, o Yahoo! gerencia mais de 25.000 nodes de análise e processamento de dados.
O Yahoo! descobriu que o desenvolvimento de seus produto poderia ser feito em uma fração de tempo com o Hadoop. Eles viram que poderiam jogar máquinas em um projeto para processar cada vez mais rápido e assim rentabilizar mais aceleradamente. O que antes levava 29 dias pode ser feito em menos de um.
Como resultado, o Yahoo! começou a integrar o Hadoop em todas as partes do seu negócio. A empresa esvaziou os dados do departamento de TI e os armazenou em um cluster.
Hoje, o Yahoo! utiliza o Hadoop para determinar a melhor posição da publicidade e para otimização de conteúdo. Por exemplo, a empresa começou a testar a forma como a otimização trabalha na página inicial, servindo conteúdo relevante ao usuário. E funcionou. O Yahoo! viu um aumento de 150% nas métricas de engajamento dos usuários com sua home.
O Hadoop está se tornando o padrão para processamento dados e analytics em redes sociais, em projetos como o genoma, no IBM Big Sheets e vários outros. Alguns vêem isso como prova de que ele ganhou aceitação comercial. E recentemente houve um grande aumento no número de vagas para uso da tecnologia no mercado. Já temos notícias também de algumas empresas usando Hadoop no Brasil. E você, aposta no uso do Hadoop se tornando cada vez mais mainstream?
Quem será o próximo grande player dos projetos relacionados a Big Data? Alguém disse Cassandra?
artigo retirado de: http://readwriteweb.com.br/2010/05/11/yahoo-ve-no-hadoop-a-solucao-de-seus-problemas/
Migrando do SQL para MongoDB + Mapreduce
11/05/2010
Pesquisando sobre MongoDB hoje, acabei achando um PDF, muito simples, que mostra como funcionaria a migração de um SQL para MongoDB.
Vejam aqui o pdf.
Como fazer um benchmark com PHP
11/05/2010
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.
Páginação PHP com MongoDB
11/05/2010
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.
Como instalar o CouchDB no Windows
07/05/2010
Hoje eu já estava largando mão de tentar instalar o CouchDB no Windows pois havia ficado preso na instalação do ICU (International Components for Unicode), que é um pré-requisito. Estava seguindo este tutorial http://wiki.apache.org/couchdb/Installing_on_Windows
Quando um camarada que eu comentei no slideshare dele http://www.slideshare.net/theoziran/nosql-com-couchdb-e-php me indicou esse site http://www.brunomlopes.com/software/couch-db-binaries
Foi lá que eu encontrei o Santo Graal do CouchDB no WINDOWS, ehehehhe, UM INSTALADOR! Porém eu ja tinha instalado o Erlang, então não sei se é necessário instalar anteriormente ou ele faz tudo. Só sei que meu CouchDB ta rodando lindamente e não é nem preciso de tutorial para isso. #ficadica
http://people.apache.org/~mhammond/dist/0.10.0/setup-couchdb-0.10.0.exe
Um bom começo com é usar essas classes e ir fuçando, exatamente o que estou a fazer.
http://wiki.apache.org/couchdb/Getting_started_with_PHP
Boa Sorte.
Lighttpd + MongoDB + PHP + MySQL + Servidor direto do pendrive(USB)
07/05/2010
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/phpinfoPara ver o phpmoadmin:
http://localhost:81/moadmin.phpOs 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
Como instalar Cassandra no Windows
07/05/2010
Hoje de manhã me deparei com a facilidade de instalar o Cassandra no Windows então vamos começar baixando a última JDK(Java SE Development Kit) e vai precisar do Cassandra, lógico,http://www.apache.org/dyn/closer.cgi?path=/cassandra/0.6.1/apache-cassandra-0.6.1-bin.tar.gz
- Extraia o Cassandra para uma pasta a sua escolha. (Eu usei c:\cassandra)
- Defina as seguintes variáveis de ambiente(Painel de Controle > Sistema > Avançado > Variáveis de Sistema)
- JAVA_HOME (para o diretório onde você instalou o JRE, este não deve ser o diretório bin. Meu exemplo: C:\Arquivos de programas\Java\jdk1.6.0_20)
- CASSANDRA_HOME (para o diretório que você extraiu os arquivos na etapa 1 – c:\cassandra)
Modifique o arquivo de configuração Cassandra como você gosta e não se esqueça de atualizar as localizações dos diretórios de um UNIX como caminho para algo em seu diretório do Windows (no meu exemplo o arquivo de configuração está localizado em c:\cassandra\conf\storage-conf.xml
<CommitLogDirectory>C:/cassandra/data/commitlog</CommitLogDirectory>
<DataFileDirectories>
<DataFileDirectory>C:/cassandra/data/data</DataFileDirectory>
</DataFileDirectories>ATENÇÃO
Essas linhas não existem no arquivo padrão, então pode colá-las sem problema. Eu coloquei mais para o final do arquivo.
<CalloutLocation>C:/cassandra/data/callouts</CalloutLocation>
<BootstrapFileDirectory>C:/cassandra/data/bootstrap</BootstrapFileDirectory>
<StagingFileDirectory>C:/cassandra/data/staging</StagingFileDirectory>Abra o cmd e execute o cassandra.bat arquivo (no meu exemplo está localizado em c:\cassandra\ bin\cassandra.bat)
Você pode verificar que Cassandra está funcionando, ao tentar se conectar ao servidor. Para fazer isso, abra um novo cmd e executar o cassandra-cli.bat arquivo a partir do diretório bin.
c:\cassandra\ bin\cassandra.bat
connect localhost/9160Caso ainda assim não esteja rodando tente excutar o cassandra.bat e o cassandra-cli.bat apartir do C:\cassandra. Ex.:
cd cassandra
bin\cassandra.batE pronto nosso Cassandra já está pronto para uso.
Armazenar arquivos com MongoDB
07/05/2010
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
Eu tenho que me preocupar com SQL Injection no MongoDB?
07/05/2010
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
Alguns números do Twitter
06/05/2010
Fiquei pasmo coma quantidade de informação
-50 milhões de tweets/dia-300 mil novas contas/dia- O Twitter gera 7 TB/dia, 2 PB/ano.- Solução para logs com Scribe após tentar com syslog-ng.- Hadoo p/HDFS para armazenamento e processamento distribuído. Pig para analise.- Projeto próprio para gerenciar grafos sociais. FlockDB.- Estão migrando de MySQL com memcached para Cassandra. Particionar MySQL leva a muitos pontos de falha, é computacionalmente pesado e demanda mais trabalho.- Deploy em mais de 1000 maquinas em menos de 1 minuto com BitTorrent (Murder).Agora me pergunto seria possível sem NOSQL?
Fault Tolerance LOL
06/05/2010
Como Instalar MongoDB no Windows com Wamp
06/05/2010
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 dbVai ficar extamente assim:
c:/mongodb
c:/data/dbAssim 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 finalPronto 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.zipNo 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
Meu Benchmark – pequeno comparativo MySQL e MongoDB
06/05/2010
Inserindo/lendoarray(“title” => “Calvin and Hobbes”);No MYSQL – Inserção
inserindo 50kTempo (segundos): 26.963586091995inserindo 50kTempo (segundos): 35.74323797226inserindo 50kTempo (segundos): 27.360780954361inserindo 50kTempo (segundos): 27.239809989929LEITURA dos 200k: Tempo (segundos): 0.16633296012878MongoDB – Inserção
inserindo 50kTempo (segundos): 6.9094848632812inserindo 50kTempo (segundos): 9.049604177475inserindo 50kTempo (segundos): 4.2792370319366inserindo 50kTempo (segundos): 10.331115007401LEITURA dos 200k: Tempo (segundos): 0.14360809326172As 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 MongogetTime();$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]MemCached no Windows e integração com o Wamp Server
05/05/2010
O que é Memcache?
É um serviço que roda stand-alone na máquina, que utiliza uma ou mais portas, e que pode ser inicializado, parado e reinicializado conforme necessidades. Ao contrário da sessão do PHP, que é visível somente dentro do escopo de acesso do usuário (claro que existem maneira de compartilhar sessões), o memcache é visível dentro de toda aplicação, ou seja, se tivermos 100 usuários on-line, eles compartilharão o mesmo cache.A funcionalidade principal dele consiste em armazenar “qualquer coisa” na memória (RAM) do servidor para uso posterior. Segundo o site do próprio, ele é “um sistema distribuído de alto desempenho para o cacheamento (armazenamento) de objetos na memória, genérico por natureza, mas feito para aumentar a velocidade de sites dinâmicos, diminuindo a carga sobre o banco de dados”.Quando usar o Memcache?
Suponhamos que você tenha um site que faz várias e várias consultas ao MySQL para exibir uma página e, algumas delas, demoram mais de 1 seguro para ser executada… Isso significa que o seu site não está otimizado e, obviamente, está mais lento do que poderia ser.A maioria dos servidores – de qualidade – hoje em dia, já vêm com ele instalado… Caso você precise instalar ele no seu, recomendo dar uma olhada no site oficial( http://www.danga.com/memcached/ ) para maiores detalhes.O que é e como é armazenadoPense no Memcached como uma tabela de hash gigante. Toda informação individual armazenada possui basicamente 3 elementos:
- Identificador: um texto com tamanho máximo de 250 caracteres que identifica um corpo de informação. Equivale à chave primária com a qual já estamos acostumados a trabalhar no modelo relacional. Não há regras com relação ao seu valor: sendo assim, você é livre para identificar suas informações como quiser.
- Tempo de duração: o tempo (em segundos) que o Memcached manterá esta informação na memória. O tempo máximo suportado é 30 dias.
- Corpo: a informação em si. No caso do Memcached, esta possui tamanho máximo de 1 Mb. Se for pouco pra você, sempre é possível dividir a sua informação em mais de um bloco, compactá-la ou, se preferir, alterar o código fonte do Memcached (eu o li inteiro, e é BEM fácil de entender (se você souber C)).
Lembre-se: não se trata de um banco de dados.Instalação
Baixe os binários do memcached no site http://code.jellycan.com/memcached/ (pegue os binários win32).Descompacte o conteúdo do arquivo onde desejar (usei c:memcache), você deverá ter os seguintes arquivos dentro da pasta:memcache.exeAbra o terminal do windows. Executar cmdInstale o memcache com o seguinte comando: c:memcachememcache.exe -d installInicialize o serviço com o seguinte comando: c:memcachememcache.exe -d startAgora com o memcache instalado e iniciado, vamos a configuração do WAMP, antes de mais nada é preciso fazer o download da dll do memcache para windows neste endereço:php5.2 http://downloads.php.net/pierre/php_memcache-5.2-Win32-vc6-x86-20090408.zipphp5.3 http://downloads.php.net/pierre/php_memcache-cvs-20090703-5.3-VC6-x86.zipCole a dll em C:\wamp\bin\php\php5.3.0\ext e cole essa dll dentro, feche o WAMP, inicie-o novamente.Clique com o botão esquerdo no icone do wamp > php > php extensions > habilite a extensão memcache. Pronto, agora é só fazer um teste com o script postado abaixo e está tudo certo.[php] <?php // Exemplo extraído do site www.php.net $memcache = new Memcache; $memcache->connect("localhost",11211);echo "Server's version: " . $memcache->getVersion() . "n"; $tmp_object = new stdClass; $tmp_object->str_attr = "test"; $tmp_object->int_attr = 123; $memcache->set("key",$tmp_object,false,10); echo "Store data in the cache (data will expire in 10 seconds)n"; echo "Data from the cache:n"; var_dump($memcache->get("key")); ?> [/php]Bancos de dados não relacionais e o movimento NoSQL
05/05/2010
O CouchDB é um dos mais famosos no time dos key-value stores. Ele usadocumentos para definir uma estrutura no banco, armazenando uma chave associada ao um documento. Um documento é apresentado como JSON. Por exemplo:
{
"Subject": "Bancos não relacionais" "Author": "Nico Stepat" "PostedDate": "10/15/2009" "Tags": ["database", "nosql", "rest"] }Repare a estrutura dos dados é definido através da aplicação, o CouchDB não exige nada, apenas um documento JSON.
Talvez o CouchDB ficou famoso por causa da simples API REST e do uso do JSON, ou da interface grafica bonita ou por causa dos views interessantes usando Map-Reduce ou da replicação Multi-Master ou por que foi escrito em Erlang (como esse eesse também). Seja que for, a promessa principal do NoSQL – sendo escalável – o CouchDB não compriu ainda. Ele não é distribuído sozinho, e precisa de ajudaexterna para tal.
Outra forma de dar alguma estrutura aos dados ficou famosa por causa do Google Bigtable. A idéia é não salvar os dados em linhas como estamos acustomados pelos bancos relacionais. Os dados serão salvos através de colunas. Veja a diferença:
Row-Oriented (3 rows presentes – Nome, Salário, Data):
João,1432.00,15/10/2009 Maria,1511.00,13/10/2009 Pedro,1721.00,01/10/2009Column-Oriented (mesmo exemplo):
João,Maria,Pedro 1432.00,1511.00,1721.00 15/10/2009,13/10/2009,01/10/2009No column-oriented vem primeiro TODOS os dados da primeira coluna Nome, depois a segunda coluna Salario e por último a coluna Data.
O artigo completo se encontra em: http://blog.caelum.com.br/2009/10/30/bancos-de-dados-nao-relacionais-e-o-movimento-nosql/
Desenvolvendo aplicações escaláveis com PHP e MongoDB
05/05/2010
Ótimo tutorial no PHP Classes sobre como desenvolver aplicações escaláveis com MongoDB
http://www.phpclasses.org/blog/post/118-Developing-scalable-PHP-applications-using-MongoDB.html
Humongous Data at Server Density: Approaching 1 Billion Documents in MongoDB
05/05/2010
Impressionante marca!













