使用有状态会话进行负载均衡

时间:2014-02-10 21:18:32

标签: node.js load-balancing opa

我的应用程序当前部署在多个实例中,并且使用NginX反向代理执行负载平衡。

问题是对服务器的某些请求可能非常昂贵。有时单个节点会过载,每个运气不好的用户(由负载均衡器指向此节点)的响应时间都会非常短。

第二个问题是用Opa framework编写的带有状态会话的软件。来自用户的所有请求(包括构建在框架中的AJAX和服务器推送实现)必须坚持使用相同的节点。

基于IP哈希的负载均衡(如带有ip_hash选项的NginX)和循环法都不是解决方案:(

我想尝试Node Cluster,它不会以循环方式进行负载均衡,但依赖于操作系统为新请求选择负载较少的进程。不幸的是,类似于循环法,它不支持粘性会话。

我的想法是使用Cluster通过侦听公共端口并重定向到“私有”URL来选择负载较少的进程 - 每个进程都不同。反向代理可以将基于名称的虚拟域www1.mysitewww2.mysite,...转换为mysite:8001mysite:8002等。这样一旦第一次联系,浏览器就会停留分配节点。

Cluster worker的Node.js代码:

var cluster = require('cluster');
var http = require('http');
var url = require('url');
var master_port = 8000;
var worker_port = master_port + cluster.worker.id;
http.createServer(function(req, res) {
  res.writeHead(200);
  res.end('Hello ' + cluster.worker.id);
}).listen(worker_port);
http.createServer(function(req, res) {
  res.writeHead(302, {
    'Location': '//mysite:' + worker_port + url.parse(req.url).pathname
  });
  res.end("Redirecting to worker " + cluster.worker.id);
}).listen(master_port);

这种方法需要对应用程序进行大量更改,因为我必须确保所有静态资源都是要缓存的完全限定URL(包括服务器名称)。应该重新配置NginX,特别是对于这个应用程序,因此静态文件将从“私有”主机名/端口重定向,并且将在单个副本中可见。额外的重定向也可能会增加页面加载的响应时间。

使用Cluster的“粘性sessons”有更好的方法吗?或者也许NginX可以某种方式重定向到基于某些cookie或其他HTTP头之前选择的节点?有人之前已经解决了这个问题吗?

0 个答案:

没有答案
相关问题