1

我有一个写入量非常低的应用程序。因此,我有兴趣部署一个 mongo 安装,以最大限度地提高我拥有的硬件的读取吞吐量(一个位置的 3 个数据库服务器)。我真的不关心冗余(备份),但想要自动故障转移。此外,我对“最终一致性”很好,并且不介意是否返回不是最新数据的数据。

我研究了分片和副本集,据我所知,我真的不需要使用分片,因为它的好处更适合具有大量写入的应用程序。因此,我继续在我拥有的三台服务器上安装了一个副本集,然后我将读取首选项设置为“最近”,因为这将允许在任何服务器上进行读取。

问题是,我后来读到客户端是“粘性的”,基本上一旦它选择了一个“最近的”mongo 服务器,就不太可能改变它。此外,即使再次“检查最近”,它也可能会选择相同的。这几乎导致了主动/被动配置,没有任何负载平衡。我确实有两个应用程序服务器,所以如果他们选择不同的 mongo 服务器,它可能会正常工作,但是如果我想在副本集中有 3 个以上的 mongo 服务器,那么除了特定两个之外的任何服务器都是被动的。

基本上我的问题是,为我的部署进行主动/主动配置的最佳方式是什么?我想要的只是请求转到免费的 mongo 服务器而不是繁忙的服务器。

我想到的强制执行此操作的一种方法是创建三个分片集群(每台服务器参与所有三个),其中每台服务器都是其中一个集群中的主服务器 - 但这仍然不是最佳的,因为除了涉及的相对复杂性之外在这种配置中,这也不能保证完全的负载平衡(例如,如果给定时刻的所有请求都碰巧到达一个特定的分片)。

实现我想要的正确方法是什么?如果无法使用 mongo 实现这种负载平衡,您会建议我使用 sharded-clusters 解决方案吗?

4

1 回答 1

3

正如您已经怀疑的那样,缩放读取不是“一刀切”的问题。一切都取决于您的数据、您的访问模式、您的要求以及可能只有您可以确定的其他一些事情。

简而言之,要考虑的主要事情是为什么单个服务器无法处理您的读取负载。如果是因为数据集的大小和索引的大小,那么将数据分片到三个分片将减少每个分片的 RAM 需求(或者换句话说,将为您提供所有三个系统的组合 RAM) . 只要您选择一个好的分片键(将负载大致均匀地分布在所有系统中的分片键),您将获得几乎三倍于目标查询的吞吐量。

如果读取的主要要求是尽可能减少读取数据的延迟,那么副本集可以满足您的目的,从“最近”节点读取将减少网络往返时间而不改变持续时间MongoDB服务器上的操作。这假设您的写入频率足够低,或者您的应用程序可以容忍可能过时的数据。

于 2013-06-04T14:21:30.173 回答