Apresentação realizada no QCon Rio de Janeiro 2014.
Análise de razões que levam pessoas à adoção de bancos de dados NoSQL e ver o porquê em muitos casos não é necessário um NoSQL – ou pior, não deveria ter sido usado um. Quando usar? Quando não usar? Qual usar, ou não usar? São dúvidas que tentaremos esclarecer, com enfoque no que o PostgreSQL resolve.
Analisaremos a utilização de características especiais do PostgreSQL, como documentos chave-valor e JSON e full-text search, além dos erros mais comuns cometidos no PostgreSQL pela falta de familiaridade com o banco.
Serão ainda discutidas soluções para problemas de performance, controle de concorrência, consistência e durabilidade – e falaremos um pouco sobre escalabilidade e o que se espera nas versões em desenvolvimento do PostgreSQL.
1. PostgreSQL e porque voc^e n~ao precisa de NoSQL
Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
2. Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
DBA PostgreSQL { consultorias e suportes
24x7/8x5
Instrutor dos treinamentos PostgreSQL
Concepc~ao, desenvolvimento e suporte a
produc~ao
3. Matheus de Oliveira
matheus.oliveira@dextra.com.br
Mais de 15 anos trabalhando de suporte e
consultoria PostgreSQL
http://www.dextra.com.br/
Crafting Software, Transforming Business
Instrutor dos treinamentos PostgreSQL
Concepc~ao, desenvolvimento e suporte a
produc~ao
4. Matheus de Oliveira
matheus.oliveira@dextra.com.br
Mais de 15 anos trabalhando de suporte e
consultoria PostgreSQL
http://www.dextra.com.br/
Crafting Software, Transforming Business
10 anos e mais de 10 mil pro
5. ssionais
capacitados em todo o Brasil.
http://www.dextraining.com.br/
Aprenda com quem faz na pratica
Concepc~ao, desenvolvimento e suporte a
produc~ao
6. Matheus de Oliveira
matheus.oliveira@dextra.com.br
Mais de 15 anos trabalhando de suporte e
consultoria PostgreSQL
http://www.dextra.com.br/
Crafting Software, Transforming Business
10 anos e mais de 10 mil pro
7. ssionais
capacitados em todo o Brasil.
http://www.dextraining.com.br/
Aprenda com quem faz na pratica
SaaS para analise e monitoramento PostgreSQL
http://www.pganalytics.com.br/
Facilitando a vida do DBA
8. Para pensar...
A melhor soluc~ao para o seu problema agora
VS
A melhor soluc~ao de todas, a todo custo
3 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
9. Para pensar...
A melhor soluc~ao para o seu problema agora
VS
A melhor soluc~ao de todas, a todo custo
3 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
10. Para pensar...
Cuidado com o que voc^e pensa ser moderno.
Armazenamentos chave/valor e documentos datam de antes das
teorias de bancos relacionais.
4 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
11. Bancos de dados relacionais e NoSQLs
Bancos relacionais:
Baseados no modelo relacional
Transac~oes ACID
Atomicidade
Consist^encia
Isolamento
Durabilidade
Interface de consulta padr~ao {
SQL
Armazenamento em relac~oes {
estrutura acoplada
...
Bancos NoSQL:
Transac~oes BASE:
Basic Availability
Soft-state
Eventual consistency
Interface de consulta propria
Schemaless:
Chave-Valor
Documento
Grafos
...
Performance como prioridade
In-place update
Operac~oes assncronas
...
5 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
12. PostgreSQL
one database to rule them all
FOSS { Free Open
Source Software
Quase 30 anos de
experi^encia
Robustez, con
13. abilidade,
maturidade
Diversas funcionalidades,
e novas a cada vers~ao
Forte extensibilidade
6 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
15. hstore { Armazenamento chave/valor
Presente como uma contrib do PostgreSQL desde a vers~ao 8.3
(2008)
Armazenamento de chaves/valores como atributo (coluna) de uma
tabela
Diversos operadores para manipulac~ao, navegac~ao e
16. ltragem
(busca)
Indexac~ao B-tree, GIN e GIST
Exemplo:
SELECT * FROM movies
WHERE ( moviedata -’imdb_rate ’):: int 4
AND moviedata -’ alternate_title ’ = ’Black
Mask ’;
8 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
17. hstore { Armazenamento chave/valor
Limitac~oes:
Aceita apenas texto, tanto para chave quanto para valor
N~ao aceita valores aninhados (hstore de hstore)
Alternativas NoSQL:
Redis
Riak
MemcacheDB
Berkeley DB
Dynamo
...
9 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
19. JSON
2012 { vers~ao 9.2 { tipo json, basicamente text com validac~oes
2013 { vers~ao 9.3 { ainda json, mas com func~oes fantasticas (a
grande adoc~ao comeca)
2014 { vers~ao 9.4 (lancamento ainda este m^es) { tipo jsonb,
binario (estrutura interna baseada no hstore), indexac~ao GIN {
ultra-blaster-rapido
11 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
20. JSON
CREATE TABLE booksdata (
title text PRIMARY KEY ,
booksdata jsonb
);
12 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
21. JSON
SELECT title ,
bookdata - ’ current_edition ’ AS edition ,
bookdata # ’{ publication_info , 0, isbn } ’
AS isbn
FROM booksdata
WHERE bookdata @ ’{ publication_info : [{
publisher : Avon } ] }’:: jsonb
ORDER BY bookdata # ’{ publication_info , 0,
price } ’ DESC ;
13 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
22. JSON
Ah!!! E eu comentei que e indexado?
14 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
23. JSON
Ah!!! E eu comentei que e indexado?
DE VERDADE
CREATE INDEX booksdata_json_idx ON booksdata
USING GIN ( booksdata );
14 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
24. JSON
Ah!!! E eu comentei que e indexado?
DE VERDADE
CREATE INDEX booksdata_json_idx ON booksdata
USING GIN ( booksdata );
GIN to the rescue!!!
14 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
25. JSON
Limitac~oes:
O tipo json e armazenado em texto e possui fraca indexac~ao,
mas sua evoluc~ao, o tipo jsonb e armazenado em binario
Diferente do json, o jsonb possui as limitac~oes:
n~ao armazena a ordem original das chaves (elas sempre ser~ao
mostradas em ordem lexicogra
26. ca)
n~ao aceita chaves repetidas
(basicamente json armazena exatamente como voc^e passa, mas
jsonb faz um processamento extra)
Eu diria que hoje, o PostgreSQL possui o mais avancado mecanismo
de indexac~ao para JSON (jsonb) dos bancos de dados open
sources (de todos? provavelmente)
15 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
27. JSON
Alguns NoSQLs orientado a documentos:
MongoDB
CouchDB
Cassandra
SimpleDB
...
16 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
29. Full Text Search
FTS nativo no PostgreSQL (tsvector, tsquery, ...)
SELECT * FROM articles t(fts)
WHERE fts @@ tsquery ’PostgreSQL NewSQL ’
ORDER BY ts_rank (fts , tsquery ’PostgreSQL
NewSQL ’);
Busca por similaridade (contrib pg trgm)
SELECT set_limit (0.2) ;
SELECT *, title - ’NewSQL ’ AS sml
FROM articles
WHERE title % ’NewSQL ’
ORDER BY sml DESC LIMIT 10;
18 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
30. Full Text Search
FTS nativo no PostgreSQL (tsvector, tsquery, ...)
SELECT * FROM articles t(fts)
WHERE fts @@ tsquery ’PostgreSQL NewSQL ’
ORDER BY ts_rank (fts , tsquery ’PostgreSQL
NewSQL ’);
Busca por similaridade (contrib pg trgm)
SELECT set_limit (0.2) ;
SELECT *, title - ’NewSQL ’ AS sml
FROM articles
WHERE title % ’NewSQL ’
ORDER BY sml DESC LIMIT 10;
Claro, tudo devidamente indexado... GIN and GIST rocks
18 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
31. Full Text Search
Limitac~oes:
N~ao processa documentos como PDF, DOC, etc.
Ate a vers~ao 9.4 performance mais baixa para algumas operac~oes
(como ordenac~ao por maior similaridade) { GIN evoluiu na vers~ao
9.4
Alguns NoSQLs com FTS:
Solr
Lucene
Elastic Search
Sphinx
e tambem MySQL
19 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
33. Consultas em grafos e hierarquias
Pode ser facilmente realizada utilizando consultas recursivas
O desempenho depende do
34. ltro e profundidade da navegac~ao
Exemplo, catalogo de roles (usuarios/grupos) do PostgreSQL:
WITH RECURSIVE roles AS (
SELECT r. oid AS roleid , r. rolname ,
1 AS level , array [r. rolname ] AS path
FROM pg_authid r
WHERE r. oid NOT IN (
SELECT m. member FROM pg_auth_members m)
UNION ALL
SELECT r.oid , r. rolname ,
p. level + 1, p. path || r. rolname
FROM pg_auth_members m
INNER JOIN pg_authid r ON m. member = r. oid
INNER JOIN roles p ON m. roleid = p. roleid
)
SELECT repeat (’|__ ’, level -1) || rolname
FROM roles
ORDER BY path ;
21 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
35. Consultas em grafos e hierarquias
Resultado:
administrativo
| __comercial
|__| __carla
|__| __maria
| __financeiro
|__| __ana
|__| __paulo
ti
| __beatriz
| __julio
| __matheus
...
22 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
36. Consultas em grafos e hierarquias
Limitac~oes:
Um pouco complexo, mas voc^e acostuma
Performance dependente principalmente da altura
N~ao muito bem preparado para busca em espacos de buscas
grandes ou estruturas de grafos complexas
Bancos NoSQL orientados a grafos:
Neo4j
OrientDB
...
23 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
38. Operac~oes assncronas
Quando n~ao precisamos garantir durabilidade em tempo real:
Desabilite o par^ametro synchronous commit:
SET synchronous_commit TO off ;
Para dados transientes:
UNLOGGED TABLES
Quando precisamos de operac~oes n~ao bloqueantes:
PQsendQuery, PQsendPrepare, PQconsumeInput,
PQisBusy, ...
Processamento de mensagens:
Sincronia pode ser atingida com auxlio de advisory locks
Troca de mensagens (ativac~ao, pull/push, sender/receiver, etc.) com
LISTEN/NOTIFY
25 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
40. la
Ideia:
Processos a executar s~ao guardados numa tabela:
CREATE TABLE queue (id serial , processed boolean
default false , ... , job jsonb );
Para inserir um job para execuc~ao:
BEGIN ;
INSERT INTO queue (job)
VALUES (’{ jobName : foo, ...} ’);
NOTIFY jobexecutor ;
COMMIT ; /* NOTIFY dispara somente depois */
job executors
44. la { job executor
1 UPDATE queue
2 SET processed = true
3 WHERE NOT processed AND id IN(
4 SELECT id FROM (
5 SELECT id FROM queue
6 WHERE NOT processed
7 ORDER BY id
8 LIMIT 100
9 ) t
10 WHERE
11 pg_try_advisory_xact_lock (
12 tableoid :: int , id)
13 ORDER BY id
14 LIMIT 1
15 )
16 RETURNING job;
27 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
46. la { job executor
1 UPDATE queue
2 SET processed = true
3 WHERE NOT processed AND id IN(
4 SELECT id FROM (
5 SELECT id FROM queue
6 WHERE NOT processed
7 ORDER BY id
8 LIMIT 100
9 ) t
10 WHERE
11 pg_try_advisory_xact_lock (
12 tableoid :: int , id)
13 ORDER BY id
14 LIMIT 1
15 )
16 RETURNING job;
28 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
48. la { job executor
1 UPDATE queue
2 SET processed = true
3 WHERE NOT processed AND id IN(
4 SELECT id FROM (
5 SELECT id FROM queue
6 WHERE NOT processed
7 ORDER BY id
8 LIMIT 100
9 ) t
10 WHERE
11 pg_try_advisory_xact_lock (
12 tableoid :: int , id)
13 ORDER BY id
14 LIMIT 1
15 )
16 RETURNING job;
29 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
50. la { job executor
1 UPDATE queue
2 SET processed = true
3 WHERE NOT processed AND id IN(
4 SELECT id FROM (
5 SELECT id FROM queue
6 WHERE NOT processed
7 ORDER BY id
8 LIMIT 100
9 ) t
10 WHERE
11 pg_try_advisory_xact_lock (
12 tableoid :: int , id)
13 ORDER BY id
14 LIMIT 1
15 )
16 RETURNING job;
30 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
52. cas de SQL
Um pouco complicadinho, n~ao acham?
Outras opc~oes (n~ao so NoSQL):
pgq {
53. la alta performance em PostgreSQL
RabbitMQ
ActiveMQ
MongoDB (tailable cursors)
...
31 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
55. Usando ACID em alta concorr^encia
PostgreSQL e 100% ACID compilante
Isso nos traz um poderoso controle de transac~oes
Mas... Para ter transac~ao, precisamos de bloqueios, mais
conhecido como locks
33 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
56. Usando ACID em alta concorr^encia
No PostgreSQL locks s~ao podem ser:
de varios modos { compartilhados, exclusivo, acesso exclusivo, etc.
de
57. nidos pelo usuario { advisory locks
em varios nveis { tuplas, paginas, tabelas, etc.
S~ao essenciais (acredite, n~ao vai querer abrir m~ao disto)
Mas... Muitas vezes precisamos ter um certo trabalho para reduzir
o numero ou tempo de bloqueios
34 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
58. Usando ACID em alta concorr^encia
Regra no PostgreSQL: escritores nunca bloqueiam leitores e leitores
nunca bloqueiam escritores nem outros leitores (mas escritores
bloqueiam escritores)
35 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
59. Exemplo...
Vamos supor contagem de numero de acessos a uma pagina, onde
precisamos dessa informac~ao precisa e facil de consultar.
Logo nos v^em a cabeca:
UPDATE page_info
SET access_count = access_count + 1
WHERE url = :url;
Para consultar, basta:
SELECT access_count
FROM page_info
WHERE url = :url;
36 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
60. Exemplo...
UPDATE page_info
SET access_count = access_count + 1
WHERE url = : url;
Alguem v^e o problema no cara acima?
37 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
61. Exemplo...
UPDATE page_info
SET access_count = access_count + 1
WHERE url = : url;
Alguem v^e o problema no cara acima?
Cada transac~ao concorrente executando esta operac~ao
62. cara
bloqueada, ou seja, apenas uma pessoa pode executar este comando
por vez (por url).
37 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
63. Soluc~ao...
1. Ao inves de atualizar, vamos inserir:
INSERT INTO page_access (url , access_count )
VALUES (: url , 1);
2. Para consultar usamos um agregador:
SELECT sum ( access_count )
FROM page_access
WHERE url = :url;
3. E claro, agora trocamos um UPDATE bloqueante por um SELECT
potencialmente lento.
Calma... Calma... Tem soluc~ao!
38 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
65. car lenta, devemos de tempos
em tempos agrupar os registros da tabela
WITH old_itens AS (
DELETE FROM page_access
RETURNING url , access_count
)
INSERT INTO page_access (url , access_count )
SELECT url , sum ( access_count )
FROM old_itens
GROUP BY url ;
Esta operac~ao e completamente n~ao bloqueante! Enquanto esta
sendo executada os INSERTs continuam e os SELECTs tambem.
39 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
67. car lenta, devemos de tempos
em tempos agrupar os registros da tabela
WITH old_itens AS (
DELETE FROM page_access
RETURNING url , access_count
)
INSERT INTO page_access (url , access_count )
SELECT url , sum ( access_count )
FROM old_itens
GROUP BY url ;
BTW, o comando WITH la em cima e conhecido como CTE
(Common Table Expressions), e e de grande utilidade. #
68. caadica
39 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
70. car lenta, devemos de tempos
em tempos agrupar os registros da tabela
WITH old_itens AS (
DELETE FROM page_access
RETURNING url , access_count
)
INSERT INTO page_access (url , access_count )
SELECT url , sum ( access_count )
FROM old_itens
GROUP BY url ;
Por
74. Performance
O PostgreSQL e, sem duvidas, um dos bancos de dados com melhores
desempenhos num unico no. Devemos sempre olhar para:
ajuste (tuning) de par^ametros de con
75. gurac~ao;
indexac~ao;
modelo de dados (normalizar ou desnormalizar);
tarefas administrativas;
estatsticas atualizadas;
... busque por PostgreSQL Performance Tuning...
41 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
76. Performance
E quando precisamos de mais:
columnar store (extens~oes para o PostgreSQL cstore fdw 1 e
In-Memory Columnar Store (ICMS) 2);
particionamento de tabelas;
divis~ao de tablespaces;
42 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
77. Performance
Escalabilidade horizontal:
replicac~ao:
replicac~ao nativa com slave disponvel para consulta (balanceamento
de carga para consultas);
replicac~ao multi-master com ferramentas externas: Bucardo e BDR (a
grande promessa para a vers~ao 9.4).
tecnicas de sharding e/ou processamento de consulta em paralelo:
divis~ao de processos em conex~oes;
sharding via aplicac~ao;
sharding via postgres fdw 3.
1http://citusdata.github.io/cstore_fdw/
2http://www.garret.ru/imcs/user_guide.html
3http:
//www.infoq.com/br/presentations/postgresql-com-newsql
43 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
78. E quando o PostgreSQL n~ao
resolve meu problema?
Primeiro, tem certeza que n~ao?
44 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
79. E quando o PostgreSQL n~ao
resolve meu problema?
Primeiro, tem certeza que n~ao?
Absoluta?
44 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
80. E quando o PostgreSQL n~ao
resolve meu problema?
Ok, acontece...
sobrecarga de operac~oes e do MVCC pode gerar gargalos;
sem processamento paralelo ou sharding nativo (apenas o faca voc^e
mesmo);
falta de funcionalidades frente a banco de dados especializados,
exemplos:
estruturas de grafos s~ao melhores tratadas em especializados como
Neo4j do que com consultas recursivas;
FTS do PostgreSQL comparado a outros como Lucene ou Sphinx ainda
perde em funcionalidades.
45 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
81. E quando o PostgreSQL n~ao
resolve meu problema?
Mas tudo bem usar outro. Se quiser associar, varios Foreign Data
Wrappers (FDW) est~ao disponveis (redis fdw, mongo fdw,
...) para mapear dados externos dentro de tabelas no PostgreSQL;
46 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
82. E quando o PostgreSQL n~ao
resolve meu problema?
DICA DE OURO: comece sempre no PostgreSQL (tiro certo), se o
projeto crescer fora de escala que o PG suporte, busque outras
alternativas. E
muito comum utilizar bancos NoSQL junto com
bancos relacionais (n~ao e escolha unica). Existem muitos bancos
MPP (Massive Parallel Processing ) e (100%) NewSQL baseados
no PostgreSQL.
comerciais: Greenplun, Amazon Redshift, Aster Data, Netezza,
Vertica, entre outros;
e as promessas open source: Postgres-XC e Postgres-XL.
47 / 48
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014