PM2 与 keepalived 架高可用 Node.js 服务

阅读时长 7 分钟读完

在现代互联网应用中,高可用性是至关重要的。为了保证服务的稳定性和可靠性,我们需要采取一些措施来防止服务出现单点故障和宕机。本文将介绍如何使用 PM2 和 keepalived 构建高可用的 Node.js 服务。

什么是 PM2?

PM2 是一个基于 Node.js 的进程管理工具,可以帮助我们管理 Node.js 应用的启动、重启、停止等操作,还可以通过日志、监控等功能进行运维管理。PM2 支持多进程模式,可以利用多核 CPU 来提高应用的性能和稳定性。

什么是 keepalived?

keepalived 是一个基于 VRRP 协议的高可用性解决方案,可以为服务器提供虚拟 IP 地址,当主机宕机时可以快速将虚拟 IP 地址切换到备用主机上,保证服务的可用性。keepalived 通过检测主机和服务的状态来进行故障转移,可以支持多种检测方式,如 ping、HTTP 检测等。

架构设计

下面是本文采用的架构设计:

本文的架构主要有三个模块:

  • Load Balancer:负载均衡器,使用 keepalived 提供虚拟 IP 地址并将流量分发到多个 Node.js 应用服务器上。
  • Node.js Servers:多个 Node.js 应用服务器,使用 PM2 管理 Node.js 进程,实现多进程运行。
  • Database Servers:多个数据库服务器,用于提供存储服务。

实现步骤

下面是实现高可用 Node.js 服务的主要步骤:

步骤一:安装 Node.js 和 PM2

首先需要在 Node.js 应用服务器上安装 Node.js 和 PM2。可以使用以下命令进行安装:

步骤二:创建 Node.js 应用

接下来需要创建一个简单的 Node.js 应用,如下所示:

-- -------------------- ---- -------
----- ---- - ----------------

----- ------ - ----------------------- ---- -- -
  ------------------ ---------------- ---------------
  -------------- ----------
---

------------------- -- -- -
  ------------------- ------- -- ---- -------
---

将以上代码保存为 app.js 文件。

步骤三:使用 PM2 启动 Node.js 应用

使用 PM2 启动我们的应用,可以通过以下命令实现:

通过 -i 参数可以指定应用的进程数,这里我们使用 max 参数表示使用尽可能多的 CPU 核心来运行应用。使用 PM2 启动应用后,可以通过 pm2 list 命令查看应用的状态:

-- -------------------- ---- -------
-----------------------------------------------------------------------------------------------------------------
- --- ---- - -- - ---- - ---   - ------  - ------- - ------ - --- - ---       - ----     - -------- - -------- -
-----------------------------------------------------------------------------------------------------------------
- ---      - -  - ------- - ----- - ------  - -       - --     - --  - ---- --   - ------   - --------  -
- ---      - -  - ------- - ----- - ------  - -       - --     - --  - ---- --   - ------   - --------  -
- ---      - -  - ------- - ----- - ------  - -       - --     - --  - ---- --   - ------   - --------  -
- ---      - -  - ------- - ----- - ------  - -       - --     - --  - ---- --   - ------   - --------  -
- ---      - -  - ------- - ----- - ------  - -       - --     - --  - ---- --   - ------   - --------  -
- ---      - -  - ------- - ----- - ------  - -       - --     - --  - ---- --   - ------   - --------  -
- ---      - -  - ------- - ----- - ------  - -       - --     - --  - ---- --   - ------   - --------  -
- ---      - -  - ------- - ----- - ------  - -       - --     - --  - ---- --   - ------   - --------  -
-----------------------------------------------------------------------------------------------------------------

可以看到,应用已经启动了 8 个进程,共用了 8 个 CPU 核心。

步骤四:创建负载均衡器

接下来需要在负载均衡器上配置 keepalived,实现虚拟 IP 地址和流量分发的功能。可以参考以下配置:

-- -------------------- ---- -------
- ------------- ---- --- ----------

----------- -
   ------------------ -
     --------------------
     ---------------------
     ---------------------
   -
   ----------------------- -----------------------------
   ----------- ---------
   -------------------- --
   --------- --
-

----------- ------------ -
    ------ -------------- -- --------------------- -- ---- --
    -------- -
    ------ -
-

------------- ---- -
    --------- ----
    ----- ------
    ----------------- --
    -------- ---
    ---------- -
    -------------- -
        --------- ----
        --------- ----
    -
    ----------------- -
        ------------------ --- ---- ----- ------
    -
    ------------ -
        ------------
    -
-

其中,check_nodejs 脚本用于检测 Node.js 应用的状态,如果返回错误则表示节点故障。VI_1 实例定义了负载均衡器的配置,其中 priority 越高的节点会优先成为 MASTER 状态,authentication 是认证配置,virtual_ipaddress 定义了虚拟 IP 地址,track_script 用于将 Node.js 应用状态绑定到 keepalived 状态中,保证虚拟 IP 地址只会绑定到正常运行的节点上。

最后使用以下命令启动 keepalived:

步骤五:测试 Node.js 应用

现在可以在浏览器中访问虚拟 IP 地址 http://192.168.122.150:3000,看到 Node.js 应用返回的 Hello World 字符串即表示应用正常运行。接下来可以模拟应用宕机,停止其中一个 Node.js 进程:

可以在 keepalived 日志中查看到节点状态的变化,一段时间后虚拟 IP 地址会切换到另一个正常运行的节点上。

总结

本文介绍了如何使用 PM2 和 keepalived 构建高可用的 Node.js 服务,通过多进程和虚拟 IP 地址来保证服务的可用性。这种架构设计可以在多个节点之间实现负载均衡和故障转移,有效提高了应用的稳定性和可靠性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6499d5ed48841e98946c7db5

纠错
反馈