HAproxy为redis奴隶

目前我们使用node_redis客户端来访问redis。 我需要在redis slave上使用HAProxy,在我的情况下是3个。 我安装了HAProxy,并将其configuration为负载均衡redis从服务器。 但是当我试图创build连接从node_redis客户端到HAProxy我无法创build连接,并得到一个错误

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) 

发布haproxyconfiguration将有助于…

最可能的解释是haproxy没有configuration为处理通用的TCP通信,但HTTP通信。

例:

采用以下configuration:

 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协议parsing器不理解HTTP,所以这是预料之中的。 要解决这个问题,只需修改haproxyconfiguration来强制一个通用的TCP模式:

  mode http to be changed into: mode tcp 

…现在它工作正常。