繁体   English   中英

负载平衡:Node.js-Socket.io-Redis

[英]Load Balance: Node.js - Socket.io - Redis

我有3台运行NodeJ的服务器,它们与Redis相互关联(1个主节点,2个从节点)。

我遇到的问题是在一台服务器上运行系统可以正常工作,但是当我将其扩展到3个NodeJS服务器时,它开始丢失消息,系统变得不稳定。

我的负载均衡器不接受粘性会话。 因此,每次来自客户端的请求到达时,它们都可以转到其他服务器。

我将所有NodeJS服务器都指向Redis Master。

看起来socket.io正在每个服务器上存储信息,并且没有通过Redis进行分发。

我正在使用socket.io V9,我怀疑我没有任何握手代码,这可能是原因吗?

我配置socket.io的代码是:

var express = require('express');
var io = require('socket.io');
var redis = require('socket.io/node_modules/redis');
var RedisStore = require('socket.io/lib/stores/redis');

var pub = redis.createClient("a port", "an ip");
var sub = redis.createClient("a port", "an ip");
var client = redis.createClient("a port", "an ip");
var events = require('./modules/eventHandler');

exports.createServer = function createServer() {
    var app = express();
    var server = app.listen(80);
    var socketIO = io.listen(server);

    socketIO.configure(function () {
        socketIO.set('store', new RedisStore({
            redisPub: pub,
            redisSub: sub,
            redisClient: client
        }));
        socketIO.set('resource', '/chat/socket.io');
        socketIO.set('log level', 0);
        socketIO.set('transports', [, 'htmlfile', 'xhr-polling', 'jsonp-polling']);
    });

    // attach event handlers
    events.attachHandlers(socketIO);

    // return server instance
    return server;
};

Redis仅从主机同步到从机。 它从不同步到从机。 因此,如果您要写入所有3台计算机,则最终将在所有3台服务器之间同步的消息只有主服务器。 这就是为什么您看起来缺少消息的原因。

更多信息在这里

只读奴隶

由于Redis 2.6从站支持默认情况下启用的只读模式。 此行为由redis.conf文件中的slave-read-only选项控制,并且可以在运行时使用CONFIG SET启用和禁用。

只读从站将拒绝所有写命令,因此由于错误而无法写入从站。 这并不意味着该功能被构想为将从属实例公开到Internet,或更普遍地说是公开存在不信任客户端的网络,因为仍启用了DEBUG或CONFIG之类的管理命令。 但是,可以通过使用rename-command指令禁用redis.conf中的命令来提高只读实例的安全性。

您可能想知道为什么可以还原默认值并使从属实例成为写操作的目标。 原因是,如果从设备和主设备将重新同步,或者如果重新启动了从设备,则该写入将被丢弃 ,但是经常会有一些不重要的临时数据可以存储到从设备中。 例如,客户端可以获取有关从属实例中主服务器可达性的信息,以协调故障转移策略。

我到达了这篇文章:

在nodejs服务器和负载平衡器之间使用“代理”可能是一个好主意。 通过这种方法,XHR-Polling可以用于没有“粘性”会话的负载均衡器中。

使用http-proxy与node.js进行负载平衡

使用nodejs-http-proxy我可以自定义路由,例如。 通过在socket.io的“连接url”上添加参数。

有人尝试过此解决方案吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM