20/06/09 CouchDB: Um banco de dados orientado a documento Allisson Azevedo http://blog.allisson.eti.br [email protected]
2
Agenda
□ História do CouchDB□ Problemas RDBMS□ Construído para o futuro□ Documentos (Documents)□ HTTP REST API□ Visões (Views)□ Replicação (Replication)
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
4
História do CouchDB (Cont)
□ Versão atual 0.9.0 □ Projeto oficial da Apache.org
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
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
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
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
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
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)
11
Documentos (Cont)
{ "_id": "4a3d08ad999378959437f91d2d8fe647", "_rev": "1-1918148569"}
12
Documentos (Cont)
{ "_id": "4a3d08ad999378959437f91d2d8fe647", "_rev": "1-1918148569"}
{ "_id": "4a3d08ad999378959437f91d2d8fe647", "_rev": "2-3325253701", "name": "Allisson Azevedo", "age": 26}
13
Documentos (Cont)
{ "_id": "4a3d08ad999378959437f91d2d8fe647", "_rev": "3-3762716971", "name": "Allisson Azevedo", "age": 26, "type": "person"}
{ "_id": "4a3d08ad999378959437f91d2d8fe647", "_rev": "2-3325253701", "name": "Allisson Azevedo", "age": 26}
14
Documentos (Cont)
{ "_id": "4a3d08ad999378959437f91d2d8fe647", "_rev": "3-3762716971", "name": "Allisson Azevedo", "age": 26, "type": "person"}
{ "_id": "4a3d08ad999378959437f91d2d8fe647", "_rev": "4-3870398970", "name": "Allisson Azevedo", "age": 26, "type": "person", "measures": { "height": 169, "weight": 68 }}
15
Documentos (Cont)
{ "_id": "4a3d08ad999378959437f91d2d8fe647", "_rev": "5-3162066707", "name": "Allisson Azevedo", "age": 26, "type": "person", "measures": { "height": 169, "weight": 68 }, "_attachments": { "Imagem102.jpg": { "stub": true, "content_type": "image/jpeg", "length": 18223 } }}
{ "_id": "4a3d08ad999378959437f91d2d8fe647", "_rev": "4-3870398970", "name": "Allisson Azevedo", "age": 26, "type": "person", "measures": { "height": 169, "weight": 68 }}
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
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
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"]
19
HTTP REST API (Cont)
curl -X GET http://127.0.0.1:5984/teste/4a3d08ad999378959437f91d2d8fe647
{"_id":"4a3d08ad999378959437f91d2d8fe647","_rev":"5-3162066707","name":"Allisson Azevedo","age":26,"type":"person","measures":{"height":169,"weight":68},"_attachments":{"Imagem102.jpg":{"stub":true,"content_type":"image/jpeg","length":18223}}}
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":"6ae18b5516ccac7abe3eaf07b86b8ec8","rev":"1-3534466899"}
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}
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"}
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
24
Visões (Cont)
Exemplo de função Map
function(doc) { if (doc.name && doc.age) { emit(doc.name, doc.age); }}
25
Visões (Cont)
Exemplo de função Map
function(doc) { if (doc.name && doc.age) { emit(doc.name, doc.age); }}
Exemplo de função Reduce
function(keys, values, rereduce) { return sum(values);}
26
Visões (Cont)
27
Visões (Cont)
28
Visões (Cont)
29
Visões (Cont)
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
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
32
Replicação (Cont)
33
Replicação (Cont)
34
Replicação (Cont)
35
Replicação (Cont)
36
Replicação (Cont)
37
Replicação (Cont)
38
Perguntas?
39
Referências
□ http://couchdb.apache.org/□ http://wiki.apache.org/couchdb/□ http://books.couchdb.org/relax/
40
Obrigado!