设置辅助冗余故障转移 Node.JS 服务器

时间:2021-05-20 14:11:45

标签: node.js architecture raspberry-pi failover redundancy

简介

所以我制作了一个 discord bot 并将其托管在 Heroku 服务器上。机器人是基本的,它只是侦听新消息并响应它们。 我正在使用免费的 heroku 层,发现有所谓的“free dyno hours”。到了月底,所有的空闲时间都用完了,我的机器人将离线直到下个月。

我有一个 Raspberry pi,所以我认为最好将它托管在那里,以防 Heroku 离线。

我想要达到的目标

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

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

NginX(负载均衡器)

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

我对此几乎没有什么问题:

  1. 我的机器人没有收到任何请求,它只是监听 discord api。
  2. 如果使用 Nginx 的服务器出现故障,它会崩溃吗?

我的解决方案 1

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

我的解决方案 2

Heroku:

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

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

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


Heroku 也有问题(可以跳过):

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

  • Worker 用于后台作业,永远不会进入睡眠状态。
  • Web dyno 是唯一接收 HTTP 流量的 dyno。它在 30 分钟没有收到网络流量后进入睡眠状态。

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

  • 两者:我的机器人有 2 个实例。
  • Worker:无法连接到端点。
  • Web:必须至少每 30 分钟“ping”一次 api,否则机器人会休眠。

我为什么要问?

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

0 个答案:

没有答案