Ich möchte die Protokollierung von allen meinen Servern in einer zentralen Postgresql-Datenbank einrichten. Es ist sinnvoll, Protokolle nach Datum oder Host löschen zu können. Daher möchte ich sie mit Partitionierung einrichten , aber mit einer mehrschichtigen Partition:host-service inherits service, host-service-yyyymm inherits host-service.
Ich habe ein Beispielschema für einen bestimmten Dienst ausgearbeitet (in diesem Fall PHP-Fehler) und suche einige PostgreSQL-Experten, um es auf offensichtliche Leistungsengpässe zu kritisieren.
// 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);
Ich werde auch Dienste wie Apache-Zugriff / Fehler hinzufügen.
Ich denke, ich muss auslösen, um in den host_service einzufügen (um die Host-Check-Einschränkung zu verwenden), und dann muss jeder host_service auslösen, um in die Tabelle host_service_yyyymm einzufügen.
Was kann ich von einem solchen Trigger- / Partitionsschema in Bezug auf die Leistung erwarten?
Einige zusätzliche Informationen, die im Chat besprochen wurden:
- PostgreSQL Version 9.1.2
- Datenabfragen werden nicht sehr häufig durchgeführt, hauptsächlich im aktuellen Datenmonat für mehrere Hosts.
- PHP ist nur ungefähr 1 pro Minute Insert, aber der gesamte Apache wird wahrscheinlich auf allen Hosts ungefähr 300-500 pro Sekunde betragen.
quelle
php
Tabelle einen Index für(host,logdate)
und erben die Kinder den Index?MERGE
genau daran habe ich gedacht, als ich über die Partitionierung in Postgre nachgelesen habe ... Nein, keine Indizes zum MasterCREATE INDEX
Aussagen. Sollten es nicht verschiedene Tabellen sein, eine für jede Partition?Antworten:
Kontextwechsel bedeuten, dass die Verwendung von Triggern immer viel mehr CPU als eine einfache benötigt
insert
. Das folgende Skript kann verwendet werden, um die Auswirkungen zu quantifizieren. Außerdem wird das automatische Erstellen von Partitionen mithilfe von Triggern demonstriert und die Leistung in beiden Fällen verglichen.Bitte beachten Sie, dass ich keine Indizierung oder Berücksichtigung von
update
Aussagen aufgenommen habe.quelle