Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres中大表分区的标准和策略_Postgresql_Scalability - Fatal编程技术网

Postgresql Postgres中大表分区的标准和策略

Postgresql Postgres中大表分区的标准和策略,postgresql,scalability,Postgresql,Scalability,我们正在考虑将我们的应用程序迁移到多租户数据库。目前,该应用程序运行时每个租户有一个数据库。目前约有400名租户。如果合并起来,最大的表将有大约10亿行,并且会随着租户的增加而增长。租户的规模差异很大,仅一个租户就有1.8亿条记录在该表中,有些记录不足100万条。在上亿张桌子中还有一些其他的桌子,大多数桌子的桌子都会少很多。我主要关注的是大型表的可伸缩性规划,我将重点关注最大的一个。它的参数是,它是一个链接/多对多表,包含created by和created date的基本审计字段(尽管我怀疑这

我们正在考虑将我们的应用程序迁移到多租户数据库。目前,该应用程序运行时每个租户有一个数据库。目前约有400名租户。如果合并起来,最大的表将有大约10亿行,并且会随着租户的增加而增长。租户的规模差异很大,仅一个租户就有1.8亿条记录在该表中,有些记录不足100万条。在上亿张桌子中还有一些其他的桌子,大多数桌子的桌子都会少很多。我主要关注的是大型表的可伸缩性规划,我将重点关注最大的一个。它的参数是,它是一个链接/多对多表,包含created by和created date的基本审计字段(尽管我怀疑这些字段是否对这个表是必需的)。日期/时间与此无关,这是一个分配表,始终适用。记录可以被删除或插入,而不是更新,有时是批量的,可能并不频繁,但可以随时发生。我认为两个外键上的数据基数都相对较高,尽管我不确定高基数与记录总数的比率是什么。从某种角度来看,拥有1.8亿条记录的租户一个外键大约有100000条不同的记录,另一个外键大约有165000条。同时,另一个客户有大约180000条记录,其中一个字段有500个不同的值,另一个字段有5000个不同的值。正如我所说,很多变化


在我所描述的场景(400多个租户,数据量不同)中,我上面描述的那种表(数十亿行,高数据基数,不基于时间,租户分段,随时大容量插入/删除)是分区的好选择吗?我现在担心这一点的原因是,我在很多地方都读到过,如果您提前计划分区,而不是在表很大且更难处理而不需要停机或跳转的情况下尝试以后再进行分区,那么处理分区就不会那么痛苦了。在这一点上,我主要关心的不是太多的数据查询,我使用一个有10亿条记录的表进行了测试,并且使用适当的索引,select查询运行得非常快。我更担心读/写/删除的并发性,由于锁等原因而遇到阻塞。如果分区是有保证的,那么什么是好的策略呢?按租户划分?只需将大的分区和保持较小的绑定在一起?

假设你说查询性能不是问题,我想考虑分区的唯一原因是使质量清洗更容易完成。 您是否有合同或法律保留政策

最常见的情况是使用时间段作为分区键,这样滚动旧数据只需删除分区,但由于您明确指出日期/时间不相关,我不认为这有什么帮助

你是否经常与个人客户打交道?是否有吹扫或保留要求?如果是这样,那么按客户进行分区(无论分区多么不平衡)是有意义的,因为您可以清除大客户的数据,而不会影响其他客户对其数据的访问

对于任何并发性问题,按客户划分应该有助于将这些问题包含在表现出大量活动的特定客户中

出于以下几个原因,我建议对此进行彻底测试:

  • 我没有看到多个活动分区在运行,因为我只使用时间序列分区
  • 我还没有深入研究过,也不知道如果外键两边都有一个分区的桌子,是否会使丢弃配偶变得复杂
  • 我从未探讨过数据库可能包含的分区数量的实际限制

我可能是从我的经验中读到关于分区的问题,但您是否考虑过每个客户的模式?

我们确实考虑过架构路由,但它确实有一些与每个客户的数据库相同的问题。您必须管理所有这些模式,并处理诸如在部署出现问题时迁移/回滚所有模式之类的事情。多租户将允许我们最大限度地提高资源使用效率。使用RLS可以很好地实现隔离,因此取决于随着某些表的增长,性能能够保持多久。我认为时间范围对某些人来说是可行的,但最大的时间范围并不是特定于日期的,很遗憾。@Rocket04基于我所做的工作,我主要从“这如何帮助我清除数据?”的角度来考虑分区,如果这对你来说不是问题,而且你没有自然的键来帮助提高性能,那我就看不出有什么理由分割了。除了分区之外,在重新设计multitenant时,我建议为客户数据所在的db添加一个级别,以便在必要时灵活地移动它们。