node.js - 设置辅助冗余故障转移 Node.JS 服务器
问题描述
介绍
所以我制作了一个不和谐的机器人并将其托管在 Heroku 服务器上。该机器人是基本的,它只是收听新消息并做出响应。我正在使用免费的 heroku 层,发现有所谓的“免费测功时间”。到了月底,所有的空闲时间都用完了,我的机器人将离线到下个月。
我拥有一个 Raspberry pi,因此我认为将它托管在此处也是一个好主意,以防 Heroku 离线。
我想要达到的目标
- 在托管平台(Heroku)上托管不和谐机器人。
- 使用我的树莓派作为故障转移服务器。
- 确保一次只运行一个机器人实例。
- 如果两台服务器都在线 Heroku(被选为主服务器)具有优先权。
- 如果 Heroku 上的应用程序以某种方式崩溃或脱机,我的 Raspberry 上的机器人就会被激活。反之亦然。
如果我有 3 台或更多服务器,那将如何工作?
如果我将机器人连接到数据库,我将如何处理这个问题?
如果提供更通用的解决方案,这只是一个示例,我将不胜感激。
NginX(负载均衡器)
在寻求帮助时,我遇到了负载均衡器和 NginX。如果我是对的,它基本上就像一个网关,所有请求都发送到托管 NginX 的服务器,然后它们被重定向到许多服务器之一(取决于它们的负载程度等)。
我对此有一些问题:
- 我的机器人没有收到任何请求,它只是听不和谐的 api。
- 如果 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”。
- Worker 用于后台工作,并且永远不会进入睡眠状态。
- Web dyno 是唯一接收 HTTP 流量的 dyno。在没有接收到网络流量的 30 分钟后进入睡眠状态。
我可以打开/关闭其中任何一个。
- 两者:我的机器人有 2 个实例。
- Worker:无法连接到端点。
- Web:必须至少每 30 分钟“ping”一次 API,否则机器人会休眠。
我为什么要问?
不是因为我需要解决这个确切的问题,而是因为我想学习一种很好的方法来在未来的项目中使用它。我也认为这将是不 100% 依赖外部托管服务提供商的好方法。
解决方案
推荐阅读
- mysql - 创建跨多个列具有相互唯一性的表
- c++ - 为什么编译行错误导致无法找到头文件
- python-3.x - Pyhon 记录 TimedRotatingFileHandler 日志文件锁定功能
- c++ - 错误:变量“Point a”具有初始化程序但类型不完整。我的代码有什么问题?
- python-3.x - 如何使用excel之类的功能修改数据框中的列?
- azure - Azure 文件共享与托管磁盘,用于存储共享资源和上传的文件
- python - 了解 xgboost 中的拆分
- javascript - 想要在 vuetify 的轮播中添加带有一些文本的叠加层
- r - 绘制 r 中的相对丰度:比例与 100% 不匹配的问题
- r - 在R中的列表中连接n个对象