首页 > 解决方案 > 设置辅助冗余故障转移 Node.JS 服务器

问题描述

介绍

所以我制作了一个不和谐的机器人并将其托管在 Heroku 服务器上。该机器人是基本的,它只是收听新消息并做出响应。我正在使用免费的 heroku 层,发现有所谓的“免费测功时间”。到了月底,所有的空闲时间都用完了,我的机器人将离线到下个月。

我拥有一个 Raspberry pi,因此我认为将它托管在此处也是一个好主意,以防 Heroku 离线。

我想要达到的目标

  1. 在托管平台(Heroku)上托管不和谐机器人。
  2. 使用我的树莓派作为故障转移服务器。
  3. 确保一次只运行一个机器人实例。
  4. 如果两台服务器都在线 Heroku(被选为主服务器)具有优先权。
  5. 如果 Heroku 上的应用程序以某种方式崩溃或脱机,我的 Raspberry 上的机器人就会被激活。反之亦然。

如果我有 3 台或更多服务器,那将如何工作?
如果我将机器人连接到数据库,我将如何处理这个问题?
如果提供更通用的解决方案,这只是一个示例,我将不胜感激。

NginX(负载均衡器)

在寻求帮助时,我遇到了负载均衡器和 NginX。如果我是对的,它基本上就像一个网关,所有请求都发送到托管 NginX 的服务器,然后它们被重定向到许多服务器之一(取决于它们的负载程度等)。

我对此有一些问题:

  1. 我的机器人没有收到任何请求,它只是听不和谐的 api。
  2. 如果 Nginx 的服务器出现故障,一切都会崩溃?

我的解决方案 1

我的第一种方法是让机器人同时在 Heroku 和 Raspberry 上运行。如果另一台服务器出现故障,它可以保证机器人至少在一台服务器上运行。但这并不理想,因为当两台服务器都启动时,机器人会响应 2 次。

我的解决方案 2

赫罗库:

我在机器人应用程序中添加了一个带有 express.js 的简单 Rest api 端点。这样我可以检查 Heroku 上的机器人是否正在运行。

Raspberry pi: 我用这个 Node 程序包装了机器人应用程序,它的功能基本上就像一个开关。
链接到 git 存储库:https
://github.com/Matyanson/secondary-node-server.git 程序每 3 分钟调用一次端点,然后通过查看状态代码检查应用程序是否已关闭。然后它要么启动应用程序,要么关闭 raspberry 上的应用程序(使用 pm2)。

这有点工作,但我相信有更好的解决方案!


Heroku也有一个问题(你可以跳过这个):

Heroku 使用Dynos(容器)来运行应用程序。dynos有不同的配置,包括“Web”和“Worker”。

我可以打开/关闭其中任何一个。

我为什么要问?

不是因为我需要解决这个确切的问题,而是因为我想学习一种很好的方法来在未来的项目中使用它。我也认为这将是不 100% 依赖外部托管服务提供商的好方法。

标签: node.jsarchitectureraspberry-pifailoverredundancy

解决方案


推荐阅读