8

我们目前正在使用node_redis客户端访问redis。我需要在 redis slaves 前面使用 HAProxy,在我的例子中是 3 个。我安装了 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 回答