标签: multi-tenant

如何使用共享表结构创建多租户数据库?

我们的软件目前在MySQL上运行.所有租户的数据都存储在同一架构中.由于我们使用Ruby on Rails,我们可以轻松确定哪些数据属于哪个租户.然而,有些公司当然担心他们的数据可能会受到损害,因此我们正在评估其他解决方案.

到目前为止,我已经看到三个选项:

  • 多数据库(每个租户都有自己的 - 几乎与每个客户的1个服务器相同)
  • 多模式(MySQL中不可用,每个租户在共享数据库中获取自己的模式)
  • 共享架构(我们当前的方法,可能在每列上有额外的识别记录)

Multi-Schema是我最喜欢的(考虑成本).但是,创建一个新帐户并进行迁移似乎非常痛苦,因为我必须迭代所有模式并更改其表/列/定义.

问:多架构似乎被设计为每个租户的表格略有不同 - 我不希望这样.是否有任何RDBMS允许我使用多模式多租户解决方案,其中表结构在所有租户之间共享?

PS通过multi我的意思是像超多(10.000+租户).

mysql sql database-design multi-tenant

122
推荐指数
4
解决办法
6万
查看次数

MongoDB中针对多租户数据库的推荐方法是什么?

我正在考虑使用MongoDB创建一个多租户应用程序.关于我还有多少租户,我没有任何猜测,但我希望能够扩展到成千上万.

我可以想到三个策略:

  1. 同一集合中的所有租户,使用特定于租户的字段来确保安全
  2. 1单个共享数据库中每个租户的收集
  3. 每个租户1个数据库

我头脑中的声音暗示我选择2.

任何想法和影响,任何人?

multi-tenant mongodb

88
推荐指数
2
解决办法
3万
查看次数

为EACH客户端使用单个数据库有什么好处?

在为多个客户端设计的以数据库为中心的应用程序中,我一直认为为所有客户端使用单个数据库"更好" - 将记录与适当的索引和密钥相关联.在收听Stack Overflow播客时,我听到Joel提到FogBugz每个客户端使用一个数据库(所以如果有1000个客户端,则会有1000个数据库).使用这种架构有什么好处?

据我所知,对于某些项目,客户需要直接访问所有数据 - 在这样的应用程序中,很明显每个客户端都需要自己的数据库.但是,对于客户端不需要直接访问数据库的项目,每个客户端使用一个数据库有什么好处吗?似乎在灵活性方面,使用具有表的单个副本的单个数据库要简单得多.添加新功能更容易,创建报告更容易,而且管理起来更容易.

我对"所有客户的一个数据库"方法非常有信心,直到我听到Joel(一位经验丰富的开发人员)提到他的软件采用了不同的方法 - 我对他的决定感到有些困惑......

我听说人们引用数据库会因为大量记录而变慢,但任何具有一些优点的关系数据库都不会出现这个问题 - 特别是如果使用了正确的索引和键.

任何输入都非常感谢!

database database-design multi-tenant

65
推荐指数
7
解决办法
2万
查看次数

我应该为多客户端应用程序使用单个还是多个数据库设置?

我正在开发一个旨在简化公司工作流程和项目管理的PHP应用程序,让我们说像BasecampGoPlan这样的东西.

我不确定最佳方法是什么,数据库方面.我应该使用单个数据库并为每个表添加特定于客户端的列,还是应该为每个新客户端创建数据库?一个重要因素是自动化:我希望创建一个新客户端变得简单(并且可能会为自己注册).

我可以想到使用一个数据库的可能缺点:

  • 缺乏可扩展性
  • 安全问题(虽然首先不应该出现错误)

你对此有何看法?您有什么想法,上述公司最有可能选择哪种解决方案?

architecture database-design multi-tenant database-schema

61
推荐指数
8
解决办法
3万
查看次数

django上多租户应用的最优架构

我一直在思索基于Django创建多租户应用程序的正确/最佳方式.

一些解释:

  • 应用程序可以由几个租户使用(tenant1,tenant2,...,).

  • 必须保护所有租户个人数据不被其他租户(及其用户)访问.

  • 租户可以选择为应用程序对象创建其他自定义字段.

  • 当然,底层硬件限制了一个"系统"上的租户数量.

1)通过例如子域和在底层中使用特定于租户的数据库来分离每个租户

2)在模型中使用一些租户ID来分离数据库中的租户数据

我正在考虑部署过程,系统部件的性能(Web服务器,数据库服务器,工作节点,...)

什么是最好的设置?专业人士和骗子在哪里?

你怎么看?

architecture django multi-tenant

61
推荐指数
1
解决办法
6759
查看次数

使用PostgreSQL的模式和Rails创建多租户应用程序

东西我已经想通了

我正在学习如何在Rails中创建一个多租户应用程序,该应用程序根据用于查看应用程序的域或子域来提供来自不同模式的数据.

我已经回答了一些问题:

  1. 如何让subdomain-fu与域名一起使用?这是有人问同一个问题,这个问题会引导你进入这个博客.
  2. 什么数据库,它将如何构建?以下是Guy Naor的精彩演讲,以及关于PostgreSQL和模式的问题.
  3. 我已经知道我的模式都具有相同的结构.他们所拥有的数据会有所不同.那么,如何为所有模式运行迁移?这是一个答案.

这三点涵盖了我需要知道的许多一般内容.但是,在接下来的步骤中,我似乎有许多实现方法.我希望有更好,更简单的方法.

最后,对我的问题

当新用户注册时,我可以轻松创建架构.但是,加载其余模式已有的结构的最佳和最简单的方法是什么?以下是一些可能为您提供更好主意的问题/方案.

  1. 我应该将它传递给一个将公共模式转储到临时模式的shell脚本,然后将其导回到我的主数据库(就像Guy Naor在他的视频中所说的那样)?这是我从freenode上有用的#postgres获得快速摘要/脚本.虽然这可能会有效,但我必须在Rails之外做很多事情,这让我有点不舒服......这也让我想到了下一个问题.
  2. 有没有办法直接从Ruby on Rails做到这一点?就像创建一个PostgreSQL模式一样,只需将Rails数据库模式(schema.rb - 我知道,这很令人困惑)加载到PostgreSQL模式中.
  3. 有没有这些东西的宝石/插件?像"create_pg_schema_and_load_rails_schema(the_new_schema_name)"这样的方法.如果没有,我可能会做一个,但我怀疑它对所有移动部件的测试结果如何(特别是如果我最终使用shell脚本来创建和管理新的PostgreSQL模式).

谢谢,我希望不会太久!

postgresql schema ruby-on-rails multi-tenant

45
推荐指数
1
解决办法
1万
查看次数

数据库中集合数量的限制

任何人都可以说mongodb中的集合数量有任何实际限制吗?他们在这里写https://docs.mongodb.com/manual/core/data-model-operations/#large-number-of-collections:

通常,具有大量集合没有显着的性能损失,并且导致非常好的性能.

但由于某些原因,mongodb为数据库中的命名空间数量设置了限制24000,看起来它可以增加,但我想知道为什么它在默认配置中有一些限制,如果在数据库中有许多集合不会导致任何性能罚款?

这是否意味着在一个数据库中拥有几乎无限数量的集合是可行的解决方案,例如,在多租户应用程序的数据库中拥有一个帐户的一个数据集合,例如,拥有数十万个集合在数据库中?如果对于每个租户来说,为数据库提供大量的集合是可行的解决方案,那么它与一个集合中的每个租户的文档相比有什么好处呢?非常感谢您的回答.

multi-tenant mongodb

42
推荐指数
3
解决办法
3万
查看次数

多租户Django应用程序:根据请求改变数据库连接?

我正在寻找其他人尝试使用数据库级隔离来构建多租户Django应用程序的工作代码和想法.

更新/解决方案:我在一个新的开源项目中结束了解决这个问题:请参阅django-db-multitenant

目标

我的目标是在请求进入单个应用服务器(WSGI前端,如gunicorn)时根据请求主机名或请求路径多路复用请求(例如,foo.example.com/将Django连接设置为使用数据库foo,并bar.example.com/使用数据库bar).

先例

我知道Django中有一些现有的多租户解决方案:

  1. django-tenant-schemas:这非常接近我想要的:你以最高优先级安装它的中间件,并向SET search_pathdb 发送命令.不幸的是,这是Postgres特有的,我坚持使用MySQL.
  2. django-simple-multitenant:这里的策略是为所有模型添加"租户"外键,并调整所有应用程序业务逻辑以关键.基本上每一行都被索引(id, tenant_id)而不是(id).我尝试过,并且不喜欢这种方法有很多原因:它使应用程序更复杂,可能导致难以发现的错误,并且它不提供数据库级别的隔离.
  3. 每个租户一个{app server,django设置文件,其中包含适当的db}.阿卡穷人的多租户(实际上富人,考虑到它所涉及的资源).我不想为每个租户启动一个新的应用服务器,并且为了可扩展性,我希望任何应用服务器都能够为任何客户端分派请求.

思路

到目前为止,我最好的想法是做一些类似的事情django-tenant-schemas:在第一个中间件中,抓住django.db.connection并摆弄数据库选择而不是模式.在集合/持久连接方面,我还没有想过这意味着什么

我追求的另一个死胡同是特定于租户的表前缀:除了我需要它们是动态的,即使是Django中也不容易实现全局表前缀(参见被拒绝的票证5000等).

最后,Django 多数据库支持允许您定义多个命名数据库,并根据实例类型和读/写模式在它们之间进行多路复用.没有帮助,因为没有工具可以按请求选择数据库.

有没有人管理类似的东西?如果是这样,你是如何实现它的?

mysql django multi-tenant

31
推荐指数
2
解决办法
5839
查看次数

如何设计一个多租户mysql数据库

让我们说我需要设计一个数据库来托管多家公司的数据.现在出于安全和管理目的,我需要确保不同公司的数据被正确隔离,但我也不想启动10个mysql进程来托管10个不同服务器上的10家公司的数据.使用mysql数据库执行此操作的最佳方法是什么?

mysql database database-design multi-tenant

30
推荐指数
3
解决办法
2万
查看次数

如何在多租户系统中将RabbitMQ中的队列设为私有/安全?

我已经阅读了RabbitMQ提供的入门指南,甚至为stormed-amqp贡献了第六个例子,所以我对AMQP有了一些了解.

但是,该指南并不全面,可以避免身份验证和授权等问题.

我们正在设计一个多租户系统,它将在RPC类型的情况下使用RabbitMQ.RPC的这种实现可能有什么不同之处在于远程过程实际上是系统上的其他租户程序.

基本上,我想隔离数据总线,其中包括以下断言:

  1. 我们的服务器不会将数据传送到错误的租户程序(这很容易处理并且相关但不受质疑).
  2. 租户程序无法从不属于他们的队列中读取数据.
  3. 租户程序无法写入不属于他们的队列.

这个问题严格关于RabbitMQ安全性.我知道RabbitMQ支持SSL,它提供端到端加密,我知道RabbitMQ支持用户名/密码验证.我不知道这些内容是否适用于私有化队列使用(也称为ACL),即连接可能是加密的,用户可能已经过验证,但用户可以从所有队列读取/写入.

有人可以在这个更高级的主题上启发我吗?我相信RabbitMQ可以支持这种系统但不完全正面.我知道RabbitMQ中有些东西我不知道,例如什么是虚拟主机,他们会在这种情况下帮助吗?我只是没有看到当前知识中的解决方案仅限于路由密钥,队列名称和交换.

security amqp rabbitmq multi-tenant

30
推荐指数
3
解决办法
2万
查看次数