使节点/ MEANjs高度可用

我可能会打开一堆蠕虫,关于可以采取多less个方向,但是我想用我的MEANjs服务器来实现高可用性/灾难恢复。

现在,我有3台服务器:

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

所以现在,如果我重启我的MongoDB服务器(或者更现实一点,由于某种原因崩溃),我突然在我的App服务器terminal中看到这个:

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

在MongoDB恢复在线之后,应用程序服务器上没有任何事情发生,直到我重新咕噜。

这种情况的最佳做法是什么? 你可以看到我使用nodeMon监视对应用程序的更改的错误。 我敢打赌,我可以让我的MongoDB服务器更新nodemon视图中的应用程序服务器上的文件来强制重启? 还是有一些其他的工具,我可以用这个? 或者我应该更加优雅地处理与数据库服务器的连接,所以应用程序不会“崩溃”?

有没有办法重新指向一个辅助mongodb万一主要不可用? 这将更容易HA / DRtypes的东西。

我想从一个侧面说明开始:鉴于问题的描述和评论,我不相信使用AWS是明智的select。 像Heroku , OpenShift或AppFog这样的PaaS提供者似乎更适合,特别是当与MongoDB服务提供者结合使用时。 在EBS上运行MongoDB对于MongoDB的新手来说可能是一个很大的挑战。 而且,只要需要预configuration的IOPS,它也相当昂贵。

注意在下面的段落中,为了易于理解,我简化了一些内容

如果你坚持自己运行,你可以select。 MongoDB本身带有自动,透明的故障转移function,称为副本集 。

最小副本集由两个数据承载节点和一个所谓的仲裁器组成。 写操作只能进入当前select“主”的节点,而读操作也是这样,除非你明确允许或请求在当前的“次要”上执行读操作。 次要不断同步到主要。 如果现在的小学生因为某种原因倒下了,那么前中学成为当选的小学生。

仲裁人在那里,因此总是有法定人数(多数是等同的),以选举现任中学为新的小学。 这个法定人数对于边缘案例来说是非常重要的,但是由于不能排除这些边缘案例,所以对于一个MongoDB副本集(留出一些特殊情况),成员数目不是很多。

这样做的好处在于,几乎所有的驱动程序和node.js都是可复制的,能够很好地处理故障转移过程。 他们只是将读写操作发送给新的主服务器,而不需要在其他任何地方进行任何更改。

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

正如你可能已经注意到的那样,仲裁者的第三个成员并没有太多的数据。 这是一个非常轻量级的过程,基本上可以运行在你能find的最便宜的实例上。

因此,如果您使用任何其他方法,则无论如何都需要两个数据承载节点,因此您可以相对容易地进行数据复制和自动,透明的故障转移,但代价是可以find最便宜的虚拟机。