【发布时间】:2020-06-18 14:18:49
【问题描述】:
我们正在考虑将我们的应用迁移到多租户数据库。目前,该应用程序使用每个租户一个数据库运行。目前约有400名租户。合并后,最大的表将有大约 10 亿行,并且会随着租户的增加而增长。租户的大小差异很大,仅一个租户在该表中就有 1.8 亿条记录,有些不到 100 万条。数以亿计的还有其他几张桌子,大多数桌子的数量要少得多。我主要关注的是大型表的可伸缩性规划,我将专注于最大的表。它的参数是它是一个链接/多对多表,其中包含创建者和创建日期的基本审计字段(尽管我质疑这些字段是否甚至是必要的)。日期/时间与此无关,这是一个分配表,始终适用。记录可以被删除或插入,而不是更新,有时是批量的,可能不经常发生,但随时可能发生。我认为两个外键的数据基数都相对较高,尽管我不确定高基数与记录总数的比率是什么。从某种角度来看,拥有 1.8 亿条记录的租户对于一个外键有大约 100,000 条不同的记录,而对于另一个外键则有 165,000 条。同时,另一个客户有大约 180,000 条记录,一个字段中有 500 个不同的值,另一个字段有 5000 个。正如我所说,有很多可变性。
我上面描述的那种表(数十亿行、高数据基数、不基于时间、租户分段、随时批量插入/删除)是否会在我描述的那种场景中(400 多个租户与不同数量的数据)是否适合分区?我现在担心这一点的原因是,我在许多地方读到,如果您提前计划好分区而不是在表之后尝试分区,那么处理分区的痛苦会小得多在不需要停机时间或跳过箍的情况下,它是巨大且难以使用的。在这一点上,我主要关心的不是查询数据,我用一个有 10 亿条记录的表进行了测试,并且使用适当的索引选择查询运行得非常快。我更担心读/写/删除的并发性,由于锁而陷入阻塞等。如果分区是必要的,那么好的策略是什么?按租户划分?把大的分开,把小的捆绑在一起?
【问题讨论】: