SlideShare uma empresa Scribd logo
1 de 34
Baixar para ler offline
Análise de bancos de dados
analíticos open source
6 de Outubro de 2016
Matheus Espanhol
Agenda
● Cenário Movile
● Técnicas para otimização de bancos de dados analíticos
● Paralelismo do PostgreSQL 9.6
● Citusdb e Postgres-XL
● Arquitetura do Citusdb
● Citusdb na Movile
● Conclusões e expectativas
A Movile
● A Movile é player global no Mercado de conteúdo e comércio via smartphones
● Deixamos a vida das pessoas melhor por meio dos nossos aplicativos
● Buscamos incansavelmente fazer as coisas melhor, mais rápidas e mais baratas
○ 50 milhões de pessoas utilizam os serviços da Movile todo mês
○ Estamos conectados a mais de 70 operadoras em toda América
○ Crescimento anual médio de 80%, nos últimos 7 anos e espera crescer 50% ao ano, até 2020
Messaging Payments
Cenário - Data Intelligence
● Cenário enfrentado:
○ Típico 1 sistema, 1 tabela = ~200GB/mês
○ Sistema orientado a eventos gerando 140MM/dia de registros proveniente de Smartphones
○ Controle de SMS de plataformas gerando 200MM/dia de registros
○ Tratando histórico de mais de 400MM de clientes que passaram por nossas plataformas
○ Tamanho de registros variando de 2Kb a 8Kb
○ Integrador de dados de todas as plataformas Movile e das empresas do grupo
● Banco de dados na nuvem
○ Apenas últimos 3 meses
○ Muitos usuários concorrentes
○ Unidades de negócio, níveis de uso e níveis de criticidade distintas
Cenário - Data Intelligence
● Necessidade de realocação de espaço constante
● Custos elevados para aumento de storage na nuvem
● Máquinas locais de histórico não comportam mais que 2 anos de dados
● Índices ocupam bastante espaço
○ Consultas nem sempre utilizam campos indexados
● Falta de espaço em disco para
restaurar dados históricos
● Gargalo de I/O
● CPU subutilizado
➢ Compressão de dados
➢ Armazenamento por coluna
➢ Bancos de dados de processamento
paralelo (MPP)
Cenário - Data Intelligence
Alternativas
Open source
Citusdb
(pg_shard + cstore_fdw)
Postgres-XL
Appliance
NetezzaGreenplum
Teradata
Cloud
Google BigQuery
Amazon Redshift
Processamento Paralelo
● Múltiplos CPUs em uma única máquina
○ Conjuntos de dados distintos
○ Possível gargalo de memória e disco
○ PostgreSQL 9.6
● MPP (Massive Parallel Processing)
○ Cluster de banco de dados
○ Dados distribuídos entre os nós do cluster
○ Cluster shared nothing
■ Cada nó possui os próprios recursos de memória e disco
Processamento Paralelo - PostgreSQL 9.6
COPY mte_201607 FROM PROGRAM 'zcat /data/csv/mte/2016/07/mte_*_part_00.gz'
CSV DELIMITER '|';
● Quantidade de registros: 184 milhões
● Quantidade de colunas: 53
● Tamanho da tabela: 176 GB
● Tempo de carga: 10 horas 12min
SET max_parallel_workers_per_gather TO 6;
SELECT inserted_time,sms_text FROM mte_201607
WHERE uuid = '3CA81380-B06D-11E5-8C95-7610042D67C6';
Time: 433053.770 ms = 7min
Armazenamento colunar
● Análise de dados geralmente é aplicada a algumas colunas
● Redução do tamanho das leituras em disco
● Menor uso de buffer cache
● Self-indexing
○ Redução do uso de espaço em disco com índices
● Maior vantagem para compressão de dados
Compressão de dados
● Maior capacidade de armazenamento
● Redução do tamanho das leituras em disco
● Agregações em dados compactados
● Impacto no processamento
○ Bancos de dados analíticos geralmente possuem gargalo de disco
○ Poucos usuários
○ Baixa concorrência
Postgres-XL
Prós
● Tempo de resposta de consultas
● Modo de replicação e distribuição
Contras
● ACID (GTM)
● Alta disponibilidade
● Escalabilidade
● Instalação complexa
Citusdb
Prós
● Extensão do PostgreSQL
● MPP
● Colunar
● Compressão de dados
● Sharding e replicação lógica
Contras
● Comunidade de usuários
○ Código aberto recentemente
Citusdb - Arquitetura
Citusdb - Arquitetura
Citusdb - Performance
● Real-time executor
○ Consulta roda com o máximo de recursos
○ 1 conexão por shard
○ Ex: consulta simples sem JOINs entre shards ou com poucos shards
● Task Tracker executor
○ Ideal para consultas grandes e complexas
○ 1 conexão por worker
○ Maior controle do paralelismo
○ Ex: consulta complexa que cruza dados entre os shards e com muitos shards
Citusdb - Métodos de distribuição
● Hash
○ Ideal para INSERTs em tempo real
○ Dados não ordenados e que sofrem alterações
○ Mais eficiente para consultas com operações de igualdade
● Append
○ Ideal para dados históricos inseridos através de rotinas de ETL
○ Ordenados por tempo e não sofrem alterações
○ Mais eficiente para consultas com filtro por intervalo de tempo
Instalação - 1 master e 2 workers
yum install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-6-x86_64/pgdg-centos95-9.5-2.noarch.rpm
yum install citus_95
service postgresql-9.5 initdb
echo "shared_preload_libraries = 'citus'" >> /citusdb/master/postgresql.conf
initdb -D /data/citusdb/worker1
sed -i 's/#port = 5432/port = 5433/g' /data/citusdb/worker1/postgresql.conf
echo "shared_preload_libraries = 'citus'" >> /data/citusdb/worker1/postgresql.conf
initdb -D /data/citusdb/worker2
sed -i 's/#port = 5432/port = 5434/g' /data/citusdb/worker2/postgresql.conf
echo "shared_preload_libraries = 'citus'" >> /data/citusdb/worker2/postgresql.conf
echo "localhost 5433
localhost 5434" > /citusdb/master/pg_worker_list.conf
pg_ctl -D /citusdb/master start
pg_ctl -D /data/citusdb/worker1 start
pg_ctl -D /data/citusdb/worker2 start
Instalação - 1 master e 2 workers
for port in $(seq 5432 5434)
do
createdb -p $port atlas
psql atlas -p $port -c "CREATE EXTENSION citus"
done
psql atlas -c "SELECT * FROM master_get_active_worker_nodes();"
node_name | node_port
-----------+-----------
localhost | 5433
localhost | 5434
Carga de dados
CREATE TABLE IF NOT EXISTS mte_201607 (
id bigint NOT NULL,
inserted_time timestamp NOT NULL,
phone bigint NOT NULL,
sms_text text,
….
);
SET citus.shard_replication_factor TO 1;
SET citus.shard_max_size TO '1GB';
SELECT master_create_distributed_table('mte_201607', 'inserted_time', 'append');
COPY mte_201607 FROM PROGRAM 'zcat /data/csv/mte/2016/07/mte_*_part_00.gz' CSV DELIMITER '|';
Metadados
SELECT logicalrelid::regclass,
CASE partmethod WHEN 'a' THEN 'APPEND' ELSE 'HASH' END AS partmethod
FROM pg_dist_partition;
logicalrelid | partmethod
---------------------+------------
mte_201601 | APPEND
mte_201602 | APPEND
mte_201603 | APPEND
mte_201604 | APPEND
mte_201605 | APPEND
mte_201606 | APPEND
mte_201607 | APPEND
mte_201608 | APPEND
mte_201609 | APPEND
mte_201610 | APPEND
Metadados
SELECT
logicalrelid::regclass, shardid,
CASE shardstorage
WHEN 't' THEN 'TABLE'
WHEN 'c' THEN 'COLUNAR'
WHEN 'f' THEN 'FOREIGN'
END AS shardstorage,
shardminvalue,shardmaxvalue
FROM pg_dist_shard
WHERE logicalrelid::regclass::text = 'mte_201607'
ORDER BY shardid;
logicalrelid | shardid | shardstorage | shardminvalue | shardmaxvalue
--------------+---------+--------------+---------------------+-------------------------
mte_201607 | 102350 | TABLE | 2016-07-01 00:00:00 | 2016-07-01 23:59:59
mte_201607 | 102352 | TABLE | 2016-07-02 00:00:00 | 2016-07-02 23:59:59
mte_201607 | 102354 | TABLE | 2016-07-03 00:00:00 | 2016-07-03 23:59:59
mte_201607 | 102356 | TABLE | 2016-07-04 00:00:00 | 2016-07-04 23:59:59
mte_201607 | 102358 | TABLE | 2016-07-05 00:00:00 | 2016-07-05 23:59:59
mte_201607 | 102360 | TABLE | 2016-07-06 00:00:00 | 2016-07-06 23:59:59
Metadados
SELECT pg_dist_shard.logicalrelid::regclass,
pg_dist_shard.shardid,
CASE shardstate
WHEN '1' THEN 'FINALIZED'
WHEN '3' THEN 'INACTIVE'
WHEN '4' THEN 'TO_DELETE'
END AS shardstate,
pg_size_pretty(shardlength),
nodename,nodeport
FROM pg_dist_shard_placement JOIN pg_dist_shard USING (shardid)
WHERE logicalrelid::regclass::text = 'mte_201607'
ORDER BY pg_dist_shard.shardid;
logicalrelid | shardid | shardstate | pg_size_pretty | nodename | nodeport
--------------+---------+------------+----------------+-----------+----------
mte_201607 | 102350 | FINALIZED | 288 MB | localhost | 5434
mte_201607 | 102352 | FINALIZED | 281 MB | localhost | 5434
mte_201607 | 102354 | FINALIZED | 284 MB | localhost | 5434
mte_201607 | 102356 | FINALIZED | 289 MB | localhost | 5434
cstore_fdw
● Foreign Data Wrapper para armazenamento colunar no PostgreSQL
○ Mais poderosa ainda com Citus
● Permite compressão de dados
○ Compressão LZ disponível
○ Extensível para outros algoritmos de compressão
○ Suporta mais de 40 tipos de dados do PostgreSQL
● Arquivos criados no sistema operacional
○ Formato baseado no ORC (Optimized Row Columnar)
● Skip Indexes
○ Estatísticas por blocos (MIN/MAX de cada bloco)
○ Seleciona apenas blocos relevantes
Instalação e configuração
echo "shared_preload_libraries = 'cstore_fdw'" >> /citusdb/master/postgresql.conf
echo "shared_preload_libraries = 'cstore_fdw'" >> /data/citusdb/worker1/postgresql.conf
echo "shared_preload_libraries = 'cstore_fdw'" >> /data/citusdb/worker2/postgresql.conf
for port in $(seq 5432 5434)
do
psql atlas -p $port -c "CREATE EXTENSION cstore_fdw"
done
-- Master node
CREATE SERVER cstore_server FOREIGN DATA WRAPPER cstore_fdw;
CREATE FOREIGN TABLE IF NOT EXISTS mte_201607 (
id bigint NOT NULL,
inserted_time timestamp NOT NULL,
phone bigint NOT NULL,
sms_text text,
...
) SERVER cstore_server;
Carga de dados
SET citus.shard_replication_factor TO 1;
SET citus.shard_max_size TO '1GB';
SELECT master_create_distributed_table('mte_201607', 'inserted_time', 'append');
COPY mte_201607 FROM PROGRAM 'zcat /data/csv/mte/2016/07/mte_*_part_00.gz' CSV DELIMITER '|';
ls -lhtr /data/citusdb/worker1/cstore_fdw/16384/ | head
total 291G
-rw------- 1 postgres postgres 191M Sep 24 02:37 16675
-rw------- 1 postgres postgres 474 Sep 24 02:37 16675.footer
-rw------- 1 postgres postgres 191M Sep 24 02:38 16679
-rw------- 1 postgres postgres 474 Sep 24 02:38 16679.footer
-rw------- 1 postgres postgres 193M Sep 24 02:40 16683
Carga de dados - com compressão
CREATE FOREIGN TABLE IF NOT EXISTS mte_201607 (
id bigint NOT NULL,
inserted_time timestamp NOT NULL,
phone bigint NOT NULL,
sms_text text,
...
) SERVER cstore_server OPTIONS(compression 'pglz');
SET citus.shard_replication_factor TO 1;
SET citus.shard_max_size TO '1GB';
SELECT master_create_distributed_table('mte_201607', 'inserted_time', 'append');
COPY mte_201607 FROM PROGRAM 'zcat /data/csv/mte/2016/07/mte_*_part_00.gz' CSV DELIMITER '|';
Comparativo
Postgres 9.6 Citusdb Citusdb + Cstore
Citusdb + Cstore
Compactado
Quantidade de registros 184 milhões 184 milhões 184 milhões 184 milhões
Quantidade de colunas 53 53 53 53
Tamanho da tabela 176 GB 176 GB 176 GB 119 GB
Tempo de carga 10 horas 5 hrs 10min 5hrs 15min 4hrs 40min
Tempo de consulta simples 7min 8min 3min 1.7min
Tuning Citusdb - Alguns parâmetros
● SET citus.max_running_tasks_per_node TO 6;
○ Número máximo de processos em paralelo em cada worker
● SET citus.shard_replication_factor TO 1;
○ Número de worker nodes que armazenará cada shard
● SET citus.shard_max_size TO '1GB';
○ Tamanho máximo de um shard
● SET citus.task_executor_type TO 'task-tracker';
○ Muda a sessão para task-tracker ou real-time
● SET citus.enable_ddl_propagation TO true;
○ Propagação automática de DDL
○ Habilitado por padrão
● SET citus.explain_all_tasks = 1;
○ Habilita EXPLAIN de todas as tasks paralelas
○ Útil para identificar nodes com planos de execução diferentes
Tuning cstore_fdw
● SERVER cstore_server OPTIONS(compression 'pglz',block_row_count '1000000');
○ Número de linhas por bloco
○ Padrão: 10000
○ Valor maior reduz leituras no disco
○ Mas reduz também o número de registros eliminados pela funcionalidade “Skip Indexes”
Conclusão
● Postgres-XL é (até o momento) uma excelente alternativa para escalabilidade de
escrita para ambientes OLTP
● Citusdb é a alternativa open source que possui os principais recursos necessários
para ambientes analíticos
○ Concorre com soluções proprietárias de custo elevado
○ Permite a utilização de funcionalidades do Postgres
● cstore_fdw possibilitou a análise de dados históricos em infraestrutura própria
● Redução de custos mesmo se contratado suporte Citusdata
Futuro
● Realizar estudo para comparar custos entre cluster Citusdb em datacenters e Cloud
● Carregar dados real-time
● Escalar horizontalmente a camada de persistência de grandes sistemas
● Reduzir custos com Redshift e Bigquery
Contato
twitter.com/matheusespanhol
linkedin.com/in/matheusespanhol
slideshare.net/matheus.espanhol
matheusespanhol@gmail.com

Mais conteúdo relacionado

Mais procurados

HA em PostgreSQL: O Elefante disponível para além do infinito
HA em PostgreSQL: O Elefante disponível para além do infinitoHA em PostgreSQL: O Elefante disponível para além do infinito
HA em PostgreSQL: O Elefante disponível para além do infinito
elliando dias
 

Mais procurados (20)

Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?
 
Modelos de computação distribuída no Hadoop
Modelos de computação distribuída no HadoopModelos de computação distribuída no Hadoop
Modelos de computação distribuída no Hadoop
 
Hadoop - Primeiros passos
Hadoop - Primeiros passosHadoop - Primeiros passos
Hadoop - Primeiros passos
 
QConSP16 - Apache Cassandra Evoluindo Sistemas Distribuídos
QConSP16 - Apache Cassandra Evoluindo Sistemas DistribuídosQConSP16 - Apache Cassandra Evoluindo Sistemas Distribuídos
QConSP16 - Apache Cassandra Evoluindo Sistemas Distribuídos
 
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
 
Hadoop - primeiros passos
Hadoop - primeiros passosHadoop - primeiros passos
Hadoop - primeiros passos
 
HA em PostgreSQL: O Elefante disponível para além do infinito
HA em PostgreSQL: O Elefante disponível para além do infinitoHA em PostgreSQL: O Elefante disponível para além do infinito
HA em PostgreSQL: O Elefante disponível para além do infinito
 
Estudo comparativo entr bancos RDBMS, NoSQL e NewSQL
Estudo comparativo entr bancos RDBMS, NoSQL e NewSQLEstudo comparativo entr bancos RDBMS, NoSQL e NewSQL
Estudo comparativo entr bancos RDBMS, NoSQL e NewSQL
 
Filesystem distribuído com hadoop!!!
Filesystem distribuído com hadoop!!! Filesystem distribuído com hadoop!!!
Filesystem distribuído com hadoop!!!
 
Postgresql como NewSQL - DevCamp 2014
Postgresql como NewSQL - DevCamp 2014Postgresql como NewSQL - DevCamp 2014
Postgresql como NewSQL - DevCamp 2014
 
Análise de performance usando as estatísticas do PostgreSQL
Análise de performance usando as estatísticas do PostgreSQLAnálise de performance usando as estatísticas do PostgreSQL
Análise de performance usando as estatísticas do PostgreSQL
 
Cassandra overview: Um Caso Prático
Cassandra overview:  Um Caso PráticoCassandra overview:  Um Caso Prático
Cassandra overview: Um Caso Prático
 
Hadoop
HadoopHadoop
Hadoop
 
AWS Redshift Primer
AWS Redshift PrimerAWS Redshift Primer
AWS Redshift Primer
 
Cloud Server Embratel
Cloud Server EmbratelCloud Server Embratel
Cloud Server Embratel
 
PostgreSQL - Visão Geral - Pedro Vieira
PostgreSQL - Visão Geral - Pedro VieiraPostgreSQL - Visão Geral - Pedro Vieira
PostgreSQL - Visão Geral - Pedro Vieira
 
Hadoop
HadoopHadoop
Hadoop
 
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
 
2º Meritt CC - NoSQL - E o Futuro dos Bancos de Dados na Web
2º Meritt CC - NoSQL - E o Futuro dos Bancos de Dados na Web2º Meritt CC - NoSQL - E o Futuro dos Bancos de Dados na Web
2º Meritt CC - NoSQL - E o Futuro dos Bancos de Dados na Web
 
Conceitoseaplicaes
ConceitoseaplicaesConceitoseaplicaes
Conceitoseaplicaes
 

Destaque

PGDay Campinas 2013 - Mineração de Dados com MADlib
PGDay Campinas 2013 - Mineração de Dados com MADlibPGDay Campinas 2013 - Mineração de Dados com MADlib
PGDay Campinas 2013 - Mineração de Dados com MADlib
PGDay Campinas
 
CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...
CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...
CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...
PGDay Campinas
 
PGDay Campinas 2013 - CASE: PostgreSQL no Tribunal de Justiça do Paraná
PGDay Campinas 2013 - CASE: PostgreSQL no Tribunal de Justiça do ParanáPGDay Campinas 2013 - CASE: PostgreSQL no Tribunal de Justiça do Paraná
PGDay Campinas 2013 - CASE: PostgreSQL no Tribunal de Justiça do Paraná
PGDay Campinas
 

Destaque (20)

PostgreSQL: How to Store Passwords Safely
PostgreSQL: How to Store Passwords SafelyPostgreSQL: How to Store Passwords Safely
PostgreSQL: How to Store Passwords Safely
 
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di Ciurcio
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di CiurcioDevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di Ciurcio
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di Ciurcio
 
PGDay Campinas 2013 - Window Function e CTE – Surpreendente
PGDay Campinas 2013 - Window Function e CTE – SurpreendentePGDay Campinas 2013 - Window Function e CTE – Surpreendente
PGDay Campinas 2013 - Window Function e CTE – Surpreendente
 
Gerenciamento de Backup e Recovery com o Barman
Gerenciamento de Backup e Recovery com o BarmanGerenciamento de Backup e Recovery com o Barman
Gerenciamento de Backup e Recovery com o Barman
 
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
 
PGDay Campinas 2013 - Mineração de Dados com MADlib
PGDay Campinas 2013 - Mineração de Dados com MADlibPGDay Campinas 2013 - Mineração de Dados com MADlib
PGDay Campinas 2013 - Mineração de Dados com MADlib
 
Pgday campinas 2015
Pgday campinas 2015Pgday campinas 2015
Pgday campinas 2015
 
Jaime Casanova - Domando a la bestia Replicación
Jaime Casanova - Domando a la bestia ReplicaciónJaime Casanova - Domando a la bestia Replicación
Jaime Casanova - Domando a la bestia Replicación
 
Palestra Diogo Rubert - PGDAY Campinas 2015
Palestra Diogo Rubert - PGDAY Campinas 2015Palestra Diogo Rubert - PGDAY Campinas 2015
Palestra Diogo Rubert - PGDAY Campinas 2015
 
pgDay Campinas – 2015
pgDay Campinas – 2015pgDay Campinas – 2015
pgDay Campinas – 2015
 
CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...
CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...
CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...
 
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...
 
PGDay Campinas 2013 - Implementando o PostgreSQL de maneira escalável e com a...
PGDay Campinas 2013 - Implementando o PostgreSQL de maneira escalável e com a...PGDay Campinas 2013 - Implementando o PostgreSQL de maneira escalável e com a...
PGDay Campinas 2013 - Implementando o PostgreSQL de maneira escalável e com a...
 
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
 
PGDay Campinas 2013 - Como Full Text Search pode ajudar na busca textual
PGDay Campinas 2013 - Como Full Text Search pode ajudar na busca textualPGDay Campinas 2013 - Como Full Text Search pode ajudar na busca textual
PGDay Campinas 2013 - Como Full Text Search pode ajudar na busca textual
 
PGDay Campinas 2013 - Postgres XC @ Cloud
PGDay Campinas 2013 - Postgres XC @ CloudPGDay Campinas 2013 - Postgres XC @ Cloud
PGDay Campinas 2013 - Postgres XC @ Cloud
 
PGDay Campinas 2013 - CASE: PostgreSQL no Tribunal de Justiça do Paraná
PGDay Campinas 2013 - CASE: PostgreSQL no Tribunal de Justiça do ParanáPGDay Campinas 2013 - CASE: PostgreSQL no Tribunal de Justiça do Paraná
PGDay Campinas 2013 - CASE: PostgreSQL no Tribunal de Justiça do Paraná
 
DevOps & PostgreSQL - Provisionamento Ágil
DevOps & PostgreSQL - Provisionamento ÁgilDevOps & PostgreSQL - Provisionamento Ágil
DevOps & PostgreSQL - Provisionamento Ágil
 
PGDAY - Palestra PostGIS + PgRouting
PGDAY - Palestra PostGIS + PgRoutingPGDAY - Palestra PostGIS + PgRouting
PGDAY - Palestra PostGIS + PgRouting
 
Ux na vida real deedz
Ux na vida real  deedzUx na vida real  deedz
Ux na vida real deedz
 

Semelhante a Bancos de dados analíticos open source

Secot banco de dados no sql de código aberto
Secot   banco de dados no sql de código abertoSecot   banco de dados no sql de código aberto
Secot banco de dados no sql de código aberto
Suissa
 
PostgreSQL: O melhor banco de dados Universo
PostgreSQL: O melhor banco de dados UniversoPostgreSQL: O melhor banco de dados Universo
PostgreSQL: O melhor banco de dados Universo
elliando dias
 
Fisl banco de dados no sql de código aberto
Fisl   banco de dados no sql de código abertoFisl   banco de dados no sql de código aberto
Fisl banco de dados no sql de código aberto
Suissa
 
Virtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno DominguesVirtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno Domingues
Joao Galdino Mello de Souza
 
Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...
Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...
Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...
iMasters
 
Oficina Técnica da INDA em Belém no Consegi
Oficina Técnica da INDA em Belém no ConsegiOficina Técnica da INDA em Belém no Consegi
Oficina Técnica da INDA em Belém no Consegi
nitaibezerra
 

Semelhante a Bancos de dados analíticos open source (20)

Secot banco de dados no sql de código aberto
Secot   banco de dados no sql de código abertoSecot   banco de dados no sql de código aberto
Secot banco de dados no sql de código aberto
 
PostgreSQL: O melhor banco de dados Universo
PostgreSQL: O melhor banco de dados UniversoPostgreSQL: O melhor banco de dados Universo
PostgreSQL: O melhor banco de dados Universo
 
Oficina técnica da Infraestrutura Nacional de Dados Abertos - INDA
Oficina técnica da Infraestrutura Nacional de Dados Abertos - INDAOficina técnica da Infraestrutura Nacional de Dados Abertos - INDA
Oficina técnica da Infraestrutura Nacional de Dados Abertos - INDA
 
Big Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenhoBig Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenho
 
Fisl banco de dados no sql de código aberto
Fisl   banco de dados no sql de código abertoFisl   banco de dados no sql de código aberto
Fisl banco de dados no sql de código aberto
 
Dev Parana - Praticas Devops aplicadas a Big Data
Dev Parana - Praticas Devops aplicadas a Big DataDev Parana - Praticas Devops aplicadas a Big Data
Dev Parana - Praticas Devops aplicadas a Big Data
 
Tomada de decisões com xPaaS aplicada ao fantasy game oficial do campeonato b...
Tomada de decisões com xPaaS aplicada ao fantasy game oficial do campeonato b...Tomada de decisões com xPaaS aplicada ao fantasy game oficial do campeonato b...
Tomada de decisões com xPaaS aplicada ao fantasy game oficial do campeonato b...
 
Big data para programadores convencionais
Big data para programadores convencionaisBig data para programadores convencionais
Big data para programadores convencionais
 
TDC2016POA | Trilha BigData - Orquestrando Hadoop, Cassandra e MongoDB com o ...
TDC2016POA | Trilha BigData - Orquestrando Hadoop, Cassandra e MongoDB com o ...TDC2016POA | Trilha BigData - Orquestrando Hadoop, Cassandra e MongoDB com o ...
TDC2016POA | Trilha BigData - Orquestrando Hadoop, Cassandra e MongoDB com o ...
 
Como arquiteturas de dados quebram
Como arquiteturas de dados quebramComo arquiteturas de dados quebram
Como arquiteturas de dados quebram
 
Arquitetando Soluções de Dados com PostgreSQL
Arquitetando Soluções de Dados com PostgreSQLArquitetando Soluções de Dados com PostgreSQL
Arquitetando Soluções de Dados com PostgreSQL
 
[DTC21] Lucas Gomes - Do 0 ao 100 no Big Data
[DTC21] Lucas Gomes - Do 0 ao 100 no Big Data[DTC21] Lucas Gomes - Do 0 ao 100 no Big Data
[DTC21] Lucas Gomes - Do 0 ao 100 no Big Data
 
Performance no MongoDB - TDC 2017 | Florianópolis
Performance no MongoDB - TDC 2017 | FlorianópolisPerformance no MongoDB - TDC 2017 | Florianópolis
Performance no MongoDB - TDC 2017 | Florianópolis
 
[DTC21] André Marques - Jornada do Engenheiro de Dados
[DTC21] André Marques - Jornada do Engenheiro de Dados[DTC21] André Marques - Jornada do Engenheiro de Dados
[DTC21] André Marques - Jornada do Engenheiro de Dados
 
Virtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno DominguesVirtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno Domingues
 
Big Data com MATLAB (Tiago Monteiro), Webinar ao vivo
Big Data com MATLAB (Tiago Monteiro), Webinar ao vivoBig Data com MATLAB (Tiago Monteiro), Webinar ao vivo
Big Data com MATLAB (Tiago Monteiro), Webinar ao vivo
 
Escalabilidade Linear com o Banco de Dados NoSQL Apache Cassandra.
Escalabilidade Linear com o Banco de Dados NoSQL Apache Cassandra.Escalabilidade Linear com o Banco de Dados NoSQL Apache Cassandra.
Escalabilidade Linear com o Banco de Dados NoSQL Apache Cassandra.
 
Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...
Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...
Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...
 
Oficina Técnica da INDA em Belém no Consegi
Oficina Técnica da INDA em Belém no ConsegiOficina Técnica da INDA em Belém no Consegi
Oficina Técnica da INDA em Belém no Consegi
 
Backup Online no MySQL com Percona Xtrabackup
Backup Online no MySQL com Percona XtrabackupBackup Online no MySQL com Percona Xtrabackup
Backup Online no MySQL com Percona Xtrabackup
 

Último

Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
Natalia Granato
 

Último (6)

Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 

Bancos de dados analíticos open source

  • 1. Análise de bancos de dados analíticos open source 6 de Outubro de 2016 Matheus Espanhol
  • 2. Agenda ● Cenário Movile ● Técnicas para otimização de bancos de dados analíticos ● Paralelismo do PostgreSQL 9.6 ● Citusdb e Postgres-XL ● Arquitetura do Citusdb ● Citusdb na Movile ● Conclusões e expectativas
  • 3. A Movile ● A Movile é player global no Mercado de conteúdo e comércio via smartphones ● Deixamos a vida das pessoas melhor por meio dos nossos aplicativos ● Buscamos incansavelmente fazer as coisas melhor, mais rápidas e mais baratas ○ 50 milhões de pessoas utilizam os serviços da Movile todo mês ○ Estamos conectados a mais de 70 operadoras em toda América ○ Crescimento anual médio de 80%, nos últimos 7 anos e espera crescer 50% ao ano, até 2020 Messaging Payments
  • 4.
  • 5. Cenário - Data Intelligence ● Cenário enfrentado: ○ Típico 1 sistema, 1 tabela = ~200GB/mês ○ Sistema orientado a eventos gerando 140MM/dia de registros proveniente de Smartphones ○ Controle de SMS de plataformas gerando 200MM/dia de registros ○ Tratando histórico de mais de 400MM de clientes que passaram por nossas plataformas ○ Tamanho de registros variando de 2Kb a 8Kb ○ Integrador de dados de todas as plataformas Movile e das empresas do grupo ● Banco de dados na nuvem ○ Apenas últimos 3 meses ○ Muitos usuários concorrentes ○ Unidades de negócio, níveis de uso e níveis de criticidade distintas
  • 6. Cenário - Data Intelligence ● Necessidade de realocação de espaço constante ● Custos elevados para aumento de storage na nuvem ● Máquinas locais de histórico não comportam mais que 2 anos de dados ● Índices ocupam bastante espaço ○ Consultas nem sempre utilizam campos indexados
  • 7. ● Falta de espaço em disco para restaurar dados históricos ● Gargalo de I/O ● CPU subutilizado ➢ Compressão de dados ➢ Armazenamento por coluna ➢ Bancos de dados de processamento paralelo (MPP) Cenário - Data Intelligence
  • 8. Alternativas Open source Citusdb (pg_shard + cstore_fdw) Postgres-XL Appliance NetezzaGreenplum Teradata Cloud Google BigQuery Amazon Redshift
  • 9. Processamento Paralelo ● Múltiplos CPUs em uma única máquina ○ Conjuntos de dados distintos ○ Possível gargalo de memória e disco ○ PostgreSQL 9.6 ● MPP (Massive Parallel Processing) ○ Cluster de banco de dados ○ Dados distribuídos entre os nós do cluster ○ Cluster shared nothing ■ Cada nó possui os próprios recursos de memória e disco
  • 10. Processamento Paralelo - PostgreSQL 9.6 COPY mte_201607 FROM PROGRAM 'zcat /data/csv/mte/2016/07/mte_*_part_00.gz' CSV DELIMITER '|'; ● Quantidade de registros: 184 milhões ● Quantidade de colunas: 53 ● Tamanho da tabela: 176 GB ● Tempo de carga: 10 horas 12min SET max_parallel_workers_per_gather TO 6; SELECT inserted_time,sms_text FROM mte_201607 WHERE uuid = '3CA81380-B06D-11E5-8C95-7610042D67C6'; Time: 433053.770 ms = 7min
  • 11. Armazenamento colunar ● Análise de dados geralmente é aplicada a algumas colunas ● Redução do tamanho das leituras em disco ● Menor uso de buffer cache ● Self-indexing ○ Redução do uso de espaço em disco com índices ● Maior vantagem para compressão de dados
  • 12. Compressão de dados ● Maior capacidade de armazenamento ● Redução do tamanho das leituras em disco ● Agregações em dados compactados ● Impacto no processamento ○ Bancos de dados analíticos geralmente possuem gargalo de disco ○ Poucos usuários ○ Baixa concorrência
  • 13. Postgres-XL Prós ● Tempo de resposta de consultas ● Modo de replicação e distribuição Contras ● ACID (GTM) ● Alta disponibilidade ● Escalabilidade ● Instalação complexa
  • 14. Citusdb Prós ● Extensão do PostgreSQL ● MPP ● Colunar ● Compressão de dados ● Sharding e replicação lógica Contras ● Comunidade de usuários ○ Código aberto recentemente
  • 17. Citusdb - Performance ● Real-time executor ○ Consulta roda com o máximo de recursos ○ 1 conexão por shard ○ Ex: consulta simples sem JOINs entre shards ou com poucos shards ● Task Tracker executor ○ Ideal para consultas grandes e complexas ○ 1 conexão por worker ○ Maior controle do paralelismo ○ Ex: consulta complexa que cruza dados entre os shards e com muitos shards
  • 18. Citusdb - Métodos de distribuição ● Hash ○ Ideal para INSERTs em tempo real ○ Dados não ordenados e que sofrem alterações ○ Mais eficiente para consultas com operações de igualdade ● Append ○ Ideal para dados históricos inseridos através de rotinas de ETL ○ Ordenados por tempo e não sofrem alterações ○ Mais eficiente para consultas com filtro por intervalo de tempo
  • 19. Instalação - 1 master e 2 workers yum install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-6-x86_64/pgdg-centos95-9.5-2.noarch.rpm yum install citus_95 service postgresql-9.5 initdb echo "shared_preload_libraries = 'citus'" >> /citusdb/master/postgresql.conf initdb -D /data/citusdb/worker1 sed -i 's/#port = 5432/port = 5433/g' /data/citusdb/worker1/postgresql.conf echo "shared_preload_libraries = 'citus'" >> /data/citusdb/worker1/postgresql.conf initdb -D /data/citusdb/worker2 sed -i 's/#port = 5432/port = 5434/g' /data/citusdb/worker2/postgresql.conf echo "shared_preload_libraries = 'citus'" >> /data/citusdb/worker2/postgresql.conf echo "localhost 5433 localhost 5434" > /citusdb/master/pg_worker_list.conf pg_ctl -D /citusdb/master start pg_ctl -D /data/citusdb/worker1 start pg_ctl -D /data/citusdb/worker2 start
  • 20. Instalação - 1 master e 2 workers for port in $(seq 5432 5434) do createdb -p $port atlas psql atlas -p $port -c "CREATE EXTENSION citus" done psql atlas -c "SELECT * FROM master_get_active_worker_nodes();" node_name | node_port -----------+----------- localhost | 5433 localhost | 5434
  • 21. Carga de dados CREATE TABLE IF NOT EXISTS mte_201607 ( id bigint NOT NULL, inserted_time timestamp NOT NULL, phone bigint NOT NULL, sms_text text, …. ); SET citus.shard_replication_factor TO 1; SET citus.shard_max_size TO '1GB'; SELECT master_create_distributed_table('mte_201607', 'inserted_time', 'append'); COPY mte_201607 FROM PROGRAM 'zcat /data/csv/mte/2016/07/mte_*_part_00.gz' CSV DELIMITER '|';
  • 22. Metadados SELECT logicalrelid::regclass, CASE partmethod WHEN 'a' THEN 'APPEND' ELSE 'HASH' END AS partmethod FROM pg_dist_partition; logicalrelid | partmethod ---------------------+------------ mte_201601 | APPEND mte_201602 | APPEND mte_201603 | APPEND mte_201604 | APPEND mte_201605 | APPEND mte_201606 | APPEND mte_201607 | APPEND mte_201608 | APPEND mte_201609 | APPEND mte_201610 | APPEND
  • 23. Metadados SELECT logicalrelid::regclass, shardid, CASE shardstorage WHEN 't' THEN 'TABLE' WHEN 'c' THEN 'COLUNAR' WHEN 'f' THEN 'FOREIGN' END AS shardstorage, shardminvalue,shardmaxvalue FROM pg_dist_shard WHERE logicalrelid::regclass::text = 'mte_201607' ORDER BY shardid; logicalrelid | shardid | shardstorage | shardminvalue | shardmaxvalue --------------+---------+--------------+---------------------+------------------------- mte_201607 | 102350 | TABLE | 2016-07-01 00:00:00 | 2016-07-01 23:59:59 mte_201607 | 102352 | TABLE | 2016-07-02 00:00:00 | 2016-07-02 23:59:59 mte_201607 | 102354 | TABLE | 2016-07-03 00:00:00 | 2016-07-03 23:59:59 mte_201607 | 102356 | TABLE | 2016-07-04 00:00:00 | 2016-07-04 23:59:59 mte_201607 | 102358 | TABLE | 2016-07-05 00:00:00 | 2016-07-05 23:59:59 mte_201607 | 102360 | TABLE | 2016-07-06 00:00:00 | 2016-07-06 23:59:59
  • 24. Metadados SELECT pg_dist_shard.logicalrelid::regclass, pg_dist_shard.shardid, CASE shardstate WHEN '1' THEN 'FINALIZED' WHEN '3' THEN 'INACTIVE' WHEN '4' THEN 'TO_DELETE' END AS shardstate, pg_size_pretty(shardlength), nodename,nodeport FROM pg_dist_shard_placement JOIN pg_dist_shard USING (shardid) WHERE logicalrelid::regclass::text = 'mte_201607' ORDER BY pg_dist_shard.shardid; logicalrelid | shardid | shardstate | pg_size_pretty | nodename | nodeport --------------+---------+------------+----------------+-----------+---------- mte_201607 | 102350 | FINALIZED | 288 MB | localhost | 5434 mte_201607 | 102352 | FINALIZED | 281 MB | localhost | 5434 mte_201607 | 102354 | FINALIZED | 284 MB | localhost | 5434 mte_201607 | 102356 | FINALIZED | 289 MB | localhost | 5434
  • 25. cstore_fdw ● Foreign Data Wrapper para armazenamento colunar no PostgreSQL ○ Mais poderosa ainda com Citus ● Permite compressão de dados ○ Compressão LZ disponível ○ Extensível para outros algoritmos de compressão ○ Suporta mais de 40 tipos de dados do PostgreSQL ● Arquivos criados no sistema operacional ○ Formato baseado no ORC (Optimized Row Columnar) ● Skip Indexes ○ Estatísticas por blocos (MIN/MAX de cada bloco) ○ Seleciona apenas blocos relevantes
  • 26. Instalação e configuração echo "shared_preload_libraries = 'cstore_fdw'" >> /citusdb/master/postgresql.conf echo "shared_preload_libraries = 'cstore_fdw'" >> /data/citusdb/worker1/postgresql.conf echo "shared_preload_libraries = 'cstore_fdw'" >> /data/citusdb/worker2/postgresql.conf for port in $(seq 5432 5434) do psql atlas -p $port -c "CREATE EXTENSION cstore_fdw" done -- Master node CREATE SERVER cstore_server FOREIGN DATA WRAPPER cstore_fdw; CREATE FOREIGN TABLE IF NOT EXISTS mte_201607 ( id bigint NOT NULL, inserted_time timestamp NOT NULL, phone bigint NOT NULL, sms_text text, ... ) SERVER cstore_server;
  • 27. Carga de dados SET citus.shard_replication_factor TO 1; SET citus.shard_max_size TO '1GB'; SELECT master_create_distributed_table('mte_201607', 'inserted_time', 'append'); COPY mte_201607 FROM PROGRAM 'zcat /data/csv/mte/2016/07/mte_*_part_00.gz' CSV DELIMITER '|'; ls -lhtr /data/citusdb/worker1/cstore_fdw/16384/ | head total 291G -rw------- 1 postgres postgres 191M Sep 24 02:37 16675 -rw------- 1 postgres postgres 474 Sep 24 02:37 16675.footer -rw------- 1 postgres postgres 191M Sep 24 02:38 16679 -rw------- 1 postgres postgres 474 Sep 24 02:38 16679.footer -rw------- 1 postgres postgres 193M Sep 24 02:40 16683
  • 28. Carga de dados - com compressão CREATE FOREIGN TABLE IF NOT EXISTS mte_201607 ( id bigint NOT NULL, inserted_time timestamp NOT NULL, phone bigint NOT NULL, sms_text text, ... ) SERVER cstore_server OPTIONS(compression 'pglz'); SET citus.shard_replication_factor TO 1; SET citus.shard_max_size TO '1GB'; SELECT master_create_distributed_table('mte_201607', 'inserted_time', 'append'); COPY mte_201607 FROM PROGRAM 'zcat /data/csv/mte/2016/07/mte_*_part_00.gz' CSV DELIMITER '|';
  • 29. Comparativo Postgres 9.6 Citusdb Citusdb + Cstore Citusdb + Cstore Compactado Quantidade de registros 184 milhões 184 milhões 184 milhões 184 milhões Quantidade de colunas 53 53 53 53 Tamanho da tabela 176 GB 176 GB 176 GB 119 GB Tempo de carga 10 horas 5 hrs 10min 5hrs 15min 4hrs 40min Tempo de consulta simples 7min 8min 3min 1.7min
  • 30. Tuning Citusdb - Alguns parâmetros ● SET citus.max_running_tasks_per_node TO 6; ○ Número máximo de processos em paralelo em cada worker ● SET citus.shard_replication_factor TO 1; ○ Número de worker nodes que armazenará cada shard ● SET citus.shard_max_size TO '1GB'; ○ Tamanho máximo de um shard ● SET citus.task_executor_type TO 'task-tracker'; ○ Muda a sessão para task-tracker ou real-time ● SET citus.enable_ddl_propagation TO true; ○ Propagação automática de DDL ○ Habilitado por padrão ● SET citus.explain_all_tasks = 1; ○ Habilita EXPLAIN de todas as tasks paralelas ○ Útil para identificar nodes com planos de execução diferentes
  • 31. Tuning cstore_fdw ● SERVER cstore_server OPTIONS(compression 'pglz',block_row_count '1000000'); ○ Número de linhas por bloco ○ Padrão: 10000 ○ Valor maior reduz leituras no disco ○ Mas reduz também o número de registros eliminados pela funcionalidade “Skip Indexes”
  • 32. Conclusão ● Postgres-XL é (até o momento) uma excelente alternativa para escalabilidade de escrita para ambientes OLTP ● Citusdb é a alternativa open source que possui os principais recursos necessários para ambientes analíticos ○ Concorre com soluções proprietárias de custo elevado ○ Permite a utilização de funcionalidades do Postgres ● cstore_fdw possibilitou a análise de dados históricos em infraestrutura própria ● Redução de custos mesmo se contratado suporte Citusdata
  • 33. Futuro ● Realizar estudo para comparar custos entre cluster Citusdb em datacenters e Cloud ● Carregar dados real-time ● Escalar horizontalmente a camada de persistência de grandes sistemas ● Reduzir custos com Redshift e Bigquery