Palestra CouchDB III ENSOL

Post on 30-Jun-2015

1.574 views 0 download

Transcript of Palestra CouchDB III ENSOL

20/06/09

CouchDB:Um banco de dados orientado a documento

Allisson Azevedohttp://blog.allisson.eti.brallisson@gmail.com

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!