TRADE-OFF'S DE
CONFIABILIDADE E
DISPONIBILIDADE
COM BANCOS DE DADOS NOSQL
NoSQL?
Como representar dados?
Modelo Relacional
Modelo Relacional
RelaçõesSuplas
Tuplas
Modelo Relacional
TabelasLinhas
Modelo Relacional
Relacionamentos
Modelo Relacional
Alunos
ID Nome Idade
1 Leonardo 20
2 Carlos 18
3 Bruno 30
4 José 19
Modelo Relacional
Alunos
ID Nome Idade
1 Leonardo 20
2 Carlos 18
3 Bruno 30
4 José 19
Chave
primária
Modelo Relacional
Requerimentos
ID Mensagem Aluno_ID
1
Renovação de
Carterinha
1
2 Segunda chamada 2
3 Trancar matrícula 4
Modelo Relacional
Requerimentos
ID Mensagem Aluno_ID
1
Renovação de
Carterinha
1
2 Segunda chamada 2
3 Trancar matrícula 4
Chave
estrangeira
Modelo Relacional
- Modelo de dados simples
Modelo Relacional
- Modelo de dados simples
- Contrato forte (schema design)
Modelo Relacional
- Modelo de dados simples
- Contrato forte (schema design)
- Interoperabilidade
Modelo Relacional
Modelo Relacional
Modelo Relacional
Modelo Relacional
Banco de Integração
Requisitos não-funcionais
Concurrency control
x
1
1 0
Transactions (TX)
Begin Commit
1 0
Transactions (TX)
Begin Commit
Estado
Consistente
Estado
Consistente
Unit of Work
Transactions (TX)
A
C
I
D
tomic
onsistent
solation
urable
Transactions (TX)
Begin
1
Transactions (TX)
Begin
Begin Commit
1 0
1
Transactions (TX)
Begin
Begin Commit
1 0
1
?
Isolation levels
Serializable
Repeatable Reads
Read Committed
Read Uncommitted
Meu nome é
ACID
Isolation levels
==
Controle de consistência
Bancos Relacionais
- Modelo Relacional
- Integração
- Transações “ACID”
- Segurança
NoSQL?
“Quando tudo o que se tem é um martelo, todos
os problemas parecem pregos"
“Quando tudo o que se tem é um martelo, todos
os problemas parecem pregos"
Complexity
Performance
Como salvar Logs?
Como salvar um mapa?
Como salvar isso?
Como modelar hierarquias?
Impendance Mismatch
Impendance Mismatch
Impendance Mismatch
RelaçõesSuplas
Tuplas
Cara no meio
ORM
Impedance Mismatch
Dados não uniformes
Produto
Nome, Modelo, Cor
Produto
Nome, Modelo, Cor,Ano de Fabricação
Escalabilidade
Vertical
Horizontal
?
? ?
?? ?
Questões técnicas
Confiabilidade
Usuarios, Cursos, Professores,Turmas
Usuarios, Cursos Professores,Turmas
Usuarios, Cursos Professores,Turmas
Ponto único de falhas
por fragmento
Disponibilidade
por
fragmento
Integridade referencial
Transações
Consistência
Questões técnicas
Questões comerciais
Questões técnicas
Questões comerciais
NoSQL
==
Persistência Poliglota
Como?
Modelos de distribuição
Produtos,Vendas, Usuarios, Franquias
Não distribuir :)
Produtos,Vendas, Usuarios, Franquias
Produtos,Vendas, Usuarios, Franquias
Produtos,Vendas, Usuarios, Franquias
Produtos,Vendas, Usuarios, Franquias
Produtos,Vendas, Usuarios, Franquias
Produtos,Vendas, Usuarios, Franquias
100%
Produtos
Vendas
Usuários
Franquias
Produtos
Vendas
Usuários
Franquias
25%
25%
25%
25%
Produtos
25%
Franquias
25%
Usuario
25%
Vendas
25%
Produtos Franquias Usuario Vendas
25% 25% 25% 25%
Fragmentação
(Sharding)
Produtos Franquias Usuario Vendas
Produtos Franquias Usuario Vendas
Produtos Franquias Usuario Vendas
Produtos Franquias Usuario Vendas
Produtos Franquias Usuario Vendas
100% 100% 100% 100%
Como organizar
os dados nos
fragmentos?
Distribuição Geográfica
Vendas
0
50
100
150
200
Bangu Campo Grande Méier Santa Cruz
Franquias
0
50
100
150
200
Bangu Campo Grande Méier Santa Cruz
Produtos Franquias,Vendas Usuario
Campo Grande
Parelhamento de Carga
A B C D
25% 25% 25% 25%
Dias da semana
Acesso aos dados quentes
0
50
100
150
200
Quarta Quinta Sexta Sábado
Quando fragmentar?
Fragmentação
+ Performance
Fragmentação
+ Performance
- Disponibilidade por fragmento
Produtos Franquias,Vendas Usuario
Campo Grande
Produtos
Produtos
Produtos
Leituras
Produtos
Escritas
Leituras
Produtos
Escritas
Leituras
Produtos
Escritas
Leituras
Produtos
Escritas
Slave
Produtos
Master
Slave
Produtos
Master
Slave
Produtos
Master
Slave
Produtos
Master Slave
Replicação
(Master-slave)
Fragmentação + Replicação
(master-slave)
+ Performance
+Tolerância a falhas
Produtos
Master
Slave
Produtos
Master
Slave
Produtos
Master
Slave
Produtos
Master
Slave
Produtos
Master
Slave
B
Consistência eventual
Atualizações são propagadas um tempo depois
Consistência eventual
Atualizações são propagadas um tempo depois
Abrindo Janelas de Inconsistência
Inconsistência
de
Leitura
Produtos
Master
Slave
Produtos
Master
Slave
OK!
Produtos
Master
Slave
Falha de durabilidade
Produtos
Master
Slave
Produtos
Master
Slave
Produtos
Master
Slave
OK!
Produtos
Master
Slave
Produtos
Master
Slave
Produtos
Master
?
Replicação
(p2p)
{
"produto" : "Maçã",
"massa" : 20
}
{
"produto" : "Maçã",
"massa" : 20
}
{
"produto" : "Maçã",
"massa" : 20
}
{
"produto" : "Maçã",
"massa" : 20
}
Massa: 17 Massa: 21
{
"produto" : "Maçã",
"massa" : 20
}
{
"produto" : "Maçã",
"massa" : 20
}
Massa: 17 Massa: 21
?
Inconsistência de
gravação
(Conflito escrita-escrita)
{
"produto" : "Maçã",
"massa" : 20
}
{
"produto" : "Maçã",
"massa" : 20
}
Massa: 17 Massa: 21
Leonardo Amanda
{
"produto" : "Maçã",
“massa” : 21
}
{
"produto" : "Maçã",
“massa” : 17
}
Soluções
Lock
{
"produto" : "Maçã",
"massa" : 20
}
{
"produto" : "Maçã",
"massa" : 20
}
Leonardo Amanda
{
"produto" : "Maçã",
"massa" : 20
}
{
"produto" : "Maçã",
"massa" : 20
}
Leonardo Amanda
Quero
escrever!
{
"produto" : "Maçã",
"massa" : 20
}
{
"produto" : "Maçã",
"massa" : 20
}
Leonardo Amanda
Quero
escrever!
{
"produto" : "Maçã",
"massa" : 20
}
{
"produto" : "Maçã",
"massa" : 20
}
Massa: 17
Leonardo Amanda
Quero
escrever!
{
"produto" : "Maçã",
"massa" : 20
}
{
"produto" : "Maçã",
"massa" : 20
}
Massa: 17
Leonardo Amanda
Quero
escrever!
Lock pessimista
Lock pessimista
- Performance
{
"produto" : "Maçã",
"massa" : 20,
"versao" : 0,
}
{
"produto" : "Maçã",
"massa" : 20,
"versao" : 0,
}
{
"produto" : "Maçã",
"massa" : 20,
"versao" : 0,
}
Leonardo
Versão: 0
{
"produto" : "Maçã",
"massa" : 20,
"versao" : 0,
}
Amanda
Versão: 0
{
"produto" : "Maçã",
"massa" : 20,
"versao" : 1,
}
Amanda
{
"produto" : "Maçã",
"massa" : 20,
"versao" : 1,
}
Leonardo
Versão: 0
{
"produto" : "Maçã",
"massa" : 20,
"versao" : 1,
}
Leonardo
Versão: 0
Lock otimista
Serialização é necessário
Replicação
(Master-slave)
{
"produto" : "Maçã",
"massa" : 20
}
{
"produto" : "Maçã",
"massa" : 20
}
Massa: 17 Massa: 21
?
{
"produto" : "Maçã",
"massa" : 20
}
Massa: 17 Massa: 21
Aceitar escritas
{
"produto" : "Maçã",
"massa" : 20
}
{
"produto" : "Maçã",
"massa" : 20
}
Massa: 17 Massa: 21
Usuário decide
Inconsistência
=
Problema
?
Load Balancer
Load Balancer
Load Balancer
Relaxar
Relaxar
Relaxar
Bancos relacionais já faziam
Relaxar
Bancos relacionais já faziam
MyISAM
Relaxar
Bancos relacionais já faziam
MyISAM
Performance
CAP
Split Brain
CA
CP
AP
CA
CA
CA
CA
CA
Cluster tem que saber lidar com
particionamento!
CAP
Balancear Consistência e Disponibilidade
Rio de Janeiro
São Paulo
Rio de Janeiro
São Paulo
Pode?
Rio de Janeiro
São Paulo
Rio de Janeiro
São Paulo
Nega a escrita
CP
CONSISTÊNCIA
EVENTUAL
AP
O que acontece
O que acontece
Quando não há particionamento?
CAP
Consistência
sempre!
Por que sacrificar a
consistência?
Quando não há particionamento?
AP
CONSISTÊNCIA
EVENTUAL
Latência
Baixa latência
Consistência forte
VS
P?(A|C):(C|L)
PAC/CL
particionamento?
sim!
consistência
disponibilidade
não!
consistência
latência
Resumão
ENEM
NoSQLPersistencia poliglota
Modelo de dados
Clusterização
Fragmentação
Replicação
Problemas de consistência
Relaxar consistência
CAP
P?(A|C):(C|L)
Obrigado!
Leonardo Cordeiro
leonardobcordeirodev@gmail.com
:)

NoSQL e CAP