繁体   English   中英

MongoDB在多个AWS实例中进行负载平衡

[英]MongoDB load balancing in multiple AWS instances

我们将amazon Web服务用于使用node.js服务器和mongodb作为数据库的业务应用程序。 目前,node.js服务器正在EC2媒体实例上运行。 我们将mongodb数据库保存在一个单独的微实例中。 现在我们想在我们的mongodb数据库中部署副本集,这样如果mongodb被锁定或不可用,我们仍然可以运行我们的数据库并从中获取数据。

因此,我们试图将副本集的每个成员保留在不同的实例中,这样即使主要的memeber实例关闭,我们也可以从数据库中获取数据。

现在,我想在数据库中添加负载均衡器,以便即使在一次巨大的流量负载下数据库也能正常工作。 在这种情况下,我可以通过在replicaSet中添加slaveOK配置来读取数据库的平衡。 但是,如果数据库中的写入操作存在巨大的流量负载,它将不会对数据库进行负载平衡。

为了解决这个问题,到目前为止我有两个选择。

选项1:我要对数据库进行分片并将每个分片保存在单独的实例中。 在每个分片下,将在同一个实例中设置一个reaplica。 但是存在一个问题,因为分片将数据库分成多个部分,因此每个分片都不会在其中保留相同的数据。 因此,如果一个实例关闭,我们将无法从该实例中的分片访问数据。

为了解决这个问题,我试图在分片中划分数据库,每个分片在不同的实例中都有一个replicaSet。 因此,即使一个实例关闭,我们也不会遇到任何问题。 但是如果我们有两个分片,每个分片在replicaSet中有3个成员,那么我需要6个aws实例。 所以我认为这不是最佳解决方案。

选项2:我们可以在mongodb中创建一个主 - 主配置,这意味着所有数据库都是主数据库,并且所有数据库都具有读/写访问权限,但我也希望它们每隔一段时间自动同步一次,所以他们最终都成了彼此的克隆人。 所有这些主要数据库都将在不同的实例中。 但我不知道mongodb是否支持这种结构。

对于这种情况,我没有任何mongodb doc / blog。 所以,请建议我应该是这个问题的最佳解决方案。

到目前为止,这不是一个完整的答案,有太多的细节,我可以像其他许多人一样写一篇关于这个问题的整篇文章,因为我没有那么多的时间,我会补充一些评论关于我所看到的。

现在,我想在数据库中添加负载均衡器,以便即使在一次巨大的流量负载下数据库也能正常工作。

副本集的设计并非如此。 如果你想加载平衡,你实际上可能正在寻找分片,这将允许你这样做。

复制用于自动故障转移。

在这种情况下,我可以通过在replicaSet中添加slaveOK配置来读取数据库的平衡。

因为,为了保持最新状态,您的成员将获得与初级操作一样多的操作,看起来这可能没有太大帮助。

实际上,不是让一台服务器有多个连接排队,而是在许多服务器上排队等待过时数据,因为成员一致性是最终的,而不是像ACID技术那样直接,但是,据说它们最终只有32多毫秒的一致性。意味着如果主要装载,它们不会滞后以提供适当的吞吐量。

由于读取是并发的,无论您是从主要还是次要读取,都将获得相同的速度。 我想你可以延迟一个奴隶来创建一个暂停的OP,但这会带来大量过时的数据。

更不用说MongoDB不是多主机,因此你只能写一个节点一次使slaveOK不再是世界上最有用的设置而且我已经看过很多次10gen自己建议你在这个设置上使用分片。

选项2:我们可以在mongodb中创建主 - 主配置,

这需要您自己编码。 此时您可能需要考虑实际使用支持http://en.wikipedia.org/wiki/Multi-master_replication的数据库

这是因为你正在寻找的速度很可能实际上是在写入而不是如上所述的读取。

选项1:我要对数据库进行分片并将每个分片保存在单独的实例中。

这是推荐的方式,但你已经发现了它的警告。 遗憾的是,多主复制应该解决的问题尚未解决,但是,多主复制确实会将自己的瘟疫大鼠添加到欧洲本身,我强烈建议您在考虑之前是否进行了一些认真的研究。 MongoDB目前无法满足您的需求。

您可能不必担心任何事情,因为fsync队列旨在处理IO瓶颈,这会减慢您的写入速度,就像在SQL中一样,并且读取是并发的,因此如果您计划架构和工作正确,您应该能够获得大量OP的数量。

事实上,这里有一个10gen员工的相关问题非常好读: https//stackoverflow.com/a/17459488/383478它显示了MongoDB在负载下可以实现的吞吐量。

它将很快通过已经在dev分支中的新文档级锁定来增长。

选项1是@Sammaye指出的推荐方式,但您不需要6个实例,并且可以使用4个实例进行管理。

假设您需要以下配置。

  • 2个碎片(S1,S2)
  • 每个分片1个副本(副本集辅助)(RS1,RS2)
  • 每个碎片1个仲裁器(RA1,RA2)

然后,您可以将服务器配置划分如下。

Instance 1 : Runs : S1 (Primary Node)
Instance 2 : Runs : S2 (Primary Node)
Instance 3 : Runs : RS1 (Secondary Node S1) and RA2 (Arbiter Node S2)
Instance 4 : Runs : RS2 (Secondary Node S2) and RA1 (Arbiter Node S1)

您可以运行仲裁节点以及辅助节点,这将有助于您在故障转移期间进行选举。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM