【问题标题】:What is the recommended approach towards multi-tenant databases in Cassandra?Cassandra 中多租户数据库的推荐方法是什么?
【发布时间】:2019-04-23 17:39:03
【问题描述】:

我正在考虑使用 Apache Cassandra 创建一个多租户应用程序。

我能想到三个策略:

  1. 同一密钥空间中的所有租户使用租户特定字段来确保安全
  2. 单个共享数据库中每个租户的表
  3. 每个租户的密钥空间

我脑海中的声音建议我选择选项 3。

想法和启示,有人吗?

【问题讨论】:

  • 不知道为什么 Spring-Data-Cassandra 被标记在这里,因为这个问题与它无关。但我会说你真的应该使用 DataStax Java 驱动程序。 Spring-Data-Cassandra 驱动程序使用大批量和非绑定查询来模仿关系世界的一些功能。所以 Spring-Data-Cassandra 在我的书中是明确的no;尤其是在多租户集群中。
  • 支持不使用 spring-data-cassandra :-)
  • 多少租户?
  • 预计会有 40 多个租户

标签: cassandra cassandra-2.0 cassandra-3.0 spring-data-cassandra


【解决方案1】:

您需要考虑以下几点:

选项 1:在纯 Cassandra 中,此选项仅在始终通过“代理”访问数据库时才有效 - 例如,API 将强制对租户字段进行过滤。否则,如果您提供 CQL 访问,那么每个人都可以读取所有数据。在这种情况下,您还需要仔细创建数据模型,将租户作为复合分区键的一部分。 DataStax Enterprise (DSE) 具有称为 row-level access control (RLAC) 的附加功能,允许在表级别设置权限。

选项 2 和 3:非常相似,除了当您拥有每个租户的密钥空间时,您可以灵活地设置不同的复制策略 - 这对于将客户的数据存储在绑定到不同地理区域的不同数据中心中可能很有用。但在这两种情况下,集群中的表数量都有限制——合理的表数量约为 200,“硬停止”超过 500。原因——您需要额外的资源,例如内存,以保持辅助每个表的数据结构(bloom 过滤器等),这将消耗堆内存和堆外内存。

【讨论】:

  • 感谢您的建议。如果您有任何关于 Cassandra 与选项 3 的多租户的工作示例,请分享。
  • 这只是标准的 Cassandra 功能 - 您可以创建密钥空间并配置数据中心
【解决方案2】:

我已经在零售领域大规模地这样做了几年。因此,我认为 推荐 在 Cassandra 中处理多租户的方法是。不管你怎么做,租户都会被“吵闹的邻居”问题所困扰。只需等到一个租户运行 BATCH 更新,将 60k 写入批量写入同一个表,其他人的性能就会下降。

但更大的问题是,您无法保证每个租户的读写比率相似。事实上,它们可能会完全不同。这对于选项 #1 和 #2 来说将是一个问题,因为磁盘 IOP 将进入同一目录。

选项#3 确实是唯一可行的方法。但同样,只需要一个考虑不周的 BATCH 写来粉碎所有人。另外,想升级您的集群吗?现在您必须与多个团队进行协调,而不仅仅是一个团队。使用 SSL?确保多个团队获得正确的证书,而不仅仅是一个。

当我们有新团队使用 Cassandra 时,每个团队都有自己的集群。这样一来,他们就不会伤害其他任何人,而且我们可以用更少的问号来支持他们,即谁在做什么。

【讨论】:

    猜你喜欢
    • 2011-02-14
    • 2016-01-02
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2012-07-27
    • 2019-05-16
    相关资源
    最近更新 更多