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

pyl*_*abs 18 postgresql partitioning sharding

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

1. pgpool 2
2. gridsql
Run Code Online (Sandbox Code Playgroud)

这是使用分片的更好方法

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

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

Wol*_*gon 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);
Run Code Online (Sandbox Code Playgroud)

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

CREATE TRIGGER insert_measurement_trigger
    BEFORE INSERT ON measurement
    FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();
Run Code Online (Sandbox Code Playgroud)

以及执行插入的触发器功能

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;
Run Code Online (Sandbox Code Playgroud)

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

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

  • GridSQL是GPL,它确实适用于标准的postgres. (2认同)

小智 17

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

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

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


Mag*_*der 5

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