【问题标题】:Nodejs failoverNodejs 故障转移
【发布时间】:2016-04-07 21:11:05
【问题描述】:

我是 nodejs 的初学者。我正在尝试在生产中使用 nodejs。我想实现nodejs故障转移。当我正在执行聊天应用程序时,如果节点服务器出现故障,则聊天不应中断,并且应自动连接到不同的节点服务器,并且应使用相同的套接字 id 进行进一步聊天,以免聊天消息消失。这是可以实现的吗?任何样品。

我不应该使用 Ngnix/HAProxy。也让我知道节点服务器应该如何:主动-主动或主动-被动

【问题讨论】:

    标签: node.js failover


    【解决方案1】:

    PM2是首选的进程管理器,特别是auto-failover,auto-scaling,auto-restart的特性。

    介绍如下,

    PM2 是 Node.js 应用程序的生产流程管理器,具有 内置负载均衡器。它使您可以使应用程序保持活力 永远,在不停机的情况下重新加载它们并促进共同 系统管理任务。

    在生产模式下启动应用程序非常简单:

    $ pm2 start app.js
    

    PM2 经常受到 700 多项测试的攻击。

    官网:http://pm2.keymetrics.io

    适用于 Linux(稳定)和 MacOSx(稳定)和 Windows(测试版)。

    【讨论】:

      【解决方案2】:

      你要同时解决几个问题:

      守护进程 - 让您的应用程序保持正常运行:如前所述,forever 等脚本可用于监督您的 nodeJS 应用程序以在失败时重新启动它。这对于在最坏的故障情况下启动应用程序很有用。

      同样,recluster 可用于分叉您的应用程序,并通过创建主管进程和子进程使其更具抗故障能力。

      未捕获的异常:nodejs 中的一个已知障碍是无法使用 try/catch 块捕获异步错误。因此,异常可能会冒泡并导致整个应用程序崩溃。

      而不是让这种情况发生,您应该使用domains 来创建受异常影响的活动的逻辑分组并适当地处理它。如果您正在运行有状态的网络服务器,则可能应该捕获未处理的异常,并且在终止应用程序之前优雅地关闭其余连接。

      (如果您正在运行无状态应用程序,则可以忽略异常并尝试继续;尽管这不一定是可取的。小心使用它)。

      安全:这是一个很大的话题。您至少需要确保:

      1. 您的应用程序正在以具有最低权限的非root 用户身份运行。
      2. 您正在使用helmet 并已尽可能强化您的应用程序。

      顺便说一句,我看到您在 NodeJS 前面使用 Apache,这不一定是因为 apache 可能会在负载下使用它的线程模型而不是 nodeJS 使用它的事件循环模型。

      【讨论】:

        【解决方案3】:

        假设您使用数据库来验证客户端,并没有太多需要完成的工作,我的意思是,管理服务器脚本状态的脚本,就像 forever 所做的那样,

        如果脚本失败,它会尝试启动脚本,而不仅仅是您应该设计服务器脚本来处理每个已知和可能的未知错误、发送给它的任何信号等。

        一个小例子就是流。

        (Websocket Router)
         |       
         |_(Chat Channel #1) \
         |_(Chat Channel #2) - Channel Cache // hold last 15 messages of every channel  
         |_(Chat Channel #3) / 
         |_(Authentication handler) // login-logout
        

        --希望我能在某些方面有所帮助。

        【讨论】:

        • 感谢您的回复。实际上我想要实现的是我有两个节点服务器。我将通过 apache 访问它们。在 apache 中,我使用 ProxyPass 和 mod_proxy_balancer 路由到节点服务器。我在平衡器中设置了 failonstatus=503。由于 apache 不支持(使用 2.2)websocket,xhr-polling 连接建立。主要问题是当我们运行两个节点服务器时,客户端不断尝试建立与节点服务器的连接。在节点服务器中我们发现了一个循环,“客户端未握手客户端应该重新连接”。知道如何克服这个问题吗?
        • 我没有按照您描述的方式使用 apache 的丰富经验,它可能无法将请求代理到节点 websocket 服务器,可能的解决方法是分别运行节点服务器和 apache 服务器,提供客户端静态客户端 socket.io 脚本并尝试连接到节点服务器,节点服务器反过来以某种方式对其进行身份验证,可能会尝试从“共享”点验证 cookie/会话。另外,如果你只是用 apache 提供静态文件,只要尝试无痛切换到 nodejs 静态文件服务器,它会节省很多精力。
        【解决方案4】:

        对于一个简单的方法,我认为您应该在客户端构建一个重新连接机制,并使用foreverPM2 的进程管理来管理您的Node.js 进程。我尝试了太多方法,但仍然无法解决套接字问题,每当进程停止时它总是被杀死。

        【讨论】:

          【解决方案5】:

          您可以尝试使用Pm2 start app.js -I 0。这将以集群模式运行您的应用程序,为同一线程创建许多子进程。您可以在各个进程之间共享套接字信息。

          【讨论】:

          • 如果客户端和 Pm2 之间的网络不可达,Pm2 将无法响应,因此即使您有 100 个实例服务请求,客户端也将无法访问服务器,因为 Pm2 实例的路径被中断。 Node js 实例设置应通过 Nginx+ Keepalived 或任何其他负载平衡完全分布和同步。
          猜你喜欢
          • 1970-01-01
          • 2012-03-19
          • 1970-01-01
          • 2020-06-14
          • 1970-01-01
          • 1970-01-01
          • 2010-11-06
          • 1970-01-01
          • 2012-07-13
          相关资源
          最近更新 更多