我们的软件目前在MySQL上运行.所有租户的数据都存储在同一架构中.由于我们使用Ruby on Rails,我们可以轻松确定哪些数据属于哪个租户.然而,有些公司当然担心他们的数据可能会受到损害,因此我们正在评估其他解决方案.
到目前为止,我已经看到三个选项:
Multi-Schema是我最喜欢的(考虑成本).但是,创建一个新帐户并进行迁移似乎非常痛苦,因为我必须迭代所有模式并更改其表/列/定义.
问:多架构似乎被设计为每个租户的表格略有不同 - 我不希望这样.是否有任何RDBMS允许我使用多模式多租户解决方案,其中表结构在所有租户之间共享?
PS通过multi我的意思是像超多(10.000+租户).
我正在考虑使用MongoDB创建一个多租户应用程序.关于我还有多少租户,我没有任何猜测,但我希望能够扩展到成千上万.
我可以想到三个策略:
我头脑中的声音暗示我选择2.
任何想法和影响,任何人?
在为多个客户端设计的以数据库为中心的应用程序中,我一直认为为所有客户端使用单个数据库"更好" - 将记录与适当的索引和密钥相关联.在收听Stack Overflow播客时,我听到Joel提到FogBugz每个客户端使用一个数据库(所以如果有1000个客户端,则会有1000个数据库).使用这种架构有什么好处?
据我所知,对于某些项目,客户需要直接访问所有数据 - 在这样的应用程序中,很明显每个客户端都需要自己的数据库.但是,对于客户端不需要直接访问数据库的项目,每个客户端使用一个数据库有什么好处吗?似乎在灵活性方面,使用具有表的单个副本的单个数据库要简单得多.添加新功能更容易,创建报告更容易,而且管理起来更容易.
我对"所有客户的一个数据库"方法非常有信心,直到我听到Joel(一位经验丰富的开发人员)提到他的软件采用了不同的方法 - 我对他的决定感到有些困惑......
我听说人们引用数据库会因为大量记录而变慢,但任何具有一些优点的关系数据库都不会出现这个问题 - 特别是如果使用了正确的索引和键.
任何输入都非常感谢!
我一直在思索基于Django创建多租户应用程序的正确/最佳方式.
一些解释:
应用程序可以由几个租户使用(tenant1,tenant2,...,).
必须保护所有租户个人数据不被其他租户(及其用户)访问.
租户可以选择为应用程序对象创建其他自定义字段.
当然,底层硬件限制了一个"系统"上的租户数量.
1)通过例如子域和在底层中使用特定于租户的数据库来分离每个租户
2)在模型中使用一些租户ID来分离数据库中的租户数据
我正在考虑部署过程,系统部件的性能(Web服务器,数据库服务器,工作节点,...)
什么是最好的设置?专业人士和骗子在哪里?
你怎么看?
我正在学习如何在Rails中创建一个多租户应用程序,该应用程序根据用于查看应用程序的域或子域来提供来自不同模式的数据.
我已经回答了一些问题:
这三点涵盖了我需要知道的许多一般内容.但是,在接下来的步骤中,我似乎有许多实现方法.我希望有更好,更简单的方法.
当新用户注册时,我可以轻松创建架构.但是,加载其余模式已有的结构的最佳和最简单的方法是什么?以下是一些可能为您提供更好主意的问题/方案.
谢谢,我希望不会太久!
任何人都可以说mongodb中的集合数量有任何实际限制吗?他们在这里写https://docs.mongodb.com/manual/core/data-model-operations/#large-number-of-collections:
通常,具有大量集合没有显着的性能损失,并且导致非常好的性能.
但由于某些原因,mongodb为数据库中的命名空间数量设置了限制24000,看起来它可以增加,但我想知道为什么它在默认配置中有一些限制,如果在数据库中有许多集合不会导致任何性能罚款?
这是否意味着在一个数据库中拥有几乎无限数量的集合是可行的解决方案,例如,在多租户应用程序的数据库中拥有一个帐户的一个数据集合,例如,拥有数十万个集合在数据库中?如果对于每个租户来说,为数据库提供大量的集合是可行的解决方案,那么它与一个集合中的每个租户的文档相比有什么好处呢?非常感谢您的回答.
我正在寻找其他人尝试使用数据库级隔离来构建多租户Django应用程序的工作代码和想法.
更新/解决方案:我在一个新的开源项目中结束了解决这个问题:请参阅django-db-multitenant
我的目标是在请求进入单个应用服务器(WSGI前端,如gunicorn)时根据请求主机名或请求路径多路复用请求(例如,foo.example.com/
将Django连接设置为使用数据库foo
,并bar.example.com/
使用数据库bar
).
我知道Django中有一些现有的多租户解决方案:
SET search_path
db 发送命令.不幸的是,这是Postgres特有的,我坚持使用MySQL.(id, tenant_id)
而不是(id)
.我尝试过,并且不喜欢这种方法有很多原因:它使应用程序更复杂,可能导致难以发现的错误,并且它不提供数据库级别的隔离.到目前为止,我最好的想法是做一些类似的事情django-tenant-schemas
:在第一个中间件中,抓住django.db.connection
并摆弄数据库选择而不是模式.在集合/持久连接方面,我还没有想过这意味着什么
我追求的另一个死胡同是特定于租户的表前缀:除了我需要它们是动态的,即使是Django中也不容易实现全局表前缀(参见被拒绝的票证5000等).
最后,Django 多数据库支持允许您定义多个命名数据库,并根据实例类型和读/写模式在它们之间进行多路复用.没有帮助,因为没有工具可以按请求选择数据库.
有没有人管理类似的东西?如果是这样,你是如何实现它的?
让我们说我需要设计一个数据库来托管多家公司的数据.现在出于安全和管理目的,我需要确保不同公司的数据被正确隔离,但我也不想启动10个mysql进程来托管10个不同服务器上的10家公司的数据.使用mysql数据库执行此操作的最佳方法是什么?
我已经阅读了RabbitMQ提供的入门指南,甚至为stormed-amqp贡献了第六个例子,所以我对AMQP有了一些了解.
但是,该指南并不全面,可以避免身份验证和授权等问题.
我们正在设计一个多租户系统,它将在RPC类型的情况下使用RabbitMQ.RPC的这种实现可能有什么不同之处在于远程过程实际上是系统上的其他租户程序.
基本上,我想隔离数据总线,其中包括以下断言:
这个问题严格关于RabbitMQ安全性.我知道RabbitMQ支持SSL,它提供端到端加密,我知道RabbitMQ支持用户名/密码验证.我不知道这些内容是否适用于私有化队列使用(也称为ACL),即连接可能是加密的,用户可能已经过验证,但用户可以从所有队列读取/写入.
有人可以在这个更高级的主题上启发我吗?我相信RabbitMQ可以支持这种系统但不完全正面.我知道RabbitMQ中有些东西我不知道,例如什么是虚拟主机,他们会在这种情况下帮助吗?我只是没有看到当前知识中的解决方案仅限于路由密钥,队列名称和交换.
multi-tenant ×10
mysql ×3
architecture ×2
database ×2
django ×2
mongodb ×2
amqp ×1
postgresql ×1
rabbitmq ×1
schema ×1
security ×1
sql ×1