Este documento fornece um resumo sobre o CouchDB, um banco de dados orientado a documentos. Ele discute a história do CouchDB, seus problemas com bancos de dados relacionais tradicionais, como foi construído para o futuro, seu modelo de documentos, API HTTP REST, visões para extrair dados, e replicação de dados.
1. CouchDB:
Um banco de dados
orientado a documento
Allisson Azevedo
http://blog.allisson.eti.br
allisson@gmail.com
20/06/09
2. Agenda
□
História do CouchDB
□
Problemas RDBMS
□
Construído para o futuro
□
Documentos (Documents)
□
HTTP REST API
□
Visões (Views)
□
Replicação (Replication)
2
3. História do CouchDB
□
Damien Katz
◊ Trabalhos anteriores: Lotus Notes, MySQL
◊ Iniciou o CouchDB em 2005
◊ C++ -> Erlang
◊ XML -> JSON
◊ OpenSource
◊ Funcionário da IBM
◊ Trabalho em tempo integral no CouchDB
3
4. História do CouchDB (Cont)
□
Versão atual 0.9.0
□
Projeto oficial da Apache.org
4
5. Problemas RDBMS
□
Foram projetados originalmente para:
◊ Um usuário
◊ Uma máquina (Escala verticalmente)
◊ Uma operação por vez
◊ Maior uso em aplicações científicas
5
6. Problemas RDBMS (Cont)
□
Necessidades atuais (Web)
◊ Milhares de usuários simultâneos
◊ Várias máquinas (Escala horizontalmente)
◊ Processamento em paralelo (Multicore)
◊ Maior uso em aplicações na internet
6
7. Problemas RDBMS (Cont)
□
Como escalar um RDBMS?
◊ Replicação Master-Slave
◊ Replicação Master-Master
◊ Sharding
◊ Qual o custo de usar uma dessas
técnicas?
□
Locking
□
Normalização/Denormalização
7
8. Constuído para o Futuro
□
Erlang
◊ Desenvolvida para aplicações distribuídas
e tolerante a falhas
◊ Suporte poderoso a concorrência
◊ Originalmente proprietária da Ericsson
◊ Opensource em 1998
8
9. Constuído para o Futuro (Cont)
□
Non-locking multi-version concurrency
control (MVCC)
◊ Uso de versionamento, os dados nunca
são sobrescritos
◊ Leituras não são corrompidas por escritas
durante a leitura de dados
◊ Requisições concorrentes (Non-locking)
◊ Compactação elimina versões anteriores
dos documentos
9
10. Documentos
□
Local onde os dados são mantidos
□
Não tem schema definido
◊ Um documento pode ter um campo que
outro documento não têm
□
Formato JSON
◊ Pode incluir todo tipo de dados: números,
strings, arrays, null, boolean
□
Podem ter anexos (attachments)
10
16. HTTP REST API
□
Todas as operações são feitas via RESTful
Web Services
□
Quatro operações básicas para trabalhar
com documentos
◊ Create: HTTP PUT /db/docid
◊ Create: HTTP POST /db
◊ Read: HTTP GET /db/docid
◊ Update: HTTP PUT /db/docid
◊ Delete: HTTP DELETE /db/docid
16
17. HTTP REST API (Cont)
□
Toda linguagem de programação tem as
ferramentas necessárias para fazer
requisições HTTP
□
A maioria das linguagens já conta com
ferramentas específicas para tratar com
RESTful Web Services
17
18. HTTP REST API (Cont)
curl -X PUT http://127.0.0.1:5984/teste2
{"ok":true}
curl -X GET http://127.0.0.1:5984/_all_dbs
["teste2","teste"]
curl -X DELETE http://127.0.0.1:5984/teste2
{"ok":true}
curl -X GET http://127.0.0.1:5984/_all_dbs
["teste"]
18
19. HTTP REST API (Cont)
curl -X GET
http://127.0.0.1:5984/teste/4a3d08ad99937
8959437f91d2d8fe647
{"_id":"4a3d08ad999378959437f91d2d8fe64
7","_rev":"5-3162066707","name":"Allisson
Azevedo","age":26,"type":"person","measure
s":
{"height":169,"weight":68},"_attachments":
{"Imagem102.jpg":
{"stub":true,"content_type":"image/jpeg","l
ength":18223}}}
19
20. HTTP REST API (Cont)
curl -X PUT -d '{"name":"Steven Seagal",
"age":58}'
http://127.0.0.1:5984/teste/steven-seagal
{"ok":true,"id":"steven-seagal","rev":"1-
2296068035"}
curl -X POST -d '{"name":"Chuck Norris",
"age":69}' http://127.0.0.1:5984/teste
{"ok":true,"id":"6ae18b5516ccac7abe3eaf07
b86b8ec8","rev":"1-3534466899"}
20
21. HTTP REST API (Cont)
curl -X PUT -d '{"_id":"steven-seagal","_rev":"1-
2296068035","name":"Steven Seagal","age":58,
"roundhousekick":false}'
http://127.0.0.1:5984/teste/steven-seagal
{"ok":true,"id":"steven-seagal","rev":"2-
3346317691"}
curl -X GET http://127.0.0.1:5984/teste/steven-
seagal
{"_id":"steven-seagal","_rev":"2-
3346317691","name":"Steven
Seagal","age":58,"roundhousekick":false}
21
22. HTTP REST API (Cont)
curl -X DELETE
http://127.0.0.1:5984/teste/steven-seagal?
rev=2-3346317691
{"ok":true,"id":"steven-seagal","rev":"3-
793968873"}
curl -X GET
http://127.0.0.1:5984/teste/steven-seagal
{"error":"not_found","reason":"deleted"}
22
23. Visões
□
Extrair data dos documentos
□
Map/Reduce
◊ Map: Extrai dados dos documentos
◊ Reduce: Realiza cálculos com os valores
obtidos no Map
□
Visões podem ser temporárias ou fixas
23
24. Visões (Cont)
Exemplo de função Map
function(doc) {
if (doc.name && doc.age) {
emit(doc.name, doc.age);
}
}
24
30. Replicação
□
Replicação uni-direcional
□
A cópia de dados utiliza apenas as
últimas versões dos documentos
□
A operação é realizada enviando uma
requisição POST para a url /_replicate
◊ Banco de origem
◊ Banco de destino
30
31. Replicação (Cont)
□
Resolução automática de conflitos
◊ Seleciona um documento como sendo o
mais atual e os outros conflitos são
armazenados como versões anteriores
31