【问题标题】:Multi-tenant MongoDB + mongo-native driver + connection pooling多租户 MongoDB + mongo-native 驱动 + 连接池
【发布时间】:2019-08-07 10:01:53
【问题描述】:

我们正在尝试使用 nodejs/mongo-native 驱动程序实施以下演示文稿(幻灯片 13-18)中概述的策略。

https://www.slideshare.net/mongodb/securing-mongodb-to-serve-an-awsbased-multitenant-securityfanatic-saas-application

总结:

  • 从 node.js 创建到 mongodb 的连接池。
  • 对于租户的每个请求,从池中获取一个连接并“验证”它。使用经过身份验证的连接来处理请求。响应后,将连接返回到池中。

我能够创建一个到 mongodb 的连接池,而无需使用 mongo-native 驱动程序指定任何数据库,如下所示:

const client = new MongoClient('mongodb://localhost:27017', { useNewUrlParser: true, poolSize: 10 });

但是,为了获得一个 db 对象,我需要执行以下操作:

const db = client.db(dbName);

这是我想验证连接的地方,它是 AFAICS,此功能已从更新的 mongo 驱动程序、node.js 和 java 中弃用/删除。

根据演示,看起来这可能与旧版本的 Java 驱动程序有关。

我什至可以使用单个连接池并使用相同的连接对各个数据库的租户进行身份验证吗?

我们的替代方案是每个租户都有一个连接池,目前这对我们没有吸引力。

我们将不胜感激任何帮助,包括弃用/删除此功能的原因。

【问题讨论】:

    标签: node.js mongodb connection-pooling multi-tenant node-mongodb-native


    【解决方案1】:

    是幻灯片上的我!! :) 我记得那次会议,很有趣。

    是的,它不再起作用了,他们在我们实施它 6 个月后就取消了这个宏伟的功能,当时我们还在 Beta 版中使用它。我们必须改变我们的工作方式..

    很遗憾,直到今天,在 Mongo 中,“连接”(网络内容、SSL、集群标识)和身份验证都是两个独立的操作。 想想当你运行 mongo shell 时,你提供了主机、端口、副本集(如果有的话)以及你的连接!但未认证。然后,您可以对 user1 进行身份验证,做一些事情,然后对 user2 进行身份验证并做只有 user2 可以做的事情。这是在同一个连接上完成的!无需再次创建通道、SSL 握手等开销......

    那时,驱动程序让我们拥有一个“空白”连接的连接池,我们可以在当前执行线程的上下文中随意对当前租户进行身份验证。

    然后他们弃用了此功能,我认为是在 Mongo 2.4 中。现在他们只支持在创建时经过身份验证的连接。我们询问了企业支持,他们没有说明原因,但在我看来,他们发现这种方式不安全,“旧”身份验证可能会泄漏,停留在“不是那么空白”的可重用连接上。

    我们对多租户基础设施实施进行了更改,从大型空白连接池变为许多(小型)经过身份验证的连接池,每个租户一个池。每个租户的这些池可能非常小,例如 3 或 5 个连接。该解决方案可以很好地扩展到数百个租户,但为了满足数千个租户,我们必须进行各种优化以根据需要创建池、在空闲时间后关闭它们、为非活动或休眠租户延迟创建等。这允许我们扩大规模...我们仍在寻找解决方案和优化。

    您总是可以返回到一个经过身份验证的全局连接池,连接到可以访问多个数据库的 Mongo 用户。是的,您可以在同一个经过身份验证的连接上切换数据库。您只是无法切换身份验证.. 这是一个纯 Mongo Java 驱动的例子,我们使用了提供类似功能的 Spring:

    MongoClient mongoClient = new MongoClient();
    DB cust1db = mongoClient.getDB("cust1");
    cust1db.get...
    DB cust2db = mongoClient.getDB("cust2");
    cust2db.get...
    

    有点相关,我建议查看 MongoDB 静态加密,这是一项企业功能。根据不同的密钥加密每个数据库(每个客户)的唯一方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      相关资源
      最近更新 更多