node ioredis node.js redis load-balancing haproxy

node.js - ioredis - HAproxy para esclavos redis



redis client (1)

Estamos utilizando el cliente node_redis para acceder al redis en este momento. Necesito usar HAProxy frente a los esclavos redis, que en mi caso son 3 nos. Instalé el HAProxy y lo configuré para equilibrar la carga de los esclavos redis. Pero cuando intenté crear una conexión desde el cliente node_redis al HAProxy, no pude crear la conexión y recibí un error

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)


Publicar la configuración haproxy habría ayudado ...

La explicación más probable es que haproxy no está configurado para procesar tráfico TCP genérico sino tráfico HTTP.

Ejemplo:

Con la siguiente configuración:

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

y el siguiente 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); });

... obtenemos el mismo error exacto:

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

Se espera, porque el analizador de protocolo de Redis no entiende HTTP. Para solucionarlo, solo modifique la configuración de haproxy para aplicar un modo TCP genérico:

mode http to be changed into: mode tcp

... y ahora funciona bien.