前言:
当我们的业务逐渐扩大,单台服务器的访问量逐渐上涨,并发请求开始变得越来越多,这时候需要考虑使用 PM2 这个进程管理工具来进行负载均衡和高可用。
首先,如果不了解 PM2 是什么,可以先看我的另外一篇文章:
负载均衡
负载均衡是分配到服务器块的网络流量,以避免过载。在 WEB 服务器上,用于平衡流量,以提高整个网络的可用性和可靠性。它可以确保没有一个服务器挂掉,而且多台服务器一起参与它的只有一个输入流,然后分配到多台服务器上去处理。
PM2 的 Load Balance
PM2 的 Load Balance 是通过通过创建多个进程来实现负载均衡,结合了进程的管理功能,可以避免服务的因为单点故障而出现的停机。
PM2 的 Load Balance 的负载均衡策略有两种:轮询和最少连接。可以通过以下参数进行配置:
- 轮询策略: round-robin
- 最少连接策略: least-connection
轮询策略
轮询策略是 PM2 的默认负载均衡策略,通过循环方式将请求分配到不同的进程上。
以下是使用轮询策略进行负载均衡的代码:
const http = require('http'); http.createServer((req, res) => { res.end(`This response from pid :${process.pid}`); }).listen(3000);
通过 PM2 启动 3 个进程:
pm2 start app.js -i 3
然后,查看 these usages,可以看到 3 个进程运行:
pm2 show app
输出结果:
┌──────────┬────┬─────────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐ │ App name │ id │ version │ mode │ pid │ status │ restart│ uptime│ memory │ watching │ ├──────────┼────┼─────────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤ │ app │ 0 │ 0.0.0 │ fork │ 24270 │ online │ 0 │ 0s │ 12.820 MB │ disabled │ │ app │ 1 │ 0.0.0 │ fork │ 24275 │ online │ 0 │ 0s │ 12.574 MB │ disabled │ │ app │ 2 │ 0.0.0 │ fork │ 24280. │ online │ 0 │ 0s │ 12.574 MB │ disabled │ └──────────┴────┴─────────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘
访问应用程序并请求三次:
curl http://localhost:3000 curl http://localhost:3000 curl http://localhost:3000
结果分别如下:
This response from pid :24275 This response from pid :24280 This response from pid :24270
可以看到,请求分别被分配到了不同的进程上,即负载均衡成功。
最少连接策略
最少连接策略是 PM2 的另外一种负载均衡策略。它将通过选择负载最小的进程来优先分配请求。
以下是使用最少连接策略进行负载均衡的代码:
const http = require('http'); http.createServer((req, res) => { res.end(`This response from pid:${process.pid}`); }).listen(3000);
通过 PM2 启动 3 个进程:
pm2 start app.js -i 3 --name "my-app" --watch
设置最少连接策略:
pm2 scale my-app --least-connection
然后,查看这些 usages,可以看到 3 个进程运行:
pm2 show my-app
然后,访问应用程序并请求三次:
curl http://localhost:3000 curl http://localhost:3000 curl http://localhost:3000
结果分别如下:
This response from pid:3661 This response from pid:3662 This response from pid:3663
可以看到,请求分别被分配到了不同的进程上,即负载均衡成功。
高可用性
高可用性是指在发生故障时,系统可以保持连续性和可用性。当我们使用 PM2 进行负载均衡时,可以使用其 cluster mode 功能来实现高可用性。
PM2 的 Cluster Mode 使用多个进程集群,通过进程之间通信来实现高可用性。如果一个进程死亡或发生崩溃,其余的进程会自动补充进来。
以下是 PM2 的 Cluster Mode 示例:
const http = require('http'); http.createServer((req, res) => { res.end(`This response from pid:${process.pid}`); }).listen(3000);
通过 PM2 启动 3 个进程:
pm2 start app.js -i max
设置 cluster mode:
pm2 set pm2:cluster-mode true
然后,查看 these usages,可以看到 3 个进程运行:
pm2 show app
输出结果:
┌──────────┬────┬─────────┬───────┬─────────┬─────────┬────────┬─────┬───────────┬──────────┐ │ App name │ id │ version │ mode │ pid │ status │ restart│ uptime│ memory │ watching │ ├──────────┼────┼─────────┼───────┼─────────┼─────────┼────────┼─────┼───────────┼──────────┤ │ app │ 0 │ 0.0.0 │ cluster │ 5389 │ online │ 0 │ 1s │ 30.508 MB │ disabled │ │ app │ 1 │ 0.0.0 │ cluster │ 5390 │ online │ 0 │ 1s │ 30.508 MB │ disabled │ │ app │ 2 │ 0.0.0 │ cluster │ 5391 │ online │ 0 │ 1s │ 30.508 MB │ disabled │ └──────────┴────┴─────────┴───────┴─────────┴─────────┴────────┴─────┴───────────┴──────────┘
访问应用程序并请求三次:
curl http://localhost:3000 curl http://localhost:3000 curl http://localhost:3000
然后,一个进程被关闭,访问三次:
pm2 stop app 1 curl http://localhost:3000 curl http://localhost:3000 curl http://localhost:3000
结果分别如下:
This response from pid:5391 This response from pid:5389 This response from pid:5391
可以看到,每个请求都被分配到了自己的进程上,即高可用性成功。
总结
PM2 是非常常用的进程管理工具,也可以很好地帮助我们实现负载均衡和高可用性。本文详细介绍了 PM2 如何通过负载均衡策略(轮询和最少连接)和 cluster mode 功能实现负载均衡和高可用性。希望这些示例能对大家了解 PM2 的负载均衡和高可用性的实现有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6454598c968c7c53b08499e5