我正在考虑将我所有服务器的日志记录设置到集中式 postgresql 数据库中。能够按日期或主机删除日志是有意义的,所以我想用partitioning来设置它,但是一个多层分区:host-service inherits service, host-service-yyyymm inherits host-service.
我已经为特定服务制定了一个示例方案(在这种情况下为 php 错误),并且正在寻找一些 PostgreSQL 专家来批评它是否存在明显的性能瓶颈。
// 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);
我还将添加诸如 apache 访问/错误之类的服务。
我想我必须触发插入到 host_service(以利用主机检查约束),然后每个 host_service 必须触发插入到 host_service_yyyymm 表中。
我对这种触发器/分区方案的性能有什么期望?
聊天中讨论的一些额外信息:
- PostgreSQL 版本 9.1.2
- 对数据的查询不会很频繁,而且主要是针对多个主机的当月数据。
- PHP 每分钟大约只有 1 个插入,但所有主机上的总 apache 可能大约为每秒 300-500 个。
上下文切换意味着使用触发器总是会比简单的
insert
. 下面的脚本可用于量化将产生多大的影响 - 并且还演示了使用触发器自动创建分区并比较两种方式的性能。请注意,我没有包括任何索引,或任何对
update
陈述的考虑。