在现代互联网应用中,高可用性是至关重要的。为了保证服务的稳定性和可靠性,我们需要采取一些措施来防止服务出现单点故障和宕机。本文将介绍如何使用 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 sudo apt-get update sudo apt-get install nodejs # 安装 PM2 sudo npm install -g pm2
步骤二:创建 Node.js 应用
接下来需要创建一个简单的 Node.js 应用,如下所示:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - ----------------------- ---- -- - ------------------ ---------------- --------------- -------------- ---------- --- ------------------- -- -- - ------------------- ------- -- ---- ------- ---
将以上代码保存为 app.js 文件。
步骤三:使用 PM2 启动 Node.js 应用
使用 PM2 启动我们的应用,可以通过以下命令实现:
pm2 start app.js -i max
通过 -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:
sudo service keepalived start
步骤五:测试 Node.js 应用
现在可以在浏览器中访问虚拟 IP 地址 http://192.168.122.150:3000,看到 Node.js 应用返回的 Hello World 字符串即表示应用正常运行。接下来可以模拟应用宕机,停止其中一个 Node.js 进程:
pm2 stop 0
可以在 keepalived 日志中查看到节点状态的变化,一段时间后虚拟 IP 地址会切换到另一个正常运行的节点上。
总结
本文介绍了如何使用 PM2 和 keepalived 构建高可用的 Node.js 服务,通过多进程和虚拟 IP 地址来保证服务的可用性。这种架构设计可以在多个节点之间实现负载均衡和故障转移,有效提高了应用的稳定性和可靠性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6499d5ed48841e98946c7db5