使节点/ MEANjs高度可用

时间:2016-04-13 20:43:49

标签: node.js mongodb meanjs

我可能会开放一堆蠕虫,关于可以使用多少数百个方向 - 但是我想要MEANjs服务器进行高可用性/灾难恢复。

现在,我有3台服务器:

  • MongoDB
  • App(Grunt'主要应用程序,这是前端 服务器)
  • 用于后端其他处理的第三台服务器

所以目前,如果我重新启动我的MongoDB服务器(或者更现实,它因某些原因而崩溃),我突然在我的App服务器终端中看到了这个:

  

MongoDB连接错误:错误:无法连接   [172.30.3.30:27017] [nodemon]应用程序崩溃 - 等待文件更改   在开始之前......

MongoDB重新上线后,应用服务器上没有任何反应,直到我重新开始。

这种情况的最佳做法是什么?您可以在错误中看到我使用nodeMon监控应用程序的更改。我打赌我可以让我的MongoDB服务器在nodemon的视图中更新app服务器上的文件以强制重启?或者我可以使用其他工具吗?或者我应该更优雅地处理与数据库服务器的连接,以便应用程序不会崩溃"?

如果主要不可用,有没有办法重新指向辅助mongodb?这更适合HA / DR类型的东西。

1 个答案:

答案 0 :(得分:2)

我想从旁注开始:鉴于问题中的描述及其评论,我不相信使用AWS是明智的选择。像HerokuOpenShiftAppFog这样的PaaS提供商似乎更合适,尤其是与MongoDB服务提供商合并时。当您不熟悉MongoDB时,在EBS上运行MongoDB可能是一个非常大的挑战。一旦您需要配置的IOPS,它也非常昂贵。

  

注意在以下段落中,为了便于理解,我简化了一些事情

但是,如果您坚持自行运行,则可以选择。 MongoDB本身带有自动,透明的故障转移方法,称为a replica set

最小副本集由两个数据承载节点和一个所谓的仲裁器组成。写操作仅转到当前选为“primary”的节点,并且读取也是如此,除非您明确允许或请求在当前“secondary”上执行读取操作。中学不断与初级同步。如果由于某种原因当前的小学成为堕落,那么前者将成为主要的中学。

仲裁者在那里,总是有一个法定人数(合格的多数将是一个等同的术语)成员选举当前的二级成为新的主要成员。此仲裁对于边缘情况非常重要,但由于您无法排除这些边缘情况,因此对于MongoDB副本集来说,成员数量不均匀是很困难的(除了一些特殊情况)。

这样做的好处在于,几乎所有驱动程序和node.js都可以识别副本集并且非常优雅地处理故障转移过程。它们只是将读取和写入发送到新的主数据库,而无需在任何其他点进行任何更改。

您只需要在故障转移过程中处理某些情况。在没有详细介绍的情况下,您基本上会检查相应回调中的某些错误并重做操作,如果遇到其中一个错误并重做操作是可行的。

您可能已经注意到,第三个成员(仲裁者)没有太多数据。它是一个非常轻量级的过程,基本上可以在你能找到的最便宜的实例上运行。

因此,您可以相对轻松地进行数据复制和自动,透明的故障转移,代价是您可以找到的最便宜的VM,因为如果您使用任何其他方法,无论如何都需要两个数据承载节点。