在 postgresql 中水平分片的好方法是啥

Posted

技术标签:

【中文标题】在 postgresql 中水平分片的好方法是啥【英文标题】:what is a good way to horizontal shard in postgresql在 postgresql 中水平分片的好方法是什么 【发布时间】:2010-11-02 22:51:46 【问题描述】:

什么是postgresql中水平分片的好方法

1. pgpool 2
2. gridsql

这是使用分片的更好方法

也可以在不更改客户端代码的情况下进行分区

如果有人可以分享一个关于如何设置和使用分片的简单教程或食谱示例,那就太好了

【问题讨论】:

【参考方案1】:

实现PostgreSQL集群的最佳实践是使用:

    PostgreSQL 分区(范围或列表)。 在多个 SSD 中组合 PostgreSQL 分区和表空间。 PostgreSQL FDW 扩展。

替代方案:Postgres-XL

对于分片(负载平衡),您可以使用:

    Postgres-BDR Postgres-X2

注意:

集群目的是包含大数据集,主要用于数据仓库。

分片用于负载平衡,主要用于高事务数据库。

** 警告 **

避免使用 pgpool,因为过多的开销会在未来导致问题。

希望这个答案对你未来的发展有所帮助。

【讨论】:

【参考方案2】:

PostgreSQL 允许以两种不同的方式进行分区。一种是按范围,另一种是按列表。两者都使用表继承来进行分区。 按范围(通常是日期范围)分区是最常见的,但如果分区的变量是静态的且未倾斜,则按列表分区会很有用。

分区是通过表继承完成的,因此首先要做的是设置新的子表。

CREATE TABLE measurement (
    x        int not null,
    y        date not null,
    z        int
);

CREATE TABLE measurement_y2006 ( 
    CHECK ( logdate >= DATE '2006-01-01' AND logdate < DATE '2007-01-01' )
) INHERITS (measurement);

CREATE TABLE measurement_y2007 (
    CHECK ( logdate >= DATE '2007-01-01' AND logdate < DATE '2008-01-01' ) 
) INHERITS (measurement);

然后需要使用规则或触发器将数据删除到正确的表中。 批量更新的规则更快,单个更新的触发器更容易维护。这是一个示例触发器。

CREATE TRIGGER insert_measurement_trigger
    BEFORE INSERT ON measurement
    FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();

以及执行插入的触发函数

CREATE OR REPLACE FUNCTION measurement_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
    IF ( NEW.logdate >= DATE '2006-01-01' 
         AND NEW.logdate < DATE '2007-01-01' ) THEN
        INSERT INTO measurement_y2006 VALUES (NEW.*);
    ELSIF ( NEW.logdate >= DATE '2007-01-01' 
            AND NEW.logdate < DATE '2008-01-01' ) THEN
        INSERT INTO measurement_y2006m03 VALUES (NEW.*);
    ELSE
        RAISE EXCEPTION 'Date out of range.';
    END IF;
    RETURN NULL;
END;
$$
LANGUAGE plpgsql;

这些示例是 postgresql 文档的简化版本,以便于阅读。

我对 pgpool2 不熟悉,但是 gridsql 是为 EnterpriseDB 设计的商业产品,EnterpriseDB 是建立在 postgresql 之上的商业数据库。他们的产品非常好,但我认为它不适用于标准的 postgresl。

【讨论】:

【参考方案3】:

好吧,如果问题是关于分片,那么 pgpool 和 postgresql 分区功能不是有效的答案。

分区假定分区位于同一台服务器上。 Sharding 更通用,通常在数据库拆分到多个服务器上时使用。当无法再进行分区时使用分片,例如对于单个磁盘无法容纳的大型数据库。

对于真正的分片,Skype 的 pl/proxy 可能是最好的。

【讨论】:

【参考方案4】:

pl/proxy(通过 Skype)是一个很好的解决方案。它要求您通过函数 API 进行访问,但是一旦您拥有它,它就可以使其变得非常透明。

【讨论】:

以上是关于在 postgresql 中水平分片的好方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt5 中水平对齐中心图像?

iPhone UIImageView 在 UIScrollView 中水平滚动 - 中心图像?

如何在不使用数据透视和反透视的情况下在 SQL Server 中水平显示数据?

盒子在浏览器中水平垂直居中

SHIFT +滚动到ScrollViewer UWP中水平滚动

如何在不使用pivot和unpivot的情况下在SQL Server中水平显示数据?