You are on page 1of 7

NoSQL: CouchDB

Jferson Cristiano Flores


Universidade Feevale
Novo Hamburgo, RS - Brasil
jeff.cf.br@gmail.com

1 Origem
CouchDB um projeto criado em abril de 2005 por Damien Katz, ex-desenvolvedor do
Lotus Notes da IBM. Damien Katz definiu-o como "um sistema de armazenamento de
um banco de dados de objetos em grande escala". Seu objetivo era que o banco de dados
se tornasse o banco de dados da Internet e, por isso, seria projetado desde o incio para
atender a aplicaes web. Ele financiou o projeto do prprio bolso por quase dois anos e
lanou-o como um projeto de cdigo aberto sob a licena GNU General Public License.
Em fevereiro de 2008 tornou-se um projeto da Apache Incubator e a licena foi
alterada para a licena Apache. Poucos meses depois, tornou-se um projeto de alto-
nvel, o que levou primeira verso estvel lanada em julho de 2010.
No incio de 2012, Damien Katz deixou o projeto para se concentrar em outro
projeto relacionado.
Desde a sada de Damien Katz, o projeto Apache CouchDB tem sido
continuado, liberando as verses 1.2 em abril de 2012 e 1.3 em abril de 2013.
Atualmente a verso 1.6 est em andamento.
2 Funcionamento geral
Um servidor CouchDB hospeda bancos de dados nomeados que armazenam
documentos. Cada documento tem um nome nico no banco de dados. O CouchDB
oferece uma API HTTP RESTful para ler e atualizar (adicionar, editar, apagar) os
documentos do banco de dados.
Os documentos so a principal unidade de dados em um servidor CouchDB e
podem consistir de qualquer nmero de campos e anexos. Os documentos tambm
incluem metadados que so mantidos pelo sistema de banco de dados. Os campos dos
documentos so nomeados com unicidade e contm valores de diferentes tipos (texto,
nmero, boolean, listas, etc) e no h limite definido para o tamanho dos campos de
texto ou nmero de elementos.
O modelo de atualizao de documentos do CouchDB no utiliza locks e se
baseia em uma estratgia otimista. Edies de documentos so feitas por aplicaes-
cliente carregando documentos, fazendo alteraes e salvando-os de volta para o banco
de dados. Se outro cliente editando o mesmo documento salva suas alteraes primeiro,
o segundo cliente recebe um erro de conflito de edio ao salvar. Para resolver o
conflito de atualizao, a verso mais recente do documento pode ser aberta e as edies
reaplicadas.
Atualizaes de documentos (adicionar, editar, apagar) so do tipo tudo ou
nada, ou seja, ocorrem inteiramente ou so completamente descartadas. O banco de
dados nunca mantm documentos parcialmente salvos ou editados.
2.1 Caractersticas ACID
O sistema de arquivos do CouchDB cobre todas as propriedades ACID: Atomicidade,
Consistncia, Isolamento e Durabilidade. No disco, o CouchDB nunca sobrescreve
dados confirmados ou estruturas associadas, garantindo que os arquivos no banco de
dados estejam sempre em um estado consistente. Sendo assim, o design do CouchDB
chamado crash-only, pois o servidor no precisa passar por um processo de shutdown,
ele simplesmente encerrado.
Atualizaes de documentos (adicionar, editar, apagar) so serializadas, exceto
para blobs binrios que so escritos em simultneo. Leituras no banco de dados nunca
so bloqueadas e nunca tm que esperar por outros processos de escrita ou leitura.
Qualquer nmero de clientes pode fazer leitura de documentos ao mesmo tempo sem
sofrer bloqueios ou interrupes por atualizaes simultneas, mesmo em um mesmo
documento. Operaes de leitura no CouchDB utilizam um modelo de Multi-Version
Concurrency Control (MVCC), onde cada cliente enxerga uma verso consistente do
banco de dados do incio ao fim da operao de leitura.
Os documentos so indexados em B-trees pelo seu nome (DocID) e um ID de
sequncia. Cada atualizao no banco de dados gera um novo nmero sequencial. IDs
de sequncia so posteriormente usados para encontrar alteraes no banco de dados.
Esses ndices B-tree so atualizados simultaneamente quando os documentos so salvos
ou apagados. As atualizaes de ndice sempre ocorrem no final do arquivo (e somente
em atualizaes).
Documentos tm a vantagem de os dados j serem convenientemente agrupados
para armazenamento em vez de dividir por inmeras tabelas como ocorre na maioria
dos sistemas de banco de dados. Quando os documentos esto salvos efetivamente em
disco, os campos e os metadados so organizados em buffers sequencialmente, um
documento aps o outro (til para a construo eficiente de views).
Quando os documentos do CouchDB so atualizados, todos os dados e ndices
associados so liberados para o disco e o processamento transacional sempre deixa o
banco de dados em um estado completamente consistente. O processamento ocorre em
dois passos:
- todos os dados de documentos e atualizaes de ndices associados so
sincronizadamente liberados para o disco;
- o cabealho atualizado do banco de dados escrito em duas partes
consecutivas e idnticas para compor os primeiros 4 kbytes do arquivo e,
em seguida, de forma sncrona salvas no disco.
Em caso de um falha do Sistema Operacional ou falha de energia durante a etapa
1, as atualizaes parciais so simplesmente esquecidas ao reiniciar o banco de dados.
Se algum problema ocorre durante a etapa 2 (gravao do cabealho), uma cpia
idntica dos cabealhos anteriores permanece disponvel, garantindo a coerncia de
todos os dados anteriormente salvos. Excetuando-se a rea de cabealho, verificaes de
consistncia ou procedimentos de recuperao depois de um problema ou uma falha de
energia nunca so necessrios.
2.2 Compactao
Espao perdido recuperado eventualmente pela compactao. Por agendamento ou
quando o arquivo de banco de dados exceder uma certa quantidade de espao
desperdiado, o processo de compactao clona todos os dados ativos para um novo
arquivo e, em seguida, descarta o arquivo antigo. O banco de dados permanece
disponvel o tempo todo e todas as atualizaes e leituras so autorizadas a concluir com
xito. O arquivo antigo ento eliminado quando todos os dados foram copiados e
todos os usurios foram redirecionados para o novo arquivo.
3 Segurana
Para definir quem pode ler e atualizar documentos, o CouchDB tem um modelo de
validao simples de acesso de leitura e de atualizao que pode ser estendido para
implementar modelos de segurana personalizados.
Instncias do CouchDB tm contas de administrador. Contas de administrador
podem criar outras contas de administrador e alterar o design de documentos. Designs
de documento so documentos especiais contendo definies de views e outras
definies especiais, assim como campos regulares e blobs.
4 Atualizaes distribudas e Replicao
CouchDB um sistema de banco de dados distribudo baseado em peers. Ele permite
que os usurios e servidores acessem e atualizem os mesmos dados compartilhados
mesmo quando esto desconectados entre si. Essas mudanas podem ento ser
replicadas bidirecionalmente quando a conexo restabelecida.
Os modelos de armazenamento de documentos do CouchDB, de views e de
segurana so projetados para trabalhar em conjunto para tornar a replicao
bidirecional eficiente e confivel. Ambos os documentos e os designs podem ser
replicados, permitindo que bancos de dados completos (incluindo lgica e dados) sejam
replicados para laptops para uso offline, ou replicados para servidores em escritrios
remotos onde as conexes so lentas ou a no-confiabilidade do canal de comunicao
torna difcil o compartilhamento de dados.
O processo de replicao incremental. No nvel de banco de dados, a
replicao apenas examina os documentos atualizados desde a ltima replicao. Ento,
para cada documento atualizado, apenas os campos e blobs que foram alterados so
replicados para o restante da rede. Se a replicao falha em qualquer etapa devido a
problemas de rede ou falhas quaisquer, a prxima replicao reinicia a partir do mesmo
documento em que parou.
Rplicas parciais tambm podem ser criadas e mantidas. A replicao pode ser
filtrada por uma funo javascript, de modo que apenas os documentos particulares ou
aqueles que satisfaam critrios especficos so replicados. Isso permite que os usurios
consumam subconjuntos de dados de um grande banco de dados compartilhado para o
seu prprio uso, mas ainda mantenham a interao normal com o banco de dados
original.
4.1 Conflitos
Deteco e gesto de conflitos so questes essenciais para qualquer sistema de edio
distribuda. O sistema de armazenamento CouchDB trata conflitos de edio como um
estado comum, no excepcional. O modelo de resoluo de conflitos simples e "no-
destrutivo", preservando a semntica do documento e permitindo a resoluo de
conflitos de um modo descentralizado.
O CouchDB permite que qualquer nmero de documentos conflitantes exista
simultaneamente no banco de dados. Cada instncia do banco de dados, de forma
determinstica, deve decidir quais so os conflitos e qual documento o "vencedor".
Apenas o documento vencedor pode aparecer em leituras, enquanto os conflitos
"perdedores" devem ficar acessveis e mantidos no banco de dados at serem excludos
ou eliminados durante a compactao de dados. Como os documentos conflitantes ainda
so documentos ativos, eles so replicados como documentos regulares e esto sujeitos
s mesmas regras de segurana e validao.
Quando ocorrem conflitos de edio distribuda, cada rplica do banco de dados
v a mesma esquemtica de conflitos e cada instncia tem a oportunidade de resolv-
los. A resoluo de conflitos pode ser feita manualmente ou, dependendo da natureza
dos dados e o conflito, por agentes automatizados. O sistema faz a resoluo de
conflitos o mais descentralizada possvel, mantendo a semntica de documentos
individuais do banco de dados.
4.2 Aplicaes
Usando apenas o modelo de replicao bsica, muitas aplicaes de banco de dados
tradicionalmente individuais podem ser remanejadas em um modelo distribudo com
quase nenhum trabalho extra. A replicao no CouchDB projetada para ser
imediatamente til para aplicaes de banco de dados comuns, ao mesmo tempo que
est apta a atender clientes mais elaborados.
Com muito pouco trabalho no banco de dados, possvel criar um aplicativo de
gerenciamento de documentos distribudos com segurana granular e histricos
completos de reviso.
O modelo de replicao do CouchDB pode ser modificado para outros modelos
de atualizao distribuda. Se o mecanismo de armazenamento for reforado para
permitir transaes de atualizao multi-documentos, possvel realizar atualizaes do
tipo "tudo ou nada" ao replicar com um servidor upstream, de tal forma que qualquer
conflito de documento ou falha de validao far com que toda a atualizao fracasse.
5 Implementao
O CouchDB construdo sobre a plataforma Erlang OTP, que alm de ser uma
plataforma de desenvolvimento, uma linguagem de programao funcional e
concorrente. Erlang foi desenvolvida para aplicaes de telecomunicaes em tempo
real com nfase extrema na confiabilidade e disponibilidade.
Tanto na sintaxe quanto na semntica, Erlang muito diferente de linguagens de
programao convencionais como C ou Java. Erlang utiliza processos leves e troca de
mensagens no controle da concorrncia, alm de no ter threads em estado
compartilhado e de todos os dados serem imutveis. A natureza robusta e concorrente
do Erlang ideal para um servidor de banco de dados.
CouchDB projetado para utilizar concorrncia lock-free, tanto no modelo
conceitual quanto na implementao real em Erlang. Reduzir gargalos e evitar locks
um eficiente modo de manter todo o sistema funcionando previsivelmente sob cargas
pesadas. O CouchDB pode suportar mltiplos clientes, replicar alteraes, abrir e
atualizar documentos e consultar views cujos ndices esto simultaneamente sendo
atualizados por outros clientes sem a necessidade de bloqueios.
Para maior disponibilidade e mais usurios simultneos, o CouchDB projetado
em um esquema de clustering no-compartilhado. Em um cluster no-compartilhado,
cada mquina independente e replica dados com seus companheiros de cluster,
permitindo falhas em um servidor especfico com tempo de inatividade zero. Como
verificaes de consistncia e procedimentos de recuperao no so necessrios na
reinicializao, se o cluster inteiro falhar - devido a uma queda de energia em um
datacenter, por exemplo - todo o sistema distribudo CouchDB torna-se imediatamente
disponvel aps a reinicializao, sem qualquer prejuzo para a aplicao.
O CouchDB construdo desde o incio com uma viso consistente de um
sistema de banco de dados distribudo de documentos. Ao contrrio das tentativas mal-
sucedidas de acoplar recursos distribudos sobre modelos legados de bancos de dados
que so vistas no mercado, o CouchDB o resultado de um projeto cuidadosamente
estudado, desenvolvido e integrado. O modelo de documentos, as views, a segurana, os
modelos de replicao, o layout de armazenamento eficiente e robusto em disco e a
natureza concorrente e confivel da plataforma Erlang so especialmente integrados
para constituir um sistema confivel e eficiente.
6 Aspectos relevantes
6.1 Vantagens
Simplicidade: o CouchDB extremamente simples. Ele se baseia em uma arquitetura
poderosa, mas enxuta, centralizando seus componentes internos em mdulos eficientes
que se comunicam e realizam suas funes no mnimo tempo possvel. Caractersticas
como sistema simplificado de replicao, definies diretas de segurana, tolerncia a
falhas simples e robusta aderem ao CouchDB um aspecto minimalista e descomplicado.
Mesmo em grandes projetos, o banco de dados deixa de ser objeto de diferentes
necessidades (interface, gerenciamento de conexes, indexao, replicao em partes,
recuperao de falhas) e passa a ter como principal atividade a manuteno do prprio
hardware. Ou seja, o CouchDB um alvio sobre os DBAs.
Modelagem dos dados: ao se basear em documentos, o CouchDB simplifica e
otimiza o modo como os dados so modelados dentro do banco de dados, pois a
combinao do design dos documentos com o motor de queries do mesmo propicia um
desenvolvimento voltado ao acesso dos dados e no obrigatoriamente orientado pela
disposio destes.
Dados flexveis e de fcil adequao: uma vez que os documentos so auto-
contidos e podem ser individualmente alterados, a edio de estruturas se torna muito
mais simples, pois focada na adio e/ou remoo de dados nos documentos, e no em
tabelas inteiras como ocorre em bancos de dados relacionais.
Replicao: diferentemente de outros bancos de dados que exigem diversas
configuraes de master e slave, fragmentao e afins, o CouchDB permite uma fcil
replicao master-master 100% ativa e sem necessidade de muitas configuraes. No
obstante, a replicao gerenciada de tal modo que a ocorrncia de falha em qualquer
um dos nodos representa um tempo praticamente nulo de atraso no atendimento s
operaes ativas naquele nodo.
6.2 Desvantagens
No tem suporte a transaes: dificulta tanto a verificao de dados nicos quanto a
lgica bsica esperada de transaes: por exemplo, ao recuperar um campo, alter-lo e
regrav-lo, no h garantia de que o campo j no foi alterado por outro usurio.
No se adequa bem a modelos relacionais pr-existentes: embora seja um
aspecto de projeto, importante salientar: ao migrar um banco de dados relacional para
o CouchDB, seguir as Formas Normais se torna uma tarefa difcil. O conceito de
distribuio no compatvel com o conceito de normalizao.
No a melhor opo como datawarehouse: como o CouchDB se baseia em
queries pr-definidas e otimizadas, sabido que a utilizao de queries/views
temporrias apresenta performance bem abaixo do esperado, pois estes casos
usualmente no fazem uso dos melhores recursos de processamento de dados, como os
ndices que o CouchDB cria ao longo de sua operao.
7 Aplicabilidade
CouchDB, assim como outros sistemas NoSQL, especialmente til em cenrios onde
os dados no precisam estar absolutamente estruturados. Ou seja, embora os dados
armazenados atendam a um sistema, a maneira como esses dados so organizados no
parte de um esquema estruturado como ocorre nos SGBDs relacionais. Por isso, bancos
de dados NoSQL so usualmente adotados, mas no limitados, a sistemas que se
baseiam em documentos auto-contidos, como redes sociais, sites de
compartilhamento de contedo e repositrios de arquivos.
Por ter um paradigma de organizao e disponibilidade essencialmente diferente
de bancos de dados relacionais, a projeo e implantao de um projeto com NoSQL
tende a exigir bastante conhecimento e comprometimento dos desenvolvedores com a
ideologia e esquemtica do mesmo. Sendo assim, correto afirmar que a adoo de
NoSQL em um projeto deve ser uma deciso conscientemente bem estudada sob os
preceitos esperados pela aplicao final.
Referncias
ANDERSON, J. Chris; LEHNARDT, Jan; SLATER Noah (2010) CouchDB: The
Definitive Guide, http://guide.couchdb.org/editions/1/en/index.html, Junho.
Apache Software Foundation (2014) Apache CouchDB 1.6 Documentation,
http://docs.couchdb.org/en/latest/, Junho.
FLORENZANO, Eric (2008) Why CouchDB Sucks,
http://eflorenzano.com/blog/2008/11/23/why-couchdb-sucks/, Junho.
LAWSON, Nolan (2013) CouchDB doesnt want to be your database. It wants to be
your web site, http://nolanlawson.com/2013/11/15/couchdb-doesnt-want-to-be-
your-database-it-wants-to-be-your-web-site/, Junho.
LENNON, Joe (2009) Explorando o CouchDB,
http://www.ibm.com/developerworks/br/library/os-couchdb/, Junho.
Wikipedia (2014) CouchDB, http://en.wikipedia.org/wiki/CouchDB, Junho.

You might also like