8

現在、node_redisクライアントを使用してredisにアクセスしています。私の場合は3つのnosであるredisスレーブの前でHAProxyを使用する必要があります。HAProxyをインストールし、redisスレーブの負荷を分散するように構成しました。しかし、node_redisクライアントからHAProxyへの接続を作成しようとすると、接続を作成できず、エラーが発生していました

   Error: Redis reply parser error: Error: Protocol error, got "H" as reply type byte
at HiredisReplyParser.execute (/home/user1/doosra/node-exp/node_modules/redis/lib/parser/hiredis.js:32:31)
at RedisClient.on_data (/home/user1/doosra/node-exp/node_modules/redis/index.js:440:27)
at Socket.<anonymous> (/home/user1/doosra/node-exp/node_modules/redis/index.js:70:14)
at Socket.emit (events.js:67:17)
at TCP.onread (net.js:347:14)
4

1 に答える 1

21

haproxy 構成を投稿すると役に立ちました...

最も可能性の高い説明は、haproxy が一般的な TCP トラフィックを処理するように構成されておらず、HTTP トラフィックを処理するように構成されていることです。

例:

次の構成を使用します。

global
    daemon
    maxconn 256

defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend redis
    bind *:1521
    default_backend servers

backend servers
    server R1 127.0.0.1:6379 maxconn 1000

および次の node.js スクリプト:

var redis = require('redis')
var redis_client = redis.createClient(1521, 'localhost');
redis_client.get( 'key', function(e,o) {
    console.log("return "+e+o);
});

...同じ正確なエラーが発生します。

Error: Redis reply parser error: Error: Protocol error, got "H" as reply type byte

Redis プロトコル パーサーは HTTP を理解しないため、これは予期されることです。これを修正するには、haproxy 構成を変更して汎用 TCP モードを強制します。

    mode http

to be changed into:

    mode tcp

...そして今では正常に動作します。

于 2012-05-10T15:13:11.383 に答える