O documento discute o PostgreSQL como uma opção NewSQL. Ele apresenta o palestrante Matheus de Oliveira e sua experiência com bancos de dados. Em seguida, discute as características dos bancos de dados relacionais e NoSQL, definindo o que é NewSQL. O documento então descreve como o PostgreSQL oferece funcionalidades como armazenamento JSON, buscas de texto completo e consultas em grafos, além de alto desempenho e escalabilidade horizontal através da replicação.
2. Roteiro
Quem sou eu
Bancos de dados relacionais e os NoSQLs
O que ´e NewSQL?
PostgreSQL - “one database to rule them all”
Schemaless - JSON e chave/valor
Buscas por similaridade
Consultas em grafos e hierarquias
Performance e Escalabilidade
E quando o PostgreSQL n˜ao resolve meu problema?
Conclus˜ao
2 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
3. Quem sou eu?
Matheus de Oliveira • Ciˆencias de Computa¸c˜ao – USP
• DBA PostgreSQL na Dextra e instrutor na
Dextraining a mais de 2 anos
• Apaixonado pelo PG (do psql ao c´odigo-fonte...)
3 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
4. Quem sou eu?
Matheus de Oliveira • Ciˆencias de Computa¸c˜ao – USP
• DBA PostgreSQL na Dextra e instrutor na
Dextraining a mais de 2 anos
• Apaixonado pelo PG (do psql ao c´odigo-fonte...)
• ...mas tamb´em conhece alguns NoSQLs
3 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
5. Quem sou eu?
Matheus de Oliveira • Ciˆencias de Computa¸c˜ao – USP
• DBA PostgreSQL na Dextra e instrutor na
Dextraining a mais de 2 anos
• Apaixonado pelo PG (do psql ao c´odigo-fonte...)
• ...mas tamb´em conhece alguns NoSQLs
Dextra • Desenvolvimento sob-medida, consultoria/suporte
• Mais de 15 anos trabalhando com o PostgreSQL
• “Crafting Software, Transforming Business”
• http://www.dextra.com.br/
3 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
6. Quem sou eu?
Matheus de Oliveira • Ciˆencias de Computa¸c˜ao – USP
• DBA PostgreSQL na Dextra e instrutor na
Dextraining a mais de 2 anos
• Apaixonado pelo PG (do psql ao c´odigo-fonte...)
• ...mas tamb´em conhece alguns NoSQLs
Dextra • Desenvolvimento sob-medida, consultoria/suporte
• Mais de 15 anos trabalhando com o PostgreSQL
• “Crafting Software, Transforming Business”
• http://www.dextra.com.br/
Dextraining • Treinamento de verdade, “Aprenda com quem faz na
pr´atica”
• Mais de 10 anos na estrada
• Mais de 10 mil profissionais capacitados em todo o
Brasil.
• http://www.dextraining.com.br/
3 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
7. Bancos de dados relacionais / SQLs
• Baseados no modelo relacional
• Transa¸c˜oes ACID
◦ Atomicidade
◦ Consistˆencia
◦ Isolamento
◦ Durabilidade
• Interface de consulta padr˜ao – SQL
• Armazenamento em rela¸c˜oes – estrutura acoplada
• ...
4 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
10. O que ´e NewSQL
“ In the context of transaction processing, I would define a NewSQL
DBMS as one having the following 5 characteristics:
1. SQL as the primary mechanism for application interaction
2. ACID support for transactions
3. A non-locking concurrency control mechanism so real-time reads
will not conflict with writes, and thereby cause them to stall.
4. An architecture providing much higher per-node performance than
available from the traditional ‘elephants’
5. A scale-out, shared-nothing architecture, capable of running on a
large number of nodes without bottlenecking
”
Michael Stonebraker – MIT 1
1
http://cacm.acm.org/blogs/blog-cacm/
109710-new-sql-an-alternative-to-nosql-and-old-sql-for-new-oltp
fulltext6 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
11. O que ´e NewSQL
“A DBMS that delivers the scalability and flexibility promised by
NoSQL while retaining the support for SQL queries and/or ACID, or
to improve performance for appropriate workloads”
451 Group
7 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
12. PostgreSQL
“one database to rule them all”
• FOSS – Free Open
Source Software
• Quase 30 anos de
experiˆencia
• Robustez, confiabilidade,
maturidade
• Diversas funcionalidades,
e novas a cada vers˜ao
• Forte extensibilidade
8 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
13. Armazenamento chave/valor
Tipo hstore
• 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 manipula¸c˜ao, navega¸c˜ao e filtragem
(busca)
• Indexa¸c˜ao B-tree, GIN e GIST
• Exemplo:
SELECT * FROM movies
WHERE ( moviedata ->’imdb_rate ’):: int > 4
AND moviedata ->’ alternate_title ’ = ’Black
Mask ’;
9 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
14. Armazenamento chave/valor
Tipo hstore
• 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 manipula¸c˜ao, navega¸c˜ao e filtragem
(busca)
• Indexa¸c˜ao B-tree, GIN e GIST
• Exemplo:
SELECT * FROM movies
WHERE ( moviedata ->’imdb_rate ’):: int > 4
AND moviedata ->’ alternate_title ’ = ’Black
Mask ’;
R´apido... Flex´ıvel... Incr´ıvel... Lind˜ao...
9 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
15. Armazenamento chave/valor
Tipo hstore
• 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 manipula¸c˜ao, navega¸c˜ao e filtragem
(busca)
• Indexa¸c˜ao B-tree, GIN e GIST
• Exemplo:
SELECT * FROM movies
WHERE ( moviedata ->’imdb_rate ’):: int > 4
AND moviedata ->’ alternate_title ’ = ’Black
Mask ’;
R´apido... Flex´ıvel... Incr´ıvel... Lind˜ao...
mas, t´ınhamos que evoluir...
9 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
16. JSON no PostgreSQL
• 2012 – vers˜ao 9.2 – tipo json, basicamente text com valida¸c˜oes
• 2013 – vers˜ao 9.3 – ainda json, mas com fun¸c˜oes fant´asticas (a
grande ado¸c˜ao come¸ca)
• 2014 – vers˜ao 9.4 (hoje em beta1) – tipo jsonb, bin´ario
(estrutura interna baseada no hstore), indexa¸c˜ao GIN –
ultra-blaster-r´apido
10 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
17. JSON no PostgreSQL
CREATE TABLE booksdata (
title text PRIMARY KEY ,
booksdata jsonb
);
11 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
18. JSON no PostgreSQL
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 ;
12 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
19. JSON no PostgreSQL
Ah!!! E eu comentei que ´e indexado?
13 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
20. JSON no PostgreSQL
Ah!!! E eu comentei que ´e indexado?
DE VERDADE
CREATE INDEX booksdata_json_idx ON booksdata
USING GIN ( booksdata );
13 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
21. JSON no PostgreSQL
Ah!!! E eu comentei que ´e indexado?
DE VERDADE
CREATE INDEX booksdata_json_idx ON booksdata
USING GIN ( booksdata );
GIN to the rescue!!!
13 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
22. 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;
14 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
23. 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
14 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
24. Consultas em grafos e hierarquias
• Pode ser facilmente realizada utilizando consultas recursivas
• O desempenho depende do filtro e profundidade da navega¸c˜ao
• Exemplo, cat´alogo de roles (usu´arios/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 ;
15 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
25. Consultas em grafos e hierarquias
Resultado:
administrativo
| __comercial
|__| __carla
|__| __maria
| __financeiro
|__| __ana
|__| __paulo
ti
| __beatriz
| __julio
| __matheus
...
16 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
26. Performance
O PostgreSQL ´e, sem d´uvidas, um dos bancos de dados com melhores
desempenhos num ´unico n´o. Devemos sempre olhar para:
• ajuste (tuning) de parˆametros de configura¸c˜ao;
• indexa¸c˜ao;
• modelo de dados (normalizar ou desnormalizar);
• tarefas administrativas;
• estat´ısticas atualizadas;
• ... busque por ”PostgreSQL Performance Tuning”...
17 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
27. Performance
E quando precisamos de mais:
• COMMIT ass´ıncrono;
• columnar store (extens˜oes para o PostgreSQL cstore fdw 2 e
In-Memory Columnar Store (ICMS) 3 4);
• particionamento de tabelas (n˜ao ´e 100% suportado, mas funciona
perfeitamente);
• divis˜ao de tablespaces.
2
http://citusdata.github.io/cstore_fdw/
3
http://www.garret.ru/imcs/user_guide.html
4
http://www.pgcon.org/2014/schedule/events/643.en.html
18 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
28. Escalabilidade Horizontal
Replica¸c˜ao master-slave via Streaming Replication oferece grandes
oportunidades.
• replica¸c˜ao s´ıncrona ou ass´ıncrona;
• replica¸c˜ao em cascata;
• execu¸c˜ao de backups no slave podem aliviar o master (24x7);
• distribui¸c˜ao de consultas mais pesadas (relat´orios, an´alises, etc.)
nos slaves;
• balanceamento de carga via aplica¸c˜ao ou automatizada usando
pgPool-II;
• e claro, alta disponibilidade.
19 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
29. Escalabilidade Horizontal
Vamos falar de sharding ent˜ao!
O PostgreSQL n˜ao oferece suporte `a sharding, mas muita gente
encontra uma maneira.
• Via aplica¸c˜ao:
◦ Instangram 5
◦ Braintree 6
5
http://instagram-engineering.tumblr.com/post/
10853187575/sharding-ids-at-instagram
6
https://www.braintreepayments.com/braintrust/
scaling-postgresql-at-braintree-four-years-of-evolution
20 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
30. Escalabilidade Horizontal
Vamos falar de sharding ent˜ao!
• Uma t´ecnica para sharding automatizado consiste em utilizar
diversas funcionalidades e o poder de extens˜ao do PostgreSQL:
◦ dividir os shards manualmente em servidores com PostgreSQL e
tabelas convencionais;
◦ mapear todas essas tabelas num servidor centralizado usando Foreign
Data Wrappers (FDW) com o postgres fdw;
◦ criar views para unir cada uma delas (usando UNION ALL);
• o PostgreSQL automaticamente redirecionar´a consultas (usando as
chaves de shard) para cada shard, usando a (velha) funcionalidade de
“constraint exclusion”;
• INSERT/UPDATE/DELETE deve ser redirecionando usando triggers
pr´oprias do tipo INSTEAD OF.
◦ mover dados entre os shards ´e poss´ıvel, mas trabalhoso.
21 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
31. Escalabilidade Horizontal
Vamos falar de sharding ent˜ao!
Exemplo (“ugly, but works...”):
CREATE FOREIGN TABLE users_1_1000
( user_id int , user_name text , ... )
SERVER shard1 OPTIONS ( table_name ’users ’)
;
...
CREATE FOREIGN TABLE users_1001_2000
( user_id int , user_name text , ... )
SERVER shard2 OPTIONS ( table_name ’users ’)
;
...
22 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
32. Escalabilidade Horizontal
Vamos falar de sharding ent˜ao!
CREATE VIEW users AS
SELECT * FROM users_1_1000
WHERE user_id BETWEEN 1 AND 1000
UNION ALL
SELECT * FROM users_1001_2000
WHERE user_id BETWEEN 1001 AND 2000
UNION ALL
...
H´a varia¸c˜oes dessa tecnica 7 8
7
https://www.youtube.com/watch?v=3JQrfgb3Av0
8
http://snowman.net/slides/pgfdw_sharding.pdf
23 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
33. E quando o PostgreSQL n˜ao
resolve meu problema?
• Primeiro, tem certeza que n˜ao?
24 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
34. E quando o PostgreSQL n˜ao
resolve meu problema?
• Primeiro, tem certeza que n˜ao?
• Absoluta?
24 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
35. E quando o PostgreSQL n˜ao
resolve meu problema?
• Ok, acontece...
◦ sobrecarga de opera¸c˜oes e do MVCC pode gerar problemas;
◦ 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 (estas tendem a ficar lentas
quando a profundidade ´e grande);
• FTS do PostgreSQL comparado `a outros como Lucene ou Sphinx ainda
perde em funcionalidades e performance (em termos de performance,
aguarde/teste a nova vers˜ao, 9.4, houve melhoras substanciais nessa
´area).
25 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
36. E quando o PostgreSQL n˜ao
resolve meu problema?
• Mas tudo bem usar outro. Se quiser associar, v´arios Foreign Data
Wrappers (FDW) est˜ao dispon´ıveis (redis fdw, mongo fdw,
...) para mapear dados externos dentro de tabelas no PostgreSQL
(o exemplo do shard usa essa funcionalidade, mas mapeando
outros bancos PostgreSQL);
26 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
37. 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.
27 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014
38. Conclus˜ao
O PostgreSQL ´e hoje, sem d´uvidas, um dos bancos de dados mais
vers´ateis (eu diria “o mais”) e que oferece infinitas possibilidades.
Associando o bom e velho modelo relacional `a tendˆencias (n˜ao novas,
devo dizer) e necessidades presentes nas aplica¸c˜oes modernas.
28 / 31
PostgreSQL como NewSQL – Matheus de Oliveira – DevCamp2014