Estou pensando em configurar o log de todos os meus servidores em um banco de dados postgresql centralizado. Faz sentido poder descartar logs por data ou por host, então gostaria de configurá-lo com particionamento , mas uma partição de várias camadas:host-service inherits service, host-service-yyyymm inherits host-service.
Elaborei um esquema de exemplo para um serviço específico (erros de PHP neste caso) e estou procurando alguns especialistas em PostgreSQL para criticá-lo por gargalos óbvios de desempenho.
// SET UP MASTER PHP LOG TABLE //
CREATE TABLE php (
log_id int not null,
host char(5),
logdate date not null,
message text
);
// SET UP HOST-SPECIFIC 'PARTITIONS' //
CREATE TABLE host1_php (
CHECK ( host = 'host1' )
) INHERITS (php);
CREATE TABLE host2_php (
CHECK ( host = 'host2' )
) INHERITS (php);
// SET UP HOST-SPECIFIC TIME 'PARTITIONS' //
CREATE TABLE host1_php_2011m12 (
CHECK ( logdate >= DATE '2011-12-01' AND logdate < DATE '2012-01-01' )
) INHERITS (host1_php);
CREATE TABLE host1_php_2012m01 (
CHECK ( logdate >= DATE '2012-01-01' AND logdate < DATE '2012-02-01' )
) INHERITS (host1_php);
CREATE TABLE host2_php_2011m12 (
CHECK ( logdate >= DATE '2011-12-01' AND logdate < DATE '2012-01-01' )
) INHERITS (host2_php);
CREATE TABLE host2_php_2012m01 (
CHECK ( logdate >= DATE '2012-01-01' AND logdate < DATE '2012-02-01' )
) INHERITS (host2_php);
CREATE INDEX host1_php_2011m12_logdate ON host1_php_2011m12 (logdate);
CREATE INDEX host1_php_2012m01_logdate ON host1_php_2012m01 (logdate);
CREATE INDEX host2_php_2011m12_logdate ON host2_php_2011m12 (logdate);
CREATE INDEX host2_php_2012m01_logdate ON host2_php_2012m01 (logdate);
Também adicionarei serviços como acesso/erros do apache.
Acho que tenho que acionar para inserir no host_service (para utilizar a restrição de verificação do host) e, em seguida, cada host_service deve acionar para inserir na tabela host_service_yyyymm.
O que posso esperar em termos de desempenho de tal esquema de acionamento/partição?
Algumas informações extras discutidas no chat:
- PostgreSQL versão 9.1.2
- As consultas de dados não serão muito frequentes e principalmente no mês atual de dados para vários hosts.
- O PHP tem apenas cerca de 1 inserção por minuto, mas o apache total provavelmente ficará em torno de 300-500 por segundo em todos os hosts.
As opções de contexto significam que o uso de gatilhos sempre usará muito mais CPU do que um simples arquivo
insert
. O script abaixo pode ser usado para quantificar quanto impacto isso terá - e também demonstra a criação automática de partições usando gatilhos e compara o desempenho de qualquer maneira.Observe que não incluí nenhuma indexação ou consideração de
update
declarações.