Node 节点集群的负载均衡实现
一、架构总览
二、单机多进程的负载均衡
// cluster.js
const cluster = require('cluster');
const http = require('http');
const os = require('os');
if (cluster.isMaster) {
const n = os.cpus().length;
console.log(`Master ${process.pid} fork ${n} workers`);
for (let i = 0; i < n; i++) cluster.fork();
cluster.on('exit', (w, code, sig) => {
console.warn(`Worker ${w.process.pid} died, restarting...`);
cluster.fork();
});
} else {
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end(`Hello from worker ${process.pid}\n`);
}).listen(8000, () => {
console.log(`Worker ${process.pid} listening on 8000`);
});
}
三、多机部署与反向代理
http {
upstream backend {
server 10.0.0.11:3000 weight=1 max_fails=3 fail_timeout=30s;
server 10.0.0.12:3000 weight=1 max_fails=3 fail_timeout=30s;
server 10.0.0.13:3000 weight=1 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
frontend http_in bind *:80
default_backend node_app
backend node_app
balance roundrobin
server node1 10.0.0.11:3000 check
server node2 10.0.0.12:3000 check
server node3 10.0.0.13:3000 check
四、会话保持与状态管理
// 示意:基于 IP 的简单取模粘滞(生产请用成熟中间件)
const sticky = require('sticky-session');
const server = http.createServer(app);
sticky.listen(server, 8000, {
workerIndex: (ip, workers) => {
// 简化示例:将 IP 数字求和后取模
const s = ip.replace(/\D/g, '');
return Number(s) % workers.length;
}
});
for (let i = 0; i < os.cpus().length; i++) cluster.fork();
五、生产实践与运维要点
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。