2012-05-10 22 views
7

Stiamo utilizzando client node_redis per accedere ai redis al momento. Ho bisogno di usare HAProxy davanti a redis slaves che nel mio caso è di 3 nos. Ho installato HAProxy e l'ho configurato per bilanciare il bilanciamento degli slave rossi. Ma quando ho cercato di creare connessione dal client node_redis al HAProxy non ero in grado di creare la connessione e stavo ottenendo un errore diHAproxy per gli slave redis

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) 
+1

Link alla mailing list su questa domanda esatta - https://groups.google.com/d/msg/redis-db/2yELzDSz1y4/hIeFhh7-WIUJ –

risposta

19

Distacco la configurazione haproxy avrebbe aiutato ...

Il più probabile spiegazione è che haproxy non è configurato per elaborare il traffico TCP generico ma il traffico HTTP.

Esempio:

con la seguente configurazione:

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 

e il seguente script 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); 
}); 

... si ottiene lo stesso errore esatto:

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

È previsto, poiché il parser del protocollo Redis non comprende HTTP. Per risolvere il problema, basta modificare la configurazione haproxy per imporre una modalità TCP generico:

mode http 

to be changed into: 

    mode tcp 

... e ora funziona benissimo.