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

     2023-02-16     35

关键词:

【中文标题】在 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 进行访问,但是一旦您拥有它,它就可以使其变得非常透明。

【讨论】:

css中水平垂直居中的几种解决方法

在控制元素的水平、垂直居中问题时,有很多种解决方法,下面介绍几种解决办法:水平垂直居中:第一种:css3的transform.ele{//父元素/*设置元素绝对定位*/position:absolute;/*top50%*/top:50%;/*left50%*/left:50%;/*css3transform实现*/transform:transla... 查看详情

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

】如何在PyQt5中水平对齐中心图像?【英文标题】:HowdoIaligncentreimagehorizontallyinPyQt5?【发布时间】:2021-08-1209:58:13【问题描述】:我正在做我的大学项目,我想将图像水平居中对齐,我尝试了很多方法但没有找到解决方案。这是... 查看详情

如何在 Android 中水平/垂直滚动全景图像?

】如何在Android中水平/垂直滚动全景图像?【英文标题】:Howtohorizontal/VerticalscrollapanoramicimageinAndroid?【发布时间】:2016-03-1509:37:37【问题描述】:我正在寻找一种在Android中进行滚动或扫描全景图像的方法。有了这个,我的意思... 查看详情

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

】iPhoneUIImageView在UIScrollView中水平滚动-中心图像?【英文标题】:iPhoneUIImageViewhorizontallscrollinginUIScrollView-Centerimage?【发布时间】:2012-01-2514:37:26【问题描述】:我有根据屏幕大小下载和调整图像大小以适应图像全屏的方法。最... 查看详情

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

】如何在不使用数据透视和反透视的情况下在SQLServer中水平显示数据?【英文标题】:HowtodisplaydatahorizontallyinSQLServerwithoutusingpivotandunpivot?【发布时间】:2017-12-2012:57:00【问题描述】:有没有什么方法可以在不使用pivot和unpivot方... 查看详情

在 iOS 中水平读取 UIWebView 中的 PDF

】在iOS中水平读取UIWebView中的PDF【英文标题】:PDFReadinginUIWebViewwithhorinzontallyiniOS【发布时间】:2014-05-2304:36:34【问题描述】:用于在iOS中水平读取UIWebView中的PDF文件。所以我写了以下内容以添加UIScrollView以水平滚动。UIScrollView*s... 查看详情

java示例代码_在javafx中水平增长进度条

java示例代码_在javafx中水平增长进度条 查看详情

如何在 UINavigationBar 中水平定位 backIndicatorImage

】如何在UINavigationBar中水平定位backIndicatorImage【英文标题】:HowtohorizontallypositionthebackIndicatorImageinUINavigationBar【发布时间】:2016-01-0416:26:44【问题描述】:我使用此代码将插图添加到导航栏的backIndicator图像。但是,这仅适用于... 查看详情

在材料设计中水平对齐元素

】在材料设计中水平对齐元素【英文标题】:horizontallyalignelementsinmaterialdesign【发布时间】:2016-03-0106:48:26【问题描述】:我有一个包含两个组件的简单工具栏:一个h1和一个菜单按钮。我希望h1居中在工具栏和左侧的菜单按钮。... 查看详情

在 SQL Server 中水平连接两个以上的表

】在SQLServer中水平连接两个以上的表【英文标题】:ConcatenatemorethantwotableshorizontallyinSQLServer【发布时间】:2015-02-2408:03:47【问题描述】:以下是架构+---------+---------+|EmployeeTable|+---------+---------+|EmpId|Name|+---------+---------+|1|John||2|Li 查看详情

如何在 Android 中水平滚动 ImageView?

】如何在Android中水平滚动ImageView?【英文标题】:HowtoscrollImageViewhorizontalinAndroid?【发布时间】:2019-01-2503:59:42【问题描述】:在我的应用程序中,我想将图像从服务器显示到ImageView。我的imageView填满整个屏幕,为此我使用android... 查看详情

在 matplotlib 中水平显示单选按钮

】在matplotlib中水平显示单选按钮【英文标题】:DisplayingRadiobuttonshorizontallyinmatplotlib【发布时间】:2019-08-0108:51:14【问题描述】:我正在使用matplotlib.widgets在我的小部件中创建单选按钮,即将出现的按钮垂直堆叠,我希望它们水... 查看详情

如何在 JavaScript 中水平翻转图像

】如何在JavaScript中水平翻转图像【英文标题】:HowtohorizontiallyflipaimageinJavaScript【发布时间】:2022-01-2211:30:48【问题描述】:我正在尝试翻转从网络摄像头流中捕获的图像。CSS中的网络摄像头view被翻转,但是当我拍摄快照时,它... 查看详情

停止视图在相对布局中水平重叠

】停止视图在相对布局中水平重叠【英文标题】:Stopviewsoverlappinghorizontallyinarelativelayout【发布时间】:2016-04-2815:57:40【问题描述】:作为日历的一部分,我有两个视图,一个日视图和一个事件视图。我希望我的事件以宽度填充... 查看详情

如何在jquery中水平滚动textarea?

】如何在jquery中水平滚动textarea?【英文标题】:howtoscrolltextareahorizontallyinjquery?【发布时间】:2013-10-2122:00:50【问题描述】:我想滚动输入字段。所以我用谷歌搜索我发现我们不能滚动输入字段,但是我们可以水平滚动文本区域... 查看详情

如何在框架中水平(向上/向下)居中 UILabel 文本?

】如何在框架中水平(向上/向下)居中UILabel文本?【英文标题】:HowtocenterUILabeltexthorizontally(Up/Down)inframe?【发布时间】:2014-05-0221:50:29【问题描述】:我有一个从simplecontrol.子类化的UILabel我遇到的问题是标签中的文本被格式化... 查看详情

使用jQuery在区域中水平滚动[重复]

】使用jQuery在区域中水平滚动[重复]【英文标题】:ScrollhorizontallyinareawithjQuery[duplicate]【发布时间】:2017-02-1506:01:21【问题描述】:我目前正在做一个项目,我已经介入了一大堆....一些不开心的事情。这个想法很简单我有具有200... 查看详情

在 SwiftUi 中水平组合和打破垂直滚动视图?

】在SwiftUi中水平组合和打破垂直滚动视图?【英文标题】:CombiningandBreakingaVerticalscrollViewHorizontallyinSwiftUi?【发布时间】:2020-10-3010:50:21【问题描述】:有谁知道如何使用SwiftUi将VerticalScrollView分解为小的水平ScrollView:我有下面... 查看详情