19

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

1. pgpool 2
2. gridsql

这是使用分片的更好方法

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

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

4

4 回答 4

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;

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

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

于 2009-06-18T07:48:31.767 回答
17

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

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

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

于 2011-03-13T20:08:35.177 回答
5

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

于 2009-06-15T09:58:46.957 回答
0

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

  1. PostgreSQL 分区(范围或列表)。
  2. 将 PostgreSQL 分区和表空间组合在几个 SSD 中。
  3. PostgreSQL FDW 扩展。

替代方案:Postgres-XL

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

  1. Postgres-BDR
  2. Postgres-X2

笔记:

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

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

**警告**

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

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

于 2018-01-29T08:58:39.230 回答