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.