TESTES DE PERFORMANCE UTILIZANDO O DB4O E MONGODB Alexandre P. Pinto, Fernanda Malagoli, Rodrigo M. Maciel, Hélio R. Soares, Sônia A. Santana Centro Universitário do Triângulo (UNITRI) – Avenida Nicomedes Alves dos Santos, 4545, Gávea, 38411-106 – Uberlândia – MG – Brasil. [email protected], {femalagoli, rodrigomm.posbd, sonia.ap.santana@}gmail.com, [email protected] Abstract. The NoSQL came out as an alternative to relational databases, in some cases making easy the distribution of the databases. This article presents a comparative between two NoSQL databases, Db4O and MongoDB, in terms of performance (CPU usage, memory usage and time spent), submitting these two banks to a data load. Db4o was chosen because it is widely used and easy to implement and MongoDB to be emerging as one of the best options database unconventional. It was observed that the data load was DB4O the faster, MongoDB used less memory and slightly less CPU. Keyword: NoSQL. Database. Comparative. Resumo. O NoSQL surge como uma alternativa aos bancos de dados relacionais, em alguns casos facilitando a distribuição das bases de dados. Este artigo apresenta um comparativo entre dois bancos de dados NoSQL, Db4O e MongoDB, quanto ao critério de performance (uso de CPU, uso de memória e tempo gasto) ao submeter esses dois bancos a uma mesma carga de dados. O Db4O foi escolhido por ser muito utilizado e de fácil implementação e o MongoDB por estar emergindo como uma das melhores opções de banco de dados não convencionais. Observou-se que na carga de dados o Db4O foi mais rápido, o MongoDB utilizou menos memória e ligeiramente menos CPU. Palavras-Chave: NoSQL. Banco de Dados. Comparativo. 1. Introdução Os Bancos de Dados NoSQL (Not Only SQL – Não Somente SQL) surgiram por volta de 1998 como uma alternativa aos bancos de dados relacionais. O NoSQL não foi criado com o objetivo de substituir o Modelo Relacional e sim para atender casos onde haja necessidade de uma maior flexibilidade e distribuição dos dados. Um dos principais fatores que favoreceram seu surgimento foi a natureza dos dados da internet, a importância de se atingir altos graus no processamento de grandes volumes de dados e a distribuição de sistemas em escala global. Uma das primeiras empresas a utilizar a tecnologia NoSQL foi o Google, que em 2004 criou o BigTable. Atualmente grandes empresas utilizam essa tecnologia, entre elas o Facebook, Twitter, eBay entre outras [Brito 2010; Diana e Gerosa 2010, Issa 2011]. De uma forma geral, o modelo relacional atende bem as necessidades de pequenas e médias aplicações, mas com o crescimento da quantidade de dados que precisam ser armazenados, torna-se necessário distribuir a base de dados. Os SGBD’s (Sistemas de Gerenciamento de Banco de Dados) relacionais não estão totalmente preparados para esta distribuição [Brito 2010; Issa 2011]. O potencial e a utilização dessas novas tecnologias estão em constante desenvolvimento e crescimento. E com a importância da modelagem de dados e implementação de regras de negócios utilizando os conceitos e otimização em bancos relacionais, uma mudança radical de paradigma justifica uma investigação mais específica sobre o desempenho dessas novas tecnologias e que, por sua vez, é o principal motivador desse estudo. Como essas tecnologias são muito recentes, existem poucas recomendações indicando em que contexto usar determinado paradigma. Em especial, apesar de haver casos em que bancos de dados NOSQL ajudaram organizações a escalar seus sistemas, existem poucos estudos comparativos que indiquem os cenários em que se aplicam e quais são seus limites de performance e escalabilidade [Diana e Gerosa 2010]. Assim, o principal objetivo deste artigo é estudar e avaliar sistemas de banco de dados não relacionais, a fim de obter um conhecimento mais específico quanto à performance dos mesmos no que diz respeito ao tempo gasto, uso de CPU e utilização de memória RAM ao aplicar uma carga de dados no sistema. As tecnologias escolhidas foram o MongoDB e o Db4O. Para isso, o estudo foi dividido em seções, onde, na seção 2 é mostrada uma visão geral de Bancos de Dados NoSQL e algumas características e vantagens do Db4O e do MongoDB. A seção 3 descreve como foi feita a preparação do ambiente, o software e o hardware utilizados para a carga de dados e, ainda nessa seção, são apresentados em gráficos os resultados obtidos. Finalmente, na seção 4, tem-se a conclusão. 2. Bancos de Dados NoSQL Em geral os bancos de dados ditos NoSQL lidam com dados não estruturados, como arquivos de texto, multimídia e mídias sociais, possuem as seguintes características em comum: não relacionais, distribuídos, horizontalmente escaláveis, possuem esquemas flexíveis, são replicáveis, possuem APIs (Application Programming Interfaces) simples e não seguem o modelo ACID (Atomicidade, Consistência, Isolamento e Durabilidade) [Brito 2010; Issa 2011]. O número de bancos de dados NoSQL disponíveis é relativamente grande e está aumentando constantemente. Promovendo, assim, a criação de diferentes tipos de bases de dados, cada um com um conjunto específico de características e aplicáveis aos diferentes domínios de problemas [Silva 2011]. Como exemplo de alguns bancos de dados NoSQL, divididos por categorias, podem-se citar [Strauch 2010]: • • • • • • Orientado a Documento: CouchDB; MongoDB. Orientado a Objetos: Db4O. Móveis: Sybase SQL Anywhere; Oracle Lite 10g. Chave-valor: Redis; Scalaris. Grafos: Neo4j. Colunas: Cassandra; Hypertable; BigTable. Nas seções seguintes algumas das tecnologias NoSQL disponíveis são apresentadas. 2.1.MongoDB O MongoDB é um sistema de gerenciamento de banco de dados da Apache Software Foundation que armazena dados em coleções de documentos BSON (Binary Object Notation), que é uma serialização binária codificada de documentos JSON (JavaScript Object Notation) semelhantes. JSON é um formato leve para troca e armazenamento de dados computacionais, é um subconjunto da notação de objeto de JavaScript, mas seu uso não requer JavaScript exclusivamente.[Plugge et al. 2010, Silva 2011]. Existem versões para os seguintes sistemas operacionais: OS X 64 bits, Linux 32 e 64 bits, Windows 32 e 64 bits e Solaris 64 bits. Para o acesso ao banco existem drivers para as linguagens: C, C++, C#, Erlang, Haskell, Java, JavaScript, Perl, PHP, Python, Rubi, Scala [MongoDB 2013]. Os documentos de bancos de dados orientados a documentos são coleções de atributos e valores, onde um atributo pode ser multi-valorado, essas coleções podem ser vistas como um equivalente às tabelas nos banco de dados relacionais. Não é necessário definir nenhum esquema rígido antes de realmente usar o banco de dados. Se um documento precisar incluir um novo campo pode simplesmente incluir esse campo, sem afetar de forma adversa outros documentos do banco de dados. Além disso, os documentos não precisam armazenar valores de dados vazios para campos para os quais não possuem um valor [Diana e Gerosa 2010, Lennon 2009]. Os documentos são identificados pelo campo “_id”, que pode ser gerado automaticamente pelo banco ou definido pelo usuário [Silva 2011]. Empresas como The Gardian, The New York Times, MTV, CNN Turk, EA entre outras utilizam o MongoDB [MongoDB 2013]. O MongoDB possui algumas características como [Brito 2010; Mateussi (apud Chodorow 2009), Silva 2011]: • • • • • • • • Banco de dados orientado a documentos (todos os dados para o documento em questão estão armazenados no próprio documento); Código aberto; Escrito em C++; Suporte a replicação; Armazena vídeos e fotos com a ferramenta GridFs; Suporte a computação em nuvem; Suporta consultas dinâmicas (ad hoc); Suporta expressões regulares, comparadores, operadores condicionais e operadores lógicos. Além das características Matteussi (apud Pronschinske 2010) cita as seguintes vantagens: • • • Abstração de objetos do mundo real como realmente são: complexos e únicos; Caso seja necessário adicionar um novo campo, pode adicionar a um único documento e não a todos os documentos como no caso de uma tabela no modelo relacional; Fácil transição de um banco de dados relacional para o MongoDB. 2.2.Db4O O Db4O é um banco de dados orientado a objetos onde os objetos são armazenados nativamente, eliminando a complexidade extra e a perda de performance com a conversão para outros formatos como SQL (Structured Query Language). Não é necessário rodar nenhum serviço para colocar o banco no ar, as aplicações têm acesso direto ao banco [Db4O 2013]. A versão completa do Db4O está disponível sob duas licenças: a de código aberto, licença GPL (General Public License), que possibilita download gratuito, avaliação e uso em projetos compatíveis com a licença GPL; e uma licença comercial de runtime para empresas que desejam embutir o Db4O em suas aplicações comerciais não GPL. Roda nativamente em várias plataformas de desenvolvimento orientadas a objeto e possibilita o desenvolvimento de aplicações para distribuição em múltiplas plataformas, como por exemplo, o mercado de PDA (Personal Digital Assistant), ou em combinações de clientes Windows e servidores Java. Suporta Java JDK 1.1.x até 5.0 e roda em J2EE e J2SE. Também roda com dialetos J2ME que suportam reflexão, como CDC, PersonalProfile, Symbian, Savaje e Zaurus, e sem reflexão, como CLDC e MIDP, incluindo RIM (Blackberry) e Palm OS [Db4O 2013]. O Db4O também roda em todas as plataformas .Net incluindo .NET (Microsoft), .NET Compact Framework e .NET Mono, suportando todas as linguagens gerenciadas como: C#, VB.NET, ASP.NET, Boo, e Managed C++. Por ser o único banco de dados nativo para Java e .Net ele fornece portabilidade entre plataformas que libera usuários de altas taxas de licenciamento e oferece uma grande quantidade de funcionalidades exclusivas e orientadas a objeto, como sua replicação e seus métodos de recuperação de dados: Queries nativas, QBE (Query by Example), SODA (Simple Object Data Access) [Db4O 2013]. Grandes empresas como a BMW, Boeing, Bosch e Hertz utilizam o Db4O para diminuir custos e tempo de desenvolvimento [Db4O 2013]. Algumas características presentes no Db4O são [Db4O 2013]: • • • Banco de dados orientado a objetos; Código aberto; Possui versões para Java e .Net. Podem-se citar também algumas vantagens na utilização do Db4O [Db4O 2013]: • • • Segundo o fabricante o Db4O pode chegar a ser 55 vezes mais rápido que alguns bancos de dados que utilizam o modelo relacional; Utiliza pouco recurso computacional; Disponibiliza acesso direto ao banco sem utilizar ORM (Mapeamento Objeto-Relacional). 3. Metodologia A estratégia adotada para a verificação da performance dos SGBD’s escolhida foi a experimental, envolvendo aspectos desde a instalação dos softwares, preparação do hardware, bem como a carga de dados para que se pudessem coletar os resultados e analisá-los. As seções seguintes detalham os procedimentos utilizados. 3.1. Software Foram instalados os bancos de dados Db4O versão 8.0 e o MongoDB versão 2.4.3, sendo, ambos, as últimas versões estáveis na data da realização dos testes. Para o acesso ao Db4O foram utilizadas as bibliotecas “Db4Objects.DB4O.dll” e “Db4Objects.DB4O.Linq.dll”, já para o acesso ao MongoDB foram utilizadas as bibliotecas “MongoDB.Bson.dll” e “MongoDB.Driver.dll”. Foram desenvolvidos dois programas para fazerem as cargas de dados, um para o MongoDB e outro para o Db4O, ambos utilizando o Microsoft Visual Studio 2010 e a linguagem VB.NET. Foi definida para a inserção dos dados uma estrutura simples e comumente utilizada em vários bancos de dados: Cliente (Nome, Rua, Número, Cidade). Estas estruturas foram criadas como classes e são mostradas nas figuras 1 e 2, respectivamente para Db4O e MongoDB. Figura 1. Classe Cliente para o Db4O Figura 2. Classe Cliente para o MongoDB Após criada a classe para o Db4O foi desenvolvido o programa e sua tela é mostrada na figura 3, em seguida, a figura 4 mostra o código que é executado quando o botão “Gerar Dados” é pressionado. Figura 3. Tela do programa Db4O Figura 4. Código executado ao pressionar o botão “Gerar Dados” no Db4O Por sua vez, a tela do programa criado para a carga no MongoDB é mostrada na figura 5 com seu respectivo código do botão “Gerar Dados” na figura 6. Os programas possibilitaram a escolha do número de clientes a serem inseridos na base de dados. Uma vez escolhida a quantidade de registros, quando o botão “Gerar Dados” era pressionado a hora do sistema era registrada e, quando o programa terminava de inserir, registrava-se, automaticamente, a hora de encerramento. Dessa forma, tem-se o tempo inicial e o tempo final gastos para a inserção da quantidade, sendo assim possível calcular o tempo gasto para a inserção dos registros, que foi um critério analisado. Figura 5. Tela do Programa MongoDB Figura 6. Código executado ao pressionar o botão “Gerar Dados” no MongoDB 3.1.Hardware Os testes foram realizados em um Notebook Intelbras, que possui as seguintes configurações: • • • • 4GB de Memória RAM; Processador Intel Core 2 Duo; 120 GB de Disco Rígido; Sistema Operacional Windows 7 Professional. 3.2.Preparação do Ambiente de Testes e Carga de Dados Para a mínima interferência de outros serviços do Windows nos testes, o computador foi formatado e ficou dedicado exclusivamente para os testes. A inserção de registros foi feita em duas escalas, uma em intervalos de 100 em 100 mil, começando de 100 mil e terminando em 900 mil e a outra em intervalos de 1 em 1 milhão, começando de 1 milhão e terminando em 5 milhões. O software utilizado para a análise foi o Monitor de Recursos do Windows, que mostra informações em tempo real sobre o uso do Hardware (CPU, memória RAM, disco e Rede). Para cada teste, o computador foi reiniciado, e após iniciado o Windows, foi aberto o Monitor de Recursos e aguardado até que os recursos “Uso de CPU” e “Memória Física Usada” estabilizassem seus valores. A carga de dados foi feita cinco vezes para cada quantidade de registros, com os valores obtidos dos critérios foram feitas as médias e a partir delas foram gerados gráficos. 3.3.Resultados e Discussões Os dados obtidos nos testes são mostrados nos gráficos a seguir, com suas respectivas discussões. 3.3.1.Tempo Gasto para a Inserção dos Dados As figuras 7 e 8 mostram, respectivamente, os valores de tempo gasto para a inserção dos registros nas escalas de 100 mil a 900 mil e 1 milhão a 5 milhões para cada banco. O desempenho do Db4O e do MongoDB para a inserção de até cinco milhões de registros foi linear. Para todas as quantidades de registros inseridos o Db4O foi mais rápido que o MongoDB, chegando a ser até 100% mais rápido. Esta diferença se dá pelo fato do MongoDB necessitar de uma interface (mongod.exe) para receber as solicitações de gravações e fazê-las no disco, enquanto no Db4O o acesso pela aplicação é nativo, ou seja, a aplicação faz a escrita direta no disco. Figura 7. Gráfico do Tempo Gasto – escala de 100 mil a 900 mil. Figura 8. Gráfico do Tempo Gasto – escala de 1 milhão a 5 milhões. 3.3.2. Uso de Memória Física (Memória RAM) O valor de memória física utilizada pelo computador, inicialmente, é de 19% para o Db4O e de 20% para o MongoDB em execução. Entretanto, os valores mostrados nos gráficos a seguir foram aqueles obtidos com as cargas de dados descontados os valores iniciais. As figuras 9 e 10 mostram, respectivamente, a memória física utilizada por ambos os bancos nas escalas de 100 mil a 900 mil e 1 milhão a 5 milhões. Observando nos gráficos a porcentagem de memória física utilizada por cada banco ao se fazer a carga de dados, percebe-se que o MongoDB teve sempre um menor consumo de memória, isso se deve ao fato que o Db4O para obter um desempenho maior necessita de mais memória. Figura 9. Uso de Memória Física – escala de 100 mil a 900 mil. Figura 10. Uso de Memória Física – escala de 1 milhão a 5 milhões. 3.3.3.Uso de CPU O valor inicial de Uso de CPU é de 2% tanto para o Db4O quanto para o MongoDB, em execução. As figuras 11 e 12 mostram os gráficos do uso de CPU para, respectivamente, escalas de 100 mil a 900 mil e 1 milhão a 5 milhões. Figura 11. Uso de CPU – escala de 100 mil a 900 mil. Figura 12. Uso de CPU – escala de 1 milhão a 5 milhões. O uso de CPU pelo Db4O foi ligeiramente maior do que o MongoDB. Não houveram alterações significativas no processamento para diferentes quantidades de registros inseridos. Em média, o Db4O utilizou 54% enquanto o MongoDB utilizou 53% do CPU. 4. Conclusão Na carga de dados Db4O apresentou um desempenho superior ao MongoDB, gastando aproximadamente a metade do tempo para a inserção dos registros. É um banco de dados que possibilita aos desenvolvedores Java e .Net reduzir o tempo e o custo de desenvolvimento e alcançar altos níveis de performance, sendo uma ótima escolha, dentre outras, para aplicação embarcadas em equipamentos e dispositivos. Para aplicações que dispõem de menos memória, mas necessitam de um banco com bom desempenho e sem esquemas, o MongoDB é uma boa opção. Nos testes mostrou-se bem mais “econômico”, utilizando na maioria das vezes menos da metade de memória utilizada pelo Db4O. No critério de uso de CPU os valores foram muito próximos sendo que o MongoDB utilizou 1% menos de CPU. Considerando a instalação ambos não apresentaram dificuldades já na utilização o Db4O apresenta uma facilidade a mais por não necessitar de colocar o banco no ar antes de utilizá-lo. Como sugestão para trabalhos futuros pode-se acrescentar testes com consultas, exclusão de registros e atualizações nas bases de dados, bem como aumentar o número de bancos testados. Referências Brito, Ricardo W. (2010) “Banco de Dados NoSQL x SGBD’s Relacionais: Análise Comparativa*”, http://www.infobrasil.inf.br/userfiles/27-05-S4-168840-Bancos%20de%20Dados%20NoSQL.pdf, 21/04/2013. Diana, Maurício de, Gerosa, Marco Aurélio (2010) “NOSQL na Web 2.0: Um Estudo Comparativo de Bancos Não-Relacionais para Armazenamento de Dados na Web 2.0”, http://www.lbd.dcc.ufmg.br/colecoes/wtdbd/2010/sbbd_wtd_12.pdf, 07/07/2013. Issa, Felipe Gustavo de Sousa. (2011) “Estudo Comparativo entre Banco de Dados Relacionais e Banco de Dados NoSQL na utilização por aplicações de Business Intelligence”, fatecsjc.edu.br/trabalhos-de-graduacao/wpcontent/uploads/2012/03/Trabalho-de-Graduação-Felipe-G.-S.-Issa.pdf, 21/04/2013. Lennon, Joe. (2009) “Explorando o CouchDB”, . http://www.ibm.com/developerworks/br/library/os-couchdb/, 19/04/2013. Matteussi, Kassiano José (2010) “Protótipo de Interface Web com PHP para . gerenciamento de Banco de Dados CouchDB”, https://s3.amazonaws.com/elton/docs/monografia_kassiano.pdf, 20/04/2013. MongoDB (2013), http://www.mongodb.org, 26/06/2013. Plugge, Eelco, Membrey, Peter and Hawkins, Tim (2010), The Definitive Guide to MongoDB: The NoSQL Database for Cloud and Desktop Computing, Apress, 1ª edição. Silva, Carlos A. R. F. Oliveira da (2011) “Data Modeling with NoSQL: How, When and Why”, http://repositorioaberto.up.pt/bitstream/10216/61586/1/000148158.pdf, 07/08/2013. Strauch, Christof (2010) “NoSQL Databases” http://oak.cs.ucla.edu/cs144/handouts/nosqldbs.pdf, 05/08/2013. Versant (2013), http://www.db4o.com, 06/06/2013. .