postgresql, porque você não precisa de nosql
TRANSCRIPT
PostgreSQL e porque voce nao precisa de NoSQL
Matheus de Oliveira<[email protected]>
Matheus de Oliveira<[email protected]>
DBA PostgreSQL – consultorias e suportes24x7/8x5
Instrutor dos treinamentos PostgreSQL
Concepcao, desenvolvimento e suporte aproducao
Matheus de Oliveira<[email protected]>
Mais de 15 anos trabalhando de suporte econsultoria PostgreSQL
http://www.dextra.com.br/“Crafting Software, Transforming Business”
Instrutor dos treinamentos PostgreSQL
Concepcao, desenvolvimento e suporte aproducao
Matheus de Oliveira<[email protected]>
Mais de 15 anos trabalhando de suporte econsultoria PostgreSQL
http://www.dextra.com.br/“Crafting Software, Transforming Business”
10 anos e mais de 10 mil profissionaiscapacitados em todo o Brasil.
http://www.dextraining.com.br/“Aprenda com quem faz na pratica”
Concepcao, desenvolvimento e suporte aproducao
Matheus de Oliveira<[email protected]>
Mais de 15 anos trabalhando de suporte econsultoria PostgreSQL
http://www.dextra.com.br/“Crafting Software, Transforming Business”
10 anos e mais de 10 mil profissionaiscapacitados em todo o Brasil.
http://www.dextraining.com.br/“Aprenda com quem faz na pratica”
SaaS para analise e monitoramento PostgreSQLhttp://www.pganalytics.com.br/
“Facilitando a vida do DBA”
Para pensar...
A melhor solucao para o seu problema agora
VS
A melhor solucao de todas, a todo custo
3 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Para pensar...
A melhor solucao para o seu problema agora
VS
A melhor solucao de todas, a todo custo
3 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Para pensar...
Cuidado com o que voce pensa ser “moderno”.Armazenamentos chave/valor e documentos datam de antes das
teorias de bancos relacionais.
4 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Bancos de dados relacionais e NoSQLsBancos relacionais:• Baseados no modelo relacional
• Transacoes ACID◦ Atomicidade◦ Consistencia◦ Isolamento◦ Durabilidade
• Interface de consulta padrao –SQL
• Armazenamento em relacoes –estrutura acoplada
• ...
Bancos NoSQL:
• Transacoes BASE:◦ Basic Availability◦ Soft-state◦ Eventual consistency
• Interface de consulta propria
• Schemaless:◦ Chave-Valor◦ Documento◦ Grafos◦ ...
• Performance como prioridade◦ In-place update◦ Operacoes assıncronas◦ ...
5 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
PostgreSQL“one database to rule them all”
• FOSS – Free OpenSource Software
• Quase 30 anos deexperiencia
• Robustez, confiabilidade,maturidade
• Diversas funcionalidades,e novas a cada versao
• Forte extensibilidade
6 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Voce nao precisa de NoSQLpara:
chave/valor
hstore – Armazenamento chave/valor
• Presente como uma contrib do PostgreSQL desde a versao 8.3(2008)
• Armazenamento de chaves/valores como atributo (coluna) de umatabela
• Diversos operadores para manipulacao, navegacao e filtragem(busca)
• Indexacao B-tree, GIN e GIST
• Exemplo:
SELECT * FROM moviesWHERE ( moviedata ->’ imdb_rate ’):: int > 4AND moviedata ->’ alternate_title ’ = ’Black
Mask ’;
8 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
hstore – Armazenamento chave/valor
Limitacoes:
• Aceita apenas texto, tanto para chave quanto para valor
• Nao aceita valores aninhados (hstore de hstore)
Alternativas NoSQL:
• Redis
• Riak
• MemcacheDB
• Berkeley DB
• Dynamo
• ...
9 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Voce nao precisa de NoSQLpara:
documentos JSON
JSON
• 2012 – versao 9.2 – tipo json, basicamente text com validacoes
• 2013 – versao 9.3 – ainda json, mas com funcoes fantasticas (agrande adocao comeca)
• 2014 – versao 9.4 (lancamento ainda este mes) – tipo jsonb,binario (estrutura interna baseada no hstore), indexacao GIN –ultra-blaster-rapido
11 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
JSON
CREATE TABLE booksdata (title text PRIMARY KEY ,booksdata jsonb
);
12 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
JSON
SELECT title ,bookdata ->> ’ current_edition ’ AS edition ,bookdata #> ’{" publication_info ", 0, " isbn "} ’
AS isbnFROM booksdataWHERE bookdata @> ’{ " publication_info " : [{"
publisher ": " Avon "} ] }’:: jsonbORDER BY bookdata #> ’{" publication_info ", 0, "
price "} ’ DESC ;
13 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
JSON
Ah!!! E eu comentei que e indexado?
DE VERDADE
CREATE INDEX booksdata_json_idx ON booksdataUSING GIN ( booksdata );
GIN to the rescue!!!
14 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
JSON
Ah!!! E eu comentei que e indexado?
DE VERDADE
CREATE INDEX booksdata_json_idx ON booksdataUSING GIN ( booksdata );
GIN to the rescue!!!
14 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
JSON
Ah!!! E eu comentei que e indexado?
DE VERDADE
CREATE INDEX booksdata_json_idx ON booksdataUSING GIN ( booksdata );
GIN to the rescue!!!
14 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
JSON
Limitacoes:
• O tipo json e armazenado em texto e possui fraca indexacao,mas sua evolucao, o tipo jsonb e armazenado em binario
• Diferente do json, o jsonb possui as limitacoes:◦ nao armazena a ordem original das chaves (elas sempre serao
mostradas em ordem lexicografica)◦ nao aceita chaves repetidas◦ (basicamente json armazena exatamente como voce passa, mas
jsonb faz um processamento extra)
Eu diria que hoje, o PostgreSQL possui o mais avancado mecanismode indexacao para JSON (jsonb) dos bancos de dados open
sources (de todos? provavelmente)
15 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
JSON
Alguns NoSQLs orientado a documentos:
• MongoDB
• CouchDB
• Cassandra
• SimpleDB
• ...
16 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Voce nao precisa de NoSQLpara:
Full Text Search
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 articlesWHERE title % ’ NewSQL ’ORDER BY sml DESC LIMIT 10;
• Claro, tudo devidamente indexado... GIN and GIST rocks
18 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
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 articlesWHERE title % ’ NewSQL ’ORDER BY sml DESC LIMIT 10;
• Claro, tudo devidamente indexado... GIN and GIST rocks
18 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Full Text Search
Limitacoes:
• Nao processa documentos como PDF, DOC, etc.
• Ate a versao 9.4 performance mais baixa para algumas operacoes(como ordenacao por maior similaridade) – GIN evoluiu na versao9.4
Alguns NoSQLs com FTS:
• Solr
• Lucene
• Elastic Search
• Sphinx
• e tambem MySQL
19 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Voce nao precisa de NoSQLpara:
grafos ehierarquias
Consultas em grafos e hierarquias
• Pode ser facilmente realizada utilizando consultas recursivas• O desempenho depende do filtro e profundidade da navegacao• 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 pathFROM pg_authid rWHERE r. oid NOT IN (
SELECT m. member FROM pg_auth_members m)UNION ALLSELECT r.oid , r. rolname ,
p. level + 1, p. path || r. rolnameFROM pg_auth_members mINNER JOIN pg_authid r ON m. member = r. oidINNER JOIN roles p ON m. roleid = p. roleid
)SELECT repeat (’|__ ’, level -1) || rolnameFROM rolesORDER BY path ;
21 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Consultas em grafos e hierarquias
Resultado:
administrativo| __comercial|__| __carla|__| __maria| __financeiro|__| __ana|__| __pauloti| __beatriz| __julio| __matheus
...
22 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Consultas em grafos e hierarquias
Limitacoes:
• Um pouco complexo, mas voce acostuma
• Performance dependente principalmente da altura
• Nao muito bem preparado para busca em espacos de buscasgrandes ou estruturas de grafos complexas
Bancos NoSQL orientados a grafos:
• Neo4j
• OrientDB
• ...
23 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Voce nao precisa de NoSQLpara:
operacoesassıncronas
Operacoes assıncronas
• Quando nao precisamos garantir durabilidade em tempo real:◦ Desabilite o parametro synchronous commit:
SET synchronous_commit TO off ;
• Para dados transientes:◦ UNLOGGED TABLES
• Quando precisamos de operacoes nao bloqueantes:◦ PQsendQuery, PQsendPrepare, PQconsumeInput,
PQisBusy, ...• Processamento de mensagens:
◦ Sincronia pode ser atingida com auxılio de advisory locks◦ Troca de mensagens (ativacao, pull/push, sender/receiver, etc.) com
LISTEN/NOTIFY
25 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Exemplo de fila
Ideia:
• Processos a executar sao guardados numa tabela:
CREATE TABLE queue (id serial , processed booleandefault false , ... , job jsonb );
• Para inserir um job para execucao:
BEGIN ;INSERT INTO queue ( job )VALUES (’{" jobName ": " foo ", ...} ’);NOTIFY jobexecutor ;COMMIT ; /* NOTIFY dispara somente depois */
• job executors ficam aguardando processos a executar:
LISTEN jobexecutor ;
e buscam trabalhos da fila...26 / 48
PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Exemplo de fila – job executor
1 UPDATE queue2 SET processed = true3 WHERE NOT processed AND id IN (4 SELECT id FROM (5 SELECT id FROM queue6 WHERE NOT processed7 ORDER BY id8 LIMIT 1009 ) t
10 WHERE11 pg_try_advisory_xact_lock (12 tableoid :: int , id)13 ORDER BY id14 LIMIT 115 )16 RETURNING job ;
27 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Exemplo de fila – job executor
1 UPDATE queue2 SET processed = true3 WHERE NOT processed AND id IN (4 SELECT id FROM (
5 SELECT id FROM queue6 WHERE NOT processed7 ORDER BY id8 LIMIT 100
9 ) t10 WHERE11 pg_try_advisory_xact_lock (12 tableoid :: int , id)13 ORDER BY id14 LIMIT 1
15 )16 RETURNING job ;28 / 48
PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Exemplo de fila – job executor
1 UPDATE queue2 SET processed = true3 WHERE NOT processed AND id IN (4 SELECT id FROM (
5 SELECT id FROM queue6 WHERE NOT processed7 ORDER BY id8 LIMIT 100
9 ) t10 WHERE11 pg_try_advisory_xact_lock (12 tableoid :: int , id)13 ORDER BY id14 LIMIT 1
15 )16 RETURNING job ;29 / 48
PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Exemplo de fila – job executor
1 UPDATE queue2 SET processed = true3 WHERE NOT processed AND id IN (4 SELECT id FROM (
5 SELECT id FROM queue6 WHERE NOT processed7 ORDER BY id8 LIMIT 100
9 ) t10 WHERE11 pg_try_advisory_xact_lock (12 tableoid :: int , id)13 ORDER BY id14 LIMIT 1
15 )16 RETURNING job ;30 / 48
PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Fila
Limitacoes:
• Uso de funcoes nao especıficas de SQL
• Um pouco complicadinho, nao acham?
Outras opcoes (nao so NoSQL):
• pgq – fila alta performance em PostgreSQL
• RabbitMQ
• ActiveMQ
• MongoDB (tailable cursors)
• ...
31 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Voce nao precisa de NoSQLpara:
atualizacoesrapidas
Usando ACID em alta concorrencia
• PostgreSQL e 100% ACID compilante
• Isso nos traz um poderoso controle de transacoes
• Mas... Para ter transacao, precisamos de bloqueios, maisconhecido como locks
33 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Usando ACID em alta concorrencia
• No PostgreSQL locks sao podem ser:
◦ de varios modos – compartilhados, exclusivo, acesso exclusivo, etc.◦ definidos pelo usuario – advisory locks◦ em varios nıveis – tuplas, paginas, tabelas, etc.
• Sao essenciais (acredite, nao vai querer abrir mao disto)
• Mas... Muitas vezes precisamos ter um certo trabalho para reduziro numero ou tempo de bloqueios
34 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Usando ACID em alta concorrencia
Regra no PostgreSQL: escritores nunca bloqueiam leitores e leitoresnunca bloqueiam escritores nem outros leitores (mas escritores
bloqueiam escritores)
35 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Exemplo...
• Vamos supor contagem de numero de acessos a uma pagina, ondeprecisamos dessa informacao precisa e facil de consultar.
• Logo nos vem a cabeca:
UPDATE page_infoSET access_count = access_count + 1WHERE url = : url ;
• Para consultar, basta:
SELECT access_countFROM page_infoWHERE url = : url ;
36 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Exemplo...
UPDATE page_infoSET access_count = access_count + 1WHERE url = : url ;
Alguem ve o problema no cara acima?
Cada transacao concorrente executando esta operacao ficarabloqueada, ou seja, apenas uma pessoa pode executar este comando
por vez (por url).
37 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Exemplo...
UPDATE page_infoSET access_count = access_count + 1WHERE url = : url ;
Alguem ve o problema no cara acima?
Cada transacao concorrente executando esta operacao ficarabloqueada, ou seja, apenas uma pessoa pode executar este comando
por vez (por url).
37 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Solucao...
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_accessWHERE url = : url ;
3. E claro, agora trocamos um UPDATE bloqueante por um SELECTpotencialmente lento.Calma... Calma... Tem solucao!
38 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Solucao...
Para resolver o problema da consulta ficar lenta, devemos de temposem tempos agrupar os registros da tabela
WITH old_itens AS (DELETE FROM page_accessRETURNING url , access_count
)INSERT INTO page_access (url , access_count )SELECT url , sum ( access_count )FROM old_itensGROUP BY url ;
Esta operacao e completamente nao bloqueante! Enquanto estasendo executada os INSERTs continuam e os SELECTs tambem.
39 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Solucao...
Para resolver o problema da consulta ficar lenta, devemos de temposem tempos agrupar os registros da tabela
WITH old_itens AS (DELETE FROM page_accessRETURNING url , access_count
)INSERT INTO page_access (url , access_count )SELECT url , sum ( access_count )FROM old_itensGROUP BY url ;
BTW, o comando WITH la em cima e conhecido como CTE(Common Table Expressions), e e de grande utilidade. #ficaadica
39 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Solucao...
Para resolver o problema da consulta ficar lenta, devemos de temposem tempos agrupar os registros da tabela
WITH old_itens AS (DELETE FROM page_accessRETURNING url , access_count
)INSERT INTO page_access (url , access_count )SELECT url , sum ( access_count )FROM old_itensGROUP BY url ;
Por fim, adicione um ındice em url e seja feliz: #ficaadica2CREATE INDEX ON page access count (url);
39 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
...
Performance
O PostgreSQL e, sem duvidas, um dos bancos de dados com melhoresdesempenhos num unico no. Devemos sempre olhar para:
• ajuste (tuning) de parametros de configuracao;
• indexacao;
• modelo de dados (normalizar ou desnormalizar);
• tarefas administrativas;
• estatısticas atualizadas;
• ... busque por ”PostgreSQL Performance Tuning”...
41 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Performance
E quando precisamos de mais:
• columnar store (extensoes para o PostgreSQL cstore fdw 1 eIn-Memory Columnar Store (ICMS) 2);
• particionamento de tabelas;
• divisao de tablespaces;
42 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Performance
Escalabilidade horizontal:
• replicacao:◦ replicacao nativa com slave disponıvel para consulta (balanceamento
de carga para consultas);◦ replicacao multi-master com ferramentas externas: Bucardo e BDR (a
grande promessa para a versao 9.4).
• tecnicas de sharding e/ou processamento de consulta em paralelo:◦ divisao de processos em conexoes;◦ sharding via aplicacao;◦ sharding via postgres fdw 3.
1http://citusdata.github.io/cstore_fdw/2http://www.garret.ru/imcs/user_guide.html3http:
//www.infoq.com/br/presentations/postgresql-com-newsql
43 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
E quando o PostgreSQL naoresolve meu problema?
• Primeiro, tem certeza que nao?
• Absoluta?
44 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
E quando o PostgreSQL naoresolve meu problema?
• Primeiro, tem certeza que nao?
• Absoluta?
44 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
E quando o PostgreSQL naoresolve meu problema?
• Ok, acontece...
◦ sobrecarga de operacoes e do MVCC pode gerar gargalos;◦ sem processamento paralelo ou sharding nativo (apenas o “faca voce
mesmo”);◦ falta de funcionalidades frente a banco de dados especializados,
exemplos:
• estruturas de grafos sao melhores tratadas em especializados comoNeo4j do que com consultas recursivas;
• FTS do PostgreSQL comparado a outros como Lucene ou Sphinx aindaperde em funcionalidades.
45 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
E quando o PostgreSQL naoresolve meu problema?
• Mas tudo bem usar outro. Se quiser associar, varios Foreign DataWrappers (FDW) estao disponıveis (redis fdw, mongo fdw,...) para mapear dados externos dentro de tabelas no PostgreSQL;
46 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
E quando o PostgreSQL naoresolve meu problema?
• DICA DE OURO: comece sempre no PostgreSQL (tiro certo), se oprojeto crescer fora de escala que o PG suporte, busque outrasalternativas. E muito comum utilizar bancos NoSQL junto combancos relacionais (nao e escolha unica). Existem muitos bancosMPP (Massive Parallel Processing) e (100%) NewSQL baseadosno PostgreSQL.
◦ comerciais: Greenplun, Amazon Redshift, Aster Data, Netezza,Vertica, entre outros;
◦ e as promessas open source: Postgres-XC e Postgres-XL.
47 / 48PostgreSQL e porque voce nao precisa de NoSQL – Matheus de Oliveira – QCon RJ 2014
Obrigado!
Duvidas?
Matheus de Oliveira<[email protected]>
IRC – irc.freenode.net:/join #postgresql,#postgresql-br,#dextra
Meu nick: MatheusOl
Twitter: @matioli matheusLinkedIn: br.linkedin.com/in/matheusdeoliveira/
SlideShare: slideshare.net/matheus de oliveira