【问题标题】:Cloud database for Azure multi-tenant application?Azure 多租户应用程序的云数据库?
【发布时间】:2014-01-03 23:15:07
【问题描述】:

我开始将一个旧的桌面单租户应用程序移植到云中,想听听您对我的基于云的多租户应用程序的数据库有何建议?

我的基本要求很简单:

  1. 对于每个租户,其数据与任何其他租户的数据是分开的。我可以轻松备份、恢复、导出单个租户的数据,而不会影响其他租户。
  2. 我真的不想关心业务逻辑代码中的多租户。它应该看起来像安全层后面的单个租户应用程序,没有租户 ID 传递等。
  3. 使用 LINQ 等成熟技术轻松查询。
  4. 可用性和可扩展性,当然,易于设置副本、故障转移和向上和向下扩展等。

我对多租户应用程序开发进行了一些调查。我注意到 Azure 和 AWS 的 SQL 数据库都非常昂贵(仅 SQL 数据库实例的成本接近原始应用程序的许可费用),所以我绝对不能为租户使用单独的 SQL 数据库实例。

现在我正在阅读这本书Developing Multi-tenant Applications for the Cloud, 3rd Edition,它使用 Azure 存储服务来实现多租户。书还没看完,看来还是要自己处理多租户,示例代码已经过时了。

我看到很多 SO 问题将 Azure 表存储与 MongoDB 进行比较。 MongoDB 对我来说很新,不确定它是否可以轻松满足我的要求?

我也见过 RavenDB,它确实支持开箱即用的多租户。但是我没有看到一些关于如何在 Azure 应用开发中使用它的好的示例代码。

希望听到一些很棒的 SO 人的好建议。

【问题讨论】:

    标签: asp.net azure architecture multi-tenant


    【解决方案1】:

    我最好在 MongoDB 上选择 RavenDB。即使 Raven 是游戏中的新手,它也支持传统 SQL 支持的大部分功能。

    此外,要做出决策,您正在处理的数据量也是一个关键的决策指针。还有您期望的流量。

    还要记住运营成本和开发工作量。当您使用 Raven 或 Mongo 时,HA 和 DR 场景可能会出现问题,因为您需要托管它们。但是对于 Azure Storage,它默认情况下会通过维护 3 个信息副本来最大程度地保护您。

    因此,我建议您谨慎权衡,并根据您的业务需求、成本优化、开发和运营工作做出明智的选择。

    【讨论】:

    • 数据量其实并不大。该项目是一个基于云的房地产管理应用程序。用户只需要使用它来记录租赁活动和生成报表等。我认为每个用户每天只需少量交易。因为应用程序的大小很小,我希望自己不要花费太多精力来实现多租户,而是使用一些现有的工具、库,也许还有 DB。感谢您推荐乌鸦。你知道一些关于如何在 Azure 或云中使用它的好教程吗?任何建议都会很有帮助,因为我现在正在海里寻找针。
    • HA 和 DR 是什么意思?
    • HADR 表示高可用性和灾难恢复情况。假设您将数据库托管在 Azure VM 上。如果该虚拟机由于电源故障或网络连接而停机怎么办。如果整个数据中心出现故障怎么办?您可以多快恢复服务?所以当你选择云时需要考虑这样的事情。尽管 Azure 在其所有服务上为您提供 99.9 SLA,但我们仍然应该能够适应瞬态故障,因为一切都基于 REST API 调用。出于这个原因,我建议使用 Azure 表存储。
    【解决方案2】:

    为每个租户拥有一个应用程序实例是实现应用程序的一种非常昂贵的方式,但是我意识到如果开发应用程序时考虑到单个租户,那么转换成本可能会很高。

    首先我们可以从为什么您有一个桌面应用程序连接到另一个位置的数据库开始。延迟确实会减慢应用程序的速度。理想情况下,您需要一个本地安装的数据库并将其与云数据库同步,或者在您的应用程序中添加适当的缓存。

    但是数据库仍然需要区分客户端。

    为什么需要这个去云数据库?是出于备份目的,而不是在客户端机器上本地安装数据库,从多台机器访问相同的数据还是其他什么?

    除非您的应用程序非常大,否则我建议将其重写为多租户到一个 SQL Azure 数据库。在项目开始时选择的架构现在不适合您的要求。随着您的扩展,您会遇到更多问题。

    【讨论】:

    • 感谢 Adam,原来的桌面应用程序使用的是本地数据库而不是远程数据库。我的计划是编写一个云网络应用程序,以便应用程序的用户可以从任何地方访问它。而基于云的数据库当然适用于新的云应用程序。将多租户重写为一个 SQL Azure 数据库是什么意思?是使用每个表的tenantID 来区分数据吗?我只关心如何为单个用户处理备份和恢复数据而不影响其他用户。
    • 是的,这意味着在每个适用的表上都有一个tenantID。然后,您将每次都备份整个数据库,而不是针对特定用户。如果您希望人们进行自己的个人备份和恢复,那么您需要编写额外的代码来导出用户数据并再次导入/覆盖它。我不确定您的应用程序与我维护的应用程序一样需要什么,不是每个用户都要求完全恢复到以前的状态。但是,我没有在数据库中进行硬删除,而是在每一行上使用了一个已删除标志。这样就可以在需要时检索他们的特定数据。
    猜你喜欢
    • 2015-08-17
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    相关资源
    最近更新 更多