NoSQL devops #fail?
Soluções para produção
John D. Rowell
- Atomicity Consistency Isolation Durability
- Atomicity Consistency Isolation Durability
- Sharding? Consistent Hashing?
- Atomicity Consistency Isolation Durability
- Sharding? Consistent Hashing?
- CAP?
- Atomicity Consistency Isolation Durability
- Sharding? Consistent Hashing?
- Consistency Availability Partition-tolerance
- Atomicity Consistency Isolation Durability
- Sharding? Consistent Hashing?
- Consistency Availability Partition-tolerance
- Já usa NoSQL?
- Apresentar alguns dbs NoSQL promissores
- Apresentar alguns dbs NoSQL promissores
- Identificar seus use cases
- Volume de dados (RAM, disco, rede?)
- Duração da consulta
- Queries dinâmicos / opacidade
- Apresentar alguns dbs NoSQL promissores
- Identificar seus use cases
- Volume de dados (RAM, disco, rede?)
- Duração da consulta
- Queries dinâmicos / opacidade
- Status para desenvolvimento
- Apresentar alguns dbs NoSQL promissores
- Identificar seus use cases
- Volume de dados (RAM, disco, rede?)
- Duração da consulta
- Queries dinâmicos / opacidade
- Status para desenvolvimento
- Status para produção
Salvatore Sanfilippo
VMware
- Chave/Valor + estruturas de dados em RAM
- Chave/Valor + estruturas de dados em RAM
- BS Strings, lists, sets, sorted sets, hashes
- Chave/Valor + estruturas de dados em RAM
- BS Strings, lists, sets, sorted sets, hashes
- União, interseção, diferença, ordem
- Chave/Valor + estruturas de dados em RAM
- BS Strings, lists, sets, sorted sets, hashes
- União, interseção, diferença, ordem
- Concorrência: single thread / async
- Chave/Valor + estruturas de dados em RAM
- BS Strings, lists, sets, sorted sets, hashes
- União, interseção, diferença, ordem
- Concorrência: single thread / async
- Replicação: master/slave/slave
- Chave/Valor + estruturas de dados em RAM
- BS Strings, lists, sets, sorted sets, hashes
- União, interseção, diferença, ordem
- Concorrência: single thread / async
- Replicação: master/slave/slave
- Durabilidade: snapshot ou journal (AOF)
- Chave/Valor + estruturas de dados em RAM
- BS Strings, lists, sets, sorted sets, hashes
- União, interseção, diferença, ordem
- Concorrência: single thread / async
- Replicação: master/slave/slave
- Durabilidade: snapshot ou journal (AOF)
- Alta performance local: 100,000+ RW/s
- Session store (EXPIRE)
- Cache (memcached persistente)
- Session store (EXPIRE)
- Cache (memcached persistente)
- Message queue (lists/BLPOP) e.g. restmq
- Session store (EXPIRE)
- Cache (memcached persistente)
- Message queue (lists/BLPOP) e.g. restmq
- Real-time analytics
- Session store (EXPIRE)
- Cache (memcached persistente)
- Message queue (lists/BLPOP) e.g. restmq
- Real-time analytics
- Capped logs
- Session store (EXPIRE)
- Cache (memcached persistente)
- Message queue (lists/BLPOP) e.g. restmq
- Real-time analytics
- Capped logs
- Votação e agregação (polls)
- Session store (EXPIRE)
- Cache (memcached persistente)
- Message queue (lists/BLPOP) e.g. restmq
- Real-time analytics
- Capped logs
- Votação e agregação (polls)
- Chat / Suporte online
Redis para desenvolvimento
- Linguagens: Ruby+EM, Python+Twisted, Javascript+node, Erlang, Clojure, Scala, Java, C, Lua, Haskell, Perl, PHP, outras
Redis para desenvolvimento
- Linguagens: Ruby+EM, Python+Twisted, Javascript+node, Erlang, Clojure, Scala, Java, C, Lua, Haskell, Perl, PHP, outras
- Configuração fácil, inclusive replicação
Redis para desenvolvimento
- Linguagens: Ruby+EM, Python+Twisted, Javascript+node, Erlang, Clojure, Scala, Java, C, Lua, Haskell, Perl, PHP, outras
- Configuração fácil, inclusive replicação
- Transactions: MULTI/EXEC + status
Redis para desenvolvimento
- Linguagens: Ruby+EM, Python+Twisted, Javascript+node, Erlang, Clojure, Scala, Java, C, Lua, Haskell, Perl, PHP, outras
- Configuração fácil, inclusive replicação
- Transactions: MULTI/EXEC + status
- Denormalização, estrutura, performance
Redis para desenvolvimento
- Linguagens: Ruby+EM, Python+Twisted, Javascript+node, Erlang, Clojure, Scala, Java, C, Lua, Haskell, Perl, PHP, outras
- Configuração fácil, inclusive replicação
- Transactions: MULTI/EXEC + status
- Denormalização, estrutura, performance
- Comunidade ativa (388 repos no Github)
Redis para desenvolvimento
- Linguagens: Ruby+EM, Python+Twisted, Javascript+node, Erlang, Clojure, Scala, Java, C, Lua, Haskell, Perl, PHP, outras
- Configuração fácil, inclusive replicação
- Transactions: MULTI/EXEC + status
- Denormalização, estrutura, performance
- Comunidade ativa (388 repos no Github)
- Protocolo simples -> bons drivers
- OLTP no master, DW nos slaves
- OLTP no master, DW nos slaves
- Valores grandes em DS ou VM (threaded)
- OLTP no master, DW nos slaves
- Valores grandes em DS ou VM (threaded)
- 32 e 64bits (32bits economiza RAM)
- OLTP no master, DW nos slaves
- Valores grandes em DS ou VM (threaded)
- 32 e 64bits (32bits economiza RAM)
- Performance: master não grava, slave fsync
- OLTP no master, DW nos slaves
- Valores grandes em DS ou VM (threaded)
- 32 e 64bits (32bits economiza RAM)
- Performance: master não grava, slave fsync
- Replicação slave/slave -> WAN
- OLTP no master, DW nos slaves
- Valores grandes em DS ou VM (threaded)
- 32 e 64bits (32bits economiza RAM)
- Performance: master não grava, slave fsync
- Replicação slave/slave -> WAN
- Backup automático (FS slave), restore trivial
- OLTP no master, DW nos slaves
- Valores grandes em DS ou VM (threaded)
- 32 e 64bits (32bits economiza RAM)
- Performance: master não grava, slave fsync
- Replicação slave/slave -> WAN
- Backup automático (FS slave), restore trivial
- Failover manual, master down -> downtime
mongoDB (C++, AGPL, 2009)
- Documentos JSON/BSON (<4MB)
mongoDB (C++, AGPL, 2009)
- Documentos JSON/BSON (<4MB)
- Queries dinâmicas, índices
mongoDB (C++, AGPL, 2009)
- Documentos JSON/BSON (<4MB)
- Queries dinâmicas, índices
- BLOBs: GridFS
mongoDB (C++, AGPL, 2009)
- Documentos JSON/BSON (<4MB)
- Queries dinâmicas, índices
- BLOBs: GridFS
- Concorrência: mthread, R/W locks, JS lock
mongoDB (C++, AGPL, 2009)
- Documentos JSON/BSON (<4MB)
- Queries dinâmicas, índices
- BLOBs: GridFS
- Concorrência: mthread, R/W locks, JS lock
- Multicore: satura reads, block c/ writes
mongoDB (C++, AGPL, 2009)
- Documentos JSON/BSON (<4MB)
- Queries dinâmicas, índices
- BLOBs: GridFS
- Concorrência: mthread, R/W locks, JS lock
- Multicore: satura reads, block c/ writes
- Replicação: master/slave(s), replica sets
mongoDB (C++, AGPL, 2009)
- Documentos JSON/BSON (<4MB)
- Queries dinâmicas, índices
- BLOBs: GridFS
- Concorrência: mthread, R/W locks, JS lock
- Multicore: satura reads, block c/ writes
- Replicação: master/slave(s), replica sets
- Durabilidade: nenhuma (in-place writes)
- Novo "M" em LAMP
- Web: performance via zero-join + cache
- Novo "M" em LAMP
- Web: performance via zero-join + cache
- Schema free: CRM, shopping cart
- Novo "M" em LAMP
- Web: performance via zero-join + cache
- Schema free: CRM, shopping cart
- Online gaming: game data + user profiles
- Novo "M" em LAMP
- Web: performance via zero-join + cache
- Schema free: CRM, shopping cart
- Online gaming: game data + user profiles
- GED: document store (BLOBs + metadata)
- Novo "M" em LAMP
- Web: performance via zero-join + cache
- Schema free: CRM, shopping cart
- Online gaming: game data + user profiles
- GED: document store (BLOBs + metadata)
- Catálogos: livros, filmes, músicas
- Novo "M" em LAMP
- Web: performance via zero-join + cache
- Schema free: CRM, shopping cart
- Online gaming: game data + user profiles
- GED: document store (BLOBs + metadata)
- Catálogos: livros, filmes, músicas
- Capped logs (nativo)
- Linguagens: Ruby+EM, Python+Twisted, Javascript+node, Erlang, Clojure, Scala, Java, C++, C, Lua, Haskell, Perl, PHP, outras
- Linguagens: Ruby+EM, Python+Twisted, Javascript+node, Erlang, Clojure, Scala, Java, C++, C, Lua, Haskell, Perl, PHP, outras
- Configuração fácil, inclusive replicação
- Linguagens: Ruby+EM, Python+Twisted, Javascript+node, Erlang, Clojure, Scala, Java, C++, C, Lua, Haskell, Perl, PHP, outras
- Configuração fácil, inclusive replicação
- Transactions: UPSERTs atômicos
- Linguagens: Ruby+EM, Python+Twisted, Javascript+node, Erlang, Clojure, Scala, Java, C++, C, Lua, Haskell, Perl, PHP, outras
- Configuração fácil, inclusive replicação
- Transactions: UPSERTs atômicos
- Stored procedures: Javascript no server
- Linguagens: Ruby+EM, Python+Twisted, Javascript+node, Erlang, Clojure, Scala, Java, C++, C, Lua, Haskell, Perl, PHP, outras
- Configuração fácil, inclusive replicação
- Transactions: UPSERTs atômicos
- Stored procedures: Javascript no server
- Comunidade ativa (684 repos no Github)
- Linguagens: Ruby+EM, Python+Twisted, Javascript+node, Erlang, Clojure, Scala, Java, C++, C, Lua, Haskell, Perl, PHP, outras
- Configuração fácil, inclusive replicação
- Transactions: UPSERTs atômicos
- Stored procedures: Javascript no server
- Comunidade ativa (684 repos no Github)
- API interna merece refactoring
- Writes só no master, auto-discovery
- Writes só no master, auto-discovery
- GridFS é replicado, módulo Nginx
- Writes só no master, auto-discovery
- GridFS é replicado, módulo Nginx
- Somente 64bits (32bits <4GB) EC2 $$
- Writes só no master, auto-discovery
- GridFS é replicado, módulo Nginx
- Somente 64bits (32bits <4GB) EC2 $$
- Sharding: heterogêneo, config complexa
- Writes só no master, auto-discovery
- GridFS é replicado, módulo Nginx
- Somente 64bits (32bits <4GB) EC2 $$
- Sharding: heterogêneo, config complexa
- Backup: mongodump e mongorestore
- Writes só no master, auto-discovery
- GridFS é replicado, módulo Nginx
- Somente 64bits (32bits <4GB) EC2 $$
- Sharding: heterogêneo, config complexa
- Backup: mongodump e mongorestore
- Failover automático em replica sets :)
- Writes só no master, auto-discovery
- GridFS é replicado, módulo Nginx
- Somente 64bits (32bits <4GB) EC2 $$
- Sharding: heterogêneo, config complexa
- Backup: mongodump e mongorestore
- Failover automático em replica sets :)
- RS: sem auth, administração insuficiente
Riak (Erlang+C, Apache, 2009)
- Ex-Akamai: Open Source + Enterprise
Riak (Erlang+C, Apache, 2009)
- Ex-Akamai: Open Source + Enterprise
- Use extenso de metadata. Links!
Riak (Erlang+C, Apache, 2009)
- Ex-Akamai: Open Source + Enterprise
- Use extenso de metadata. Links!
- BLOBs: nativos (<100MB)
Riak (Erlang+C, Apache, 2009)
- Ex-Akamai: Open Source + Enterprise
- Use extenso de metadata. Links!
- BLOBs: nativos (<100MB)
- Replicação: cluster homogêneo, Dynamo
Riak (Erlang+C, Apache, 2009)
- Ex-Akamai: Open Source + Enterprise
- Use extenso de metadata. Links!
- BLOBs: nativos (<100MB)
- Replicação: cluster homogêneo, Dynamo
- Durabilidade: por backend (0 a 10)
Riak (Erlang+C, Apache, 2009)
- Ex-Akamai: Open Source + Enterprise
- Use extenso de metadata. Links!
- BLOBs: nativos (<100MB)
- Replicação: cluster homogêneo, Dynamo
- Durabilidade: por backend (0 a 10)
- Shared nothing, escalabilidade horizontal
Riak latência e paralelismo
- L1: 3 cycles
- L2: 14 cycles
- RAM: 250 cycles
- DISK: 41,000,000 cycles
- NETWORK: 240,000,000 cycles
Riak latência e paralelismo
- L1: 3 cycles
- L2: 14 cycles
- RAM: 250 cycles
- DISK: 41,000,000 cycles
- NETWORK: 240,000,000 cycles
- Riak: <1000 req/s, mas...
Riak latência e paralelismo
- L1: 3 cycles
- L2: 14 cycles
- RAM: 250 cycles
- DISK: 41,000,000 cycles
- NETWORK: 240,000,000 cycles
- Riak: <1000 req/s, mas...
- Paralelismo: R/W em qualquer node!
- Controle de versão: Vector clocks
- Controle de versão: Vector clocks
- Resolução de conflitos no aplicativo
- Controle de versão: Vector clocks
- Resolução de conflitos no aplicativo
- Escalando dados: re-balance automático
- Controle de versão: Vector clocks
- Resolução de conflitos no aplicativo
- Escalando dados: re-balance automático
- Disponibilidade: hinted handoff
- Controle de versão: Vector clocks
- Resolução de conflitos no aplicativo
- Escalando dados: re-balance automático
- Disponibilidade: hinted handoff
- Consistência: eventual, mas =~ ms
- Controle de versão: Vector clocks
- Resolução de conflitos no aplicativo
- Escalando dados: re-balance automático
- Disponibilidade: hinted handoff
- Consistência: eventual, mas =~ ms
- Durabilidade: tunable DW por bucket
- Controle de versão: Vector clocks
- Resolução de conflitos no aplicativo
- Escalando dados: re-balance automático
- Disponibilidade: hinted handoff
- Consistência: eventual, mas =~ ms
- Durabilidade: tunable DW por bucket
- Performance menos previsível
- S3-like: armazena e serve direto por HTTP
- S3-like: armazena e serve direto por HTTP
- DW: grandes volumes, proc. offline
- S3-like: armazena e serve direto por HTTP
- DW: grandes volumes, proc. offline
- FTS: Riak Search, Lucene (beta fechado)
- S3-like: armazena e serve direto por HTTP
- DW: grandes volumes, proc. offline
- FTS: Riak Search, Lucene (beta fechado)
- CDN: Replicação WAN (Enterprise)
- S3-like: armazena e serve direto por HTTP
- DW: grandes volumes, proc. offline
- FTS: Riak Search, Lucene (beta fechado)
- CDN: Replicação WAN (Enterprise)
- GED: document store (BLOBs + metadata)
- S3-like: armazena e serve direto por HTTP
- DW: grandes volumes, proc. offline
- FTS: Riak Search, Lucene (beta fechado)
- CDN: Replicação WAN (Enterprise)
- GED: document store (BLOBs + metadata)
- Catálogos: livros, filmes, músicas
- Linguagens: Ruby, Python, Javascript+node, Erlang, Java, PHP
- Linguagens: Ruby, Python, Javascript+node, Erlang, Java, PHP
- Protocolo HTTP/REST ou Protobuffs
- Linguagens: Ruby, Python, Javascript+node, Erlang, Java, PHP
- Protocolo HTTP/REST ou Protobuffs
- Configuração média, exige estudo
- Linguagens: Ruby, Python, Javascript+node, Erlang, Java, PHP
- Protocolo HTTP/REST ou Protobuffs
- Configuração média, exige estudo
- Transactions: não
- Linguagens: Ruby, Python, Javascript+node, Erlang, Java, PHP
- Protocolo HTTP/REST ou Protobuffs
- Configuração média, exige estudo
- Transactions: não
- Comunidade pequena (67 repos no Github)
- Linguagens: Ruby, Python, Javascript+node, Erlang, Java, PHP
- Protocolo HTTP/REST ou Protobuffs
- Configuração média, exige estudo
- Transactions: não
- Comunidade pequena (67 repos no Github)
- Buckets são só namespaces (gotcha!)
- Linguagens: Ruby, Python, Javascript+node, Erlang, Java, PHP
- Protocolo HTTP/REST ou Protobuffs
- Configuração média, exige estudo
- Transactions: não
- Comunidade pequena (67 repos no Github)
- Buckets são só namespaces (gotcha!)
- Dados opacos, Map/Reduce e link walking
- Auto-healing, escala para cima e para baixo
- Auto-healing, escala para cima e para baixo
- Bitcask (default) mantém chaves em RAM
- Auto-healing, escala para cima e para baixo
- Bitcask (default) mantém chaves em RAM
- 32 e 64bits
- Auto-healing, escala para cima e para baixo
- Bitcask (default) mantém chaves em RAM
- 32 e 64bits
- Backup e restore: riak-admin
- Auto-healing, escala para cima e para baixo
- Bitcask (default) mantém chaves em RAM
- 32 e 64bits
- Backup e restore: riak-admin
- Join e leave: riak-admin
- Auto-healing, escala para cima e para baixo
- Bitcask (default) mantém chaves em RAM
- 32 e 64bits
- Backup e restore: riak-admin
- Join e leave: riak-admin
- Pode ficar atrás de um load balancer
- Auto-healing, escala para cima e para baixo
- Bitcask (default) mantém chaves em RAM
- 32 e 64bits
- Backup e restore: riak-admin
- Join e leave: riak-admin
- Pode ficar atrás de um load balancer
- Distro binária com Erlang embutido
Mike Stonebraker
of PostgreSQL fame
VoltDB, LLC
VoltDB (Java/C++, GPL, 2010)
- Somente OLTP, export para DW embutido
VoltDB (Java/C++, GPL, 2010)
- Somente OLTP, export para DW embutido
- Sintaxe SQL, stored procedures em Java
VoltDB (Java/C++, GPL, 2010)
- Somente OLTP, export para DW embutido
- Sintaxe SQL, stored procedures em Java
- Eficiência: só 5% de overhead (!90%)
VoltDB (Java/C++, GPL, 2010)
- Somente OLTP, export para DW embutido
- Sintaxe SQL, stored procedures em Java
- Eficiência: só 5% de overhead (!90%)
- Concorrência: serial, sync, sem locks
VoltDB (Java/C++, GPL, 2010)
- Somente OLTP, export para DW embutido
- Sintaxe SQL, stored procedures em Java
- Eficiência: só 5% de overhead (!90%)
- Concorrência: serial, sync, sem locks
- Durabilidade: RAM, escrita async em disco
VoltDB (Java/C++, GPL, 2010)
- Somente OLTP, export para DW embutido
- Sintaxe SQL, stored procedures em Java
- Eficiência: só 5% de overhead (!90%)
- Concorrência: serial, sync, sem locks
- Durabilidade: RAM, escrita async em disco
- Relacional: Schema* e topologia fixos
VoltDB (Java/C++, GPL, 2010)
- Somente OLTP, export para DW embutido
- Sintaxe SQL, stored procedures em Java
- Eficiência: só 5% de overhead (!90%)
- Concorrência: serial, sync, sem locks
- Durabilidade: RAM, escrita async em disco
- Relacional: Schema* e topologia fixos
- Particionamento e sharding automáticos
- Transactions: banking, reservas, estoque
- Transactions: banking, reservas, estoque
- Bolsa de valores: volume + transações
- Transactions: banking, reservas, estoque
- Bolsa de valores: volume + transações
- Real-time analytics: coletar + agregar
- Transactions: banking, reservas, estoque
- Bolsa de valores: volume + transações
- Real-time analytics: coletar + agregar
- Online gaming: manter e distribuir estado
- Transactions: banking, reservas, estoque
- Bolsa de valores: volume + transações
- Real-time analytics: coletar + agregar
- Online gaming: manter e distribuir estado
- Telecom: conectar e tarifar ligações
- Transactions: banking, reservas, estoque
- Bolsa de valores: volume + transações
- Real-time analytics: coletar + agregar
- Online gaming: manter e distribuir estado
- Telecom: conectar e tarifar ligações
- Social: distribuir feeds (e.g. Twitter)
VoltDB em desenvolvimento
- Linguagens: Java, C++, Ruby, Erlang, Clojure, PHP
VoltDB em desenvolvimento
- Linguagens: Java, C++, Ruby, Erlang, Clojure, PHP
- Interface HTTP/JSON: qualquer linguagem
VoltDB em desenvolvimento
- Linguagens: Java, C++, Ruby, Erlang, Clojure, PHP
- Interface HTTP/JSON: qualquer linguagem
- Configuração avançada, ciclos dump/reload
VoltDB em desenvolvimento
- Linguagens: Java, C++, Ruby, Erlang, Clojure, PHP
- Interface HTTP/JSON: qualquer linguagem
- Configuração avançada, ciclos dump/reload
- Transactions: ACID dentro de uma partição
VoltDB em desenvolvimento
- Linguagens: Java, C++, Ruby, Erlang, Clojure, PHP
- Interface HTTP/JSON: qualquer linguagem
- Configuração avançada, ciclos dump/reload
- Transactions: ACID dentro de uma partição
- Comunidade inexistente (2 repos no Github)
VoltDB em desenvolvimento
- Linguagens: Java, C++, Ruby, Erlang, Clojure, PHP
- Interface HTTP/JSON: qualquer linguagem
- Configuração avançada, ciclos dump/reload
- Transactions: ACID dentro de uma partição
- Comunidade inexistente (2 repos no Github)
- Limitações, grandes mudanças entre versões
(gotcha! gotcha!)
- RAM mínima recomendada: 4GB/node ($$)
- RAM mínima recomendada: 4GB/node ($$)
- Sincronismo de clocks: NTP (mesmo server!)
- RAM mínima recomendada: 4GB/node ($$)
- Sincronismo de clocks: NTP (mesmo server!)
- Apenas 64bits, virtualização problemática
- RAM mínima recomendada: 4GB/node ($$)
- Sincronismo de clocks: NTP (mesmo server!)
- Apenas 64bits, virtualização problemática
- Não suporta WAN (latência)
- RAM mínima recomendada: 4GB/node ($$)
- Sincronismo de clocks: NTP (mesmo server!)
- Apenas 64bits, virtualização problemática
- Não suporta WAN (latência)
- 1 partição por core, serializada
- RAM mínima recomendada: 4GB/node ($$)
- Sincronismo de clocks: NTP (mesmo server!)
- Apenas 64bits, virtualização problemática
- Não suporta WAN (latência)
- 1 partição por core, serializada
- Replicar tabelas read-only em todos os nodes
- RAM mínima recomendada: 4GB/node ($$)
- Sincronismo de clocks: NTP (mesmo server!)
- Apenas 64bits, virtualização problemática
- Não suporta WAN (latência)
- 1 partição por core, serializada
- Replicar tabelas read-only em todos os nodes
- +Node: save/restore snapshot -> downtime
Perguntas?
John D. Rowell
github.com/jdrowell
me@jdrowell.com