4

私は NodeJ を実行している 3 つのサーバーを持っており、Redis (1 つのマスター、2 つのスレーブ) で相互に関連付けられています。

私が抱えている問題は、単一のサーバーでシステムを実行すると正常に動作することですが、それを 3 つの NodeJS サーバーにスケーリングすると、メッセージが失われ始め、システムが不安定になります。

ロード バランサーがスティッキー セッションを受け入れません。そのため、クライアントからのリクエストが到着するたびに、別のサーバーに移動できます。

すべての NodeJS サーバーを Redis マスターに向けています。

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;
};
4

2 に答える 2

2

Redis はマスターからスレーブにのみ同期します。スレーブからマスターに同期することはありません。したがって、3 台のマシンすべてに書き込みを行っている場合、3 台のサーバーすべてで同期されるメッセージは、マスターに到達するメッセージだけになります。これが、メッセージが欠落しているように見える理由です。

詳細はこちら

読み取り専用スレーブ

Redis 2.6 スレーブは、デフォルトで有効になっている読み取り専用モードをサポートしているためです。この動作は、redis.conf ファイルのスレーブ読み取り専用オプションによって制御され、CONFIG SET を使用して実行時に有効または無効にすることができます。

読み取り専用スレーブはすべての書き込みコマンドを拒否するため、誤ってスレーブに書き込むことはできません。これは、DEBUG や CONFIG などの管理コマンドが引き続き有効であるため、この機能がスレーブ インスタンスをインターネットに、またはより一般的には信頼できないクライアントが存在するネットワークに公開するように設計されているという意味ではありません。ただし、読み取り専用インスタンスのセキュリティは、 rename-command ディレクティブを使用して redis.conf でコマンドを無効にすることで改善できます。

デフォルトに戻して、スレーブ インスタンスを書き込み操作のターゲットにすることができるのはなぜかと思うかもしれません。その理由は、スレーブとマスターが再同期する場合、またはスレーブが再起動される場合、この書き込みは破棄されますが、多くの場合、スレーブに保存できる重要ではない一時的なデータがあるためです。たとえば、クライアントはスレーブ インスタンス内のマスターの到達可能性に関する情報を取得して、フェイルオーバー戦略を調整する場合があります。

于 2013-06-10T20:09:49.770 に答える
0

この投稿にたどり着きました:

nodejs サーバーとロード バランサーの間に「プロキシ」を配置することをお勧めします。このアプローチにより、スティッキー セッションのないロード バランサーで XHR-Polling を使用できます。

http-proxy を使用した node.js による負荷分散

nodejs-http-proxy を使用すると、カスタム ルーティング ルートを設定できます。socket.io の「connect url」にパラメータを追加します。

以前にこのソリューションを試した人はいますか?

于 2013-06-11T14:17:46.920 に答える