Nginx 应用程序级分片

Nginx 应用程序级分片,nginx,sharding,Nginx,Sharding,我正在设计一个多租户系统,并考虑在应用程序层而不是数据库层按租户进行分片 假设,这应该是一种工作方式,对于传入请求,路由器进程有一个租户的全局集合,其中包含主要属性,以确定此请求的租户以及虚拟碎片id。此虚拟碎片id进一步映射到实际碎片 实际的碎片包含应用程序的代码以及该租户的全部数据。这些碎片将是LNMP(Linux、Nginx、MySQL/MongoDB、PHP)服务器 路由器进程应充当代理。它应该能够运行一些代码,根据存储在一些本地数据库或文件中的集合来确定传入请求的目标碎片。为了更好地扩

我正在设计一个多租户系统,并考虑在应用程序层而不是数据库层按租户进行分片

假设,这应该是一种工作方式,对于传入请求,路由器进程有一个租户的全局集合,其中包含主要属性,以确定此请求的租户以及虚拟碎片id。此虚拟碎片id进一步映射到实际碎片

实际的碎片包含应用程序的代码以及该租户的全部数据。这些碎片将是LNMP(Linux、Nginx、MySQL/MongoDB、PHP)服务器

路由器进程应充当代理。它应该能够运行一些代码,根据存储在一些本地数据库或文件中的集合来确定传入请求的目标碎片。为了更好地扩展这个功能,我正在考虑让碎片本身也充当路由器,以便它们可以运行反向代理,将请求转发到适当的碎片。也许运行在shard上的nginx实例也可以充当反向代理。但它将如何执行将请求与适当的碎片匹配所需的应用程序逻辑

我将感谢任何关于路由器实现的想法和建议


谢谢

除非您希望租户生成大致相等的数据量,否则按租户分片将不会非常有效

关于一般的应用程序级切分,让我分享一下自己的经验:

我们的高容量SaaS产品的第1版在应用程序级别分片。您会发现,如果您在应用程序级别对SQL类型的解决方案进行切分,那么随着您的成长进行重新硬处理将是一个非常头痛的问题,或者您将不得不编写重要的工具来自动化该过程

我们转向MongoDB(在考虑了包括Cassandra在内的多种备选方案后),这在很大程度上是因为随着数据的增长,所有内置的对重新存储/重新平衡的支持


如果您的应用程序不需要MySQL的关系功能,我建议您将精力集中在MongoDB上(因为您已经将其确定为一个可能的数据平台),如果您预期的数据增长不会太小的话。允许MongoDB处理数据分片。

另一种选择是使用诸如DBSHARD之类的产品。dbShards是唯一在应用程序级别进行分片的分片产品。通过这种方式,您可以使用任何RDM(Postgres、MySQL等),并且仍然能够切分您的数据库,而无需在两者之间放置某种代理。许多其他分片产品依靠代理将事务指向正确的分片,但dbShards知道该去哪里,而无需“询问”任何其他人


很棒的产品

应用程序级分片可能是一个服务器场,后面有一个分片MongoDB。我仍然希望能够将租户分离出来,以便对租户进行受控的展期。我同意您的观点,即需要复杂的工具才能重新硬处理。
dbShards知道去哪里而不必“询问”其他人。
它是如何做到的?它是否保留所有可能的
用户ID->shard实例ID
映射的全局集合?顺便说一句,这个链接不再指向网站,所以我想到2020年,还有其他解决方案可用,你可以推荐哪一个?非常感谢。