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

时间:2009-06-15 07:33:43

标签: postgresql partitioning sharding

postgresql

中水平分片的好方法是什么
1. pgpool 2
2. gridsql

这是使用分片的更好方法

也可以在不改变客户代码的情况下进行分割

如果有人可以分享如何设置和使用分片的简单教程或食谱示例,那将是很棒的

4 个答案:

答案 0 :(得分:19)

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;

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

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

答案 1 :(得分:17)

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

分区假设分区位于同一服务器上。 分片更为通用,通常在数据库在多个服务器上拆分时使用。当不再可能进行分区时使用分片,例如,对于无法放在单个磁盘上的大型数据库。

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

答案 2 :(得分:5)

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

答案 3 :(得分:0)

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

  1. PostgreSQL分区(范围或列表)。
  2. 将PostgreSQL分区和表空间合并到多个SSD中。
  3. PostgreSQL FDW扩展。
  4. 替代方案:Postgres-XL

    对于Sharding(负载均衡),您可以使用:

    1. 的Postgres-BDR
    2. 的Postgres-X2
    3. 注意:

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

      分片目的是负载均衡,主要用于高事务数据库。

      ** 警告 **

      避免使用pgpool,因为太多的开销会导致将来出现问题。

      希望这个答案能够帮助你在未来的发展中。