AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 59980
Accepted
AJB
AJB
Asked: 2014-03-02 18:13:37 +0800 CST2014-03-02 18:13:37 +0800 CST 2014-03-02 18:13:37 +0800 CST

如何使用 MongoDB 创建高效、可扩展、多租户的数据层?[关闭]

  • 772
关闭。这个问题需要更加集中。它目前不接受答案。

想改进这个问题?更新问题,使其仅通过编辑此帖子专注于一个问题。

8年前关闭。

改进这个问题

我正在为我即将推出的 Project Mangement 应用程序(例如)开发架构,并且我正在寻求明确如何最好地设计 MongoDB 数据层,特别是多租户。该应用程序将有多个“子应用程序”(例如日历、任务列表、媒体、团队等),每个子应用程序将映射到数据库中的一个集合(集中式数据库或它自己的项目数据库)。

数据库服务器 == 副本集。

问题

  1. 我应该使用一个巨大的集中式数据库来存储所有应用程序数据,还是为系统上创建的每个项目创建一个单独的数据库?
  2. 如果我选择单独的数据库策略,考虑到数据库“自然地”分散在多台服务器上,从而“自然地”将负载分散到多台服务器上,这是否消除了对数据层进行分片的需要?该应用程序将包含告诉它哪个服务器访问任何给定项目的数据的逻辑。
  3. 为每个项目使用单独的数据库是否会给我带来更好的性能(假设要查找任何给定的文档,Mongo 最多只需要在单独的项目数据库中搜索几千个文档,而在一个巨大的集中式数据库中可能会搜索数百万个文档)?
  4. 是否有可能减少 MongoDB 数据库的 32M 最小占用空间?我已经阅读了--smallfiles 手册中的文档,但这并没有真正回答我的问题。这是一个硬性的最低要求吗?
  5. 如果任何给定项目收到大量流量并成为“吵闹的邻居”,解决方案是否只是启动新的数据库服务器并将该项目移至新服务器?还是对容纳嘈杂邻居的数据库服务器进行分片以提高该服务器的性能是否是一种更好的方法?
  6. 对于为任何给定的已删除项目清理空间和/或“收缩包装”每个数据库以尽量减少它的足迹,以接近存储在任何给定项目数据库中的实际数据量,我会有什么“维护”问题?
  7. 对于必须在所有项目数据库中“推出”的数据“模式”的未来变化,我应该注意哪些问题?鉴于 Mongo 是“少模式”,假设如果我想向任何给定的 Collection 添加一个新的“字段”,我会在应用程序逻辑中这样做,而不必对数据库进行任何更新,这是否正确?他们自己?
  8. 我将使用哪些 MongoDB“工具”来获取有关任何给定数据库服务器的当前“状态”的信息?
  9. 我应该注意的任何给定数据库服务器上可以容纳的数据库数量是否有任何限制?
  10. 单个数据库策略如何影响备份?在跨许多数据库服务器备份(到 S3 以进行灾难恢复)许多数据库时,我应该注意哪些问题?

应用程序堆栈

Ubuntu 12.04 LTS
Nginx
node.js
express.js
MongoDB

目前的工作策略

我目前的工作策略是使用一个数据库来存储更高级别的“全局”数据,例如用户、通知、消息、使用情况和首选项。然后为系统上创建的每个项目创建一个新数据库。

出于多种原因,这似乎是一种理想的方法:安全性(每个数据库都有自己的凭据)、灾难性恢复(因为如果一个数据库服务器出现故障,整个应用程序不会出现故障)和性能(我认为,因为 Mongo 会搜索更少的文档来找到它正在寻找的文档)。

该应用程序将包含自动检测任何给定数据库服务器上的可用空间并在下一个可用数据库服务器上创建新项目数据库的逻辑。

根据MongoHQ 提供的这篇文章,这是“最佳”策略,尽管它会消耗大量存储空间。特别是因为每个数据库即使是空的也要占用 32M。如果您提供获得 Techcrunch 的“免费增值”应用程序,使用 MongoHQ 之类的服务会变得非常昂贵。

因此,在 ProjectManager 在系统上有三个项目的情况下,我的数据层将如下所示:

ProjectManager
  Users
  Notifications
  Messages
  Usage
  Preferences

Project01
  Calendar
  Tasks
  Media
  Team

Project02
  Calendar
  Tasks
  Media
  Team

Project03
  Calendar
  Tasks
  Media
  Team

上面的每个 ProjectXX DB 都会很小。每个最多存储大约 2000-3000 个文档。

提前感谢您的任何见解。

mongodb multi-tenant
  • 1 1 个回答
  • 9740 Views

1 个回答

  • Voted
  1. Best Answer
    sysadmin1138
    2014-03-03T05:25:07+08:002014-03-03T05:25:07+08:00

    要记住几件事:

    • 在大范围内有效的东西在小范围内并不总是有效的。
    • 当你达到那个规模时,你认为你大规模需要的东西往往不是你真正需要的。
    • 最佳性能是特定于应用程序的,而不是通用的。最适合您的应用程序的可能不是最适合我的应用程序的。
    • 所有无模式意味着数据库系统在您更改它时不会与您发生冲突。您的应用程序代码仍然有一个您必须设计的架构。
      • 添加新字段?Mongo 不在乎,只有您的应用程序逻辑在乎。
      • 将字段从单值更改为多值?蒙哥不在乎。但是你的代码中的函数肯定会。您需要构建数据迁移路径,或设计您的代码来处理这两种情况。
    • 当您需要扩展您的服务器足迹时,操作限制(例如您能负担得起的 AWS 实例)将成为驱动因素。

    鉴于此,在您现在构建系统时需要遵循一些设计模式。这些项目将使以后的扩展更容易,具体取决于您在此过程中学到的东西。

    现在
    分片 这迫使您开始考虑好的分片键,因为分片键是您的非模式的一部分,以后很难改变。在这一点上,您不是为了性能而分片,而是现在分片以确保您的代码可以处理它,并在几个里程碑之后引导性能问题。

    立即设计多数据库支持
    如果您预计您需要多个数据库,甚至多个 Mongo 数据库集群,那么在早期阶段构建数据本地性将有助于稍后将其放入。现在它可能都在一个集群中,所有项目/任务/日历/用户都在同一个三个 MongoD 实例中,但是当您了解到 Calendars 数据库正在减慢一切并需要移动到 SSD 支持的实例时,您可以那改变就容易多了。

    数据库压缩只在某些情况下很重要
    因为数据库文件本身是映射的,只要您的存储子系统很好地处理随机 I/O,2GB 数据库文件包含 200MB 数据库实际上不会影响性能。此外,压缩会使节点离线一段时间,这可能会对正常操作产生重大影响。此外,如果您从不删除文档,则不必担心压缩。

    了解使用分离的集合和分离的数据库会得到什么
    同一个数据库中的集合共享相同的数据库锁,它们在每个版本的 MongoDB 中都在稳步减少。
    同一实例中的数据库彼此共享 I/O,并且仍然存在极少数 Global Lock 事件。

    索引很重要
    如果您没有足够的 RAM 来至少将索引保存在内存中,那么性能将会非常糟糕。根据您获得的大小,您最终可能会分片或拆分集合,以便获得能够再次适合 RAM 的索引。这是多租户可能成为问题的一个领域;如果您在单个集合中有一些大型未使用的租户,则所有这些索引都必须保存在 RAM 中以使整个系统运行。如果您根据租户拆分集合,则可以将未使用的索引分页而不会受到任何惩罚。

    • 8

相关问题

  • Mongo Map-Reduce 还是分片?

  • 使用集群设置 Mongo

  • MongoDB 的 find 和 findone 调用之间的区别

  • 分片对小集合有效吗?

  • 关于操作/管理 MongoDB 的良好资源

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve