Brewers CAP 定理是了解您可以使用哪些选项的最佳来源。我可以说这一切都取决于,但如果我们谈论 Mongo,那么它提供了开箱即用的水平可扩展性,并且在某些情况下总是很好。
现在关于一致性。实际上,您可以通过三种方式使数据保持最新:
1)首先要考虑的是“安全”模式或 Andreas 指出的“getLastError()”。如果您发出“安全”写入,您就知道数据库已收到插入并应用了写入。但是,MongoDB 仅每 60 秒刷新一次磁盘,因此服务器可能会在磁盘上没有数据的情况下发生故障。
2)第二件事要考虑的是“日志”(v1.8+)。打开日记功能后,每 100 毫秒将数据刷新到日志中。所以你在失败之前有一个更小的时间窗口。驱动程序有一个比“安全”更进一步的“fsync”选项(检查该名称),它等待确认数据已刷新到磁盘(即日志文件)。但是,这仅涵盖一台服务器。如果服务器上的硬盘死了会发生什么?那么你需要第二个副本。
3)要考虑的第三件事是复制。驱动程序支持“W”参数,表示“将此数据复制到 N 个节点”,然后再返回。如果在某个超时之前写入没有到达“N”个节点,则写入失败(抛出异常)。但是,您必须根据副本集中的节点数正确配置“W”。同样,由于硬盘驱动器可能会发生故障,即使使用日记功能,您也需要查看复制。然后是跨数据中心的复制,这太长了,无法进入这里。最后要考虑的是您对“回滚”的要求。据我了解,MongoDB 没有这种“回滚”能力。如果您正在执行批量插入,您将得到的最好结果是指示哪些元素失败。
无论如何,当数据一致性成为开发人员的责任时,有很多场景,您需要小心并包括所有场景并调整数据库模式,因为在 Mongo 中没有像我们这样的“这是正确的方法”习惯于在 RDB-s 中。
关于内存——这完全是一个性能问题,MongoDB 将索引和“工作集”保存在 RAM 中。通过限制您的 RAM,您可以限制您的工作集。您实际上可以拥有 SSD 和更少量的 RAM,而不是大量的 RAM 和 HDD - 至少这些是官方建议。无论如何,这个问题是个人的,您应该针对您的特定用例进行性能测试