CouchDB:
           Um banco de dados
           orientado a documento
           Allisson Azevedo
           http://blog.allisson.eti.br
           allisson@gmail.com


20/06/09
Agenda

□
    História do CouchDB
□
    Problemas RDBMS
□
    Construído para o futuro
□
    Documentos (Documents)
□
    HTTP REST API
□
    Visões (Views)
□
    Replicação (Replication)

                               2
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
História do CouchDB (Cont)

□
    Versão atual 0.9.0
□
    Projeto oficial da Apache.org




                                    4
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
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
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
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
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
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
Documentos (Cont)

{
    "_id": "4a3d08ad999378959437f91d2d8fe647",
    "_rev": "1-1918148569"
}




                                            11
Documentos (Cont)

{
    "_id": "4a3d08ad999378959437f91d2d8fe647",
    "_rev": "2-3325253701",
    "name": "Allisson Azevedo",
    "age": 26
}




                                            12
Documentos (Cont)

{
    "_id": "4a3d08ad999378959437f91d2d8fe647",
    "_rev": "3-3762716971",
    "name": "Allisson Azevedo",
    "age": 26,
    "type": "person"
}




                                            13
Documentos (Cont)

{
    "_id": "4a3d08ad999378959437f91d2d8fe647",
    "_rev": "4-3870398970",
    "name": "Allisson Azevedo",
    "age": 26,
    "type": "person",
    "measures": {
      "height": 169,
      "weight": 68
    }
}


                                           14
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
       }
    }
}
                                                 15
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
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
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
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
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
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
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
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
Visões (Cont)

Exemplo de função Map

function(doc) {
 if (doc.name && doc.age) {
 emit(doc.name, doc.age);
 }
}




                              24
Visões (Cont)

Exemplo de função Reduce

function(keys, values, rereduce) {
 return sum(values);
}




                                     25
Visões (Cont)




                26
Visões (Cont)




                27
Visões (Cont)




                28
Visões (Cont)




                29
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
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
Replicação (Cont)




                    32
Replicação (Cont)




                    33
Replicação (Cont)




                    34
Replicação (Cont)




                    35
Replicação (Cont)




                    36
Replicação (Cont)




                    37
Perguntas?




             38
Referências

□
    http://couchdb.apache.org/
□
    http://wiki.apache.org/couchdb/
□
    http://books.couchdb.org/relax/




                                      39
Obrigado!




            40

Palestra CouchDB III ENSOL

  • 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 oFuturo □ 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 oFuturo (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
  • 11.
    Documentos (Cont) { "_id": "4a3d08ad999378959437f91d2d8fe647", "_rev": "1-1918148569" } 11
  • 12.
    Documentos (Cont) { "_id": "4a3d08ad999378959437f91d2d8fe647", "_rev": "2-3325253701", "name": "Allisson Azevedo", "age": 26 } 12
  • 13.
    Documentos (Cont) { "_id": "4a3d08ad999378959437f91d2d8fe647", "_rev": "3-3762716971", "name": "Allisson Azevedo", "age": 26, "type": "person" } 13
  • 14.
    Documentos (Cont) { "_id": "4a3d08ad999378959437f91d2d8fe647", "_rev": "4-3870398970", "name": "Allisson Azevedo", "age": 26, "type": "person", "measures": { "height": 169, "weight": 68 } } 14
  • 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 } } } 15
  • 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 defunção Map function(doc) { if (doc.name && doc.age) { emit(doc.name, doc.age); } } 24
  • 25.
    Visões (Cont) Exemplo defunção Reduce function(keys, values, rereduce) { return sum(values); } 25
  • 26.
  • 27.
  • 28.
  • 29.
  • 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
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
    Referências □ http://couchdb.apache.org/ □ http://wiki.apache.org/couchdb/ □ http://books.couchdb.org/relax/ 39
  • 40.