HAproxy for redis slaves

存储架构 2018-03-13

We are using node_redis client to access the redis at present. I need to use HAProxy in front of redis slaves which in my case is 3 nos. I installed the HAProxy and configured it to load balance the redis slaves. But when I tried to create connection from the node_redis client to the HAProxy I was not able to create the connection and was getting a 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. (/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)

Problem courtesy of: user1386776

Solution

Posting the haproxy configuration would have helped ...

The most likely explanation is haproxy is not configured to process generic TCP traffic but HTTP traffic.

Example:

With the following 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

and the following node.js
script:

var redis = require('redis')
var redis_client = redis.createClient(1521, 'localhost');
redis_client.get( 'key', function(e,o) {
    console.log("return "+e+o);
});

... we get the same exact error:

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

It is expected, because the Redis protocol parser does not understand HTTP. To fix it, just alter the haproxy configuration to enforce a generic TCP mode:

mode http

to be changed into:

    mode tcp

... and now it works fine.

Solution courtesy of: Didier Spezia

您可能感兴趣的

阿里即将开源云数据库 Redis 分支版 ApsaraCache... ApsaraCache(飞天缓存)是阿里云的云数据库 Redis 版所使用的分支,是在社区 2.8 版本基础上开始维护的分支,并 backport 了部分 3.0 分支的功能,该版本主要解决了云上用户对稳定性、性能、灾备和平滑升级体验的诉求。 由于云上用户量和数据规模都比较大,Apsara...
Openfire插件开发实–随机用户配对系统... Openfire支持插件开发,使得它的用处大大增加。前阵子,做一个匿名聊天软件,名字叫做“子曰”,再做这个项目之前,了解了许多关于open fire的知识,得知他支持插件开发,并且能实现所需要的功能,所以最后就决定用它。这个匿名聊天软件最核心的功能就是陌生人配对了。服务器端实现也很简单,用户配对插件...
java中定时器的设置 在java后台开发中,我们常常会碰到一种需求:定时任务,比如超时取消未支付订单、定时推送通知(发送短信)、定时清理日志等等。这些需求在我们的开发中是随处可见的,但是往往对于一些特殊的需求不知道如何做,或者不知道如何设计。 在这里我将它们分为三种:第一种是从时间点开始(已知起始时间点),到一定时长...
如何让网站不下线从Redis 2迁移到Redis 3 我们在 Sky Betting&Gaming 中使用 Redis 作为共享内存缓存,用于那些需要跨 API 服务器或者 Web 服务器鉴别令牌之类的操作。在 Core Tribe 内,它用来帮助处理日益庞大的登录数量,特别是在繁忙的时候,我们在一分钟内登录数量会超过 20,000 ...
【译】看 Reddit 如何统计每篇帖子的浏览量... 原文链接 我们想要更好的向用户展示 Reddit 的规模。为了这一点,投票和评论数是一个帖子最重要的指标。然而,在 Reddit 上有相当多的用户只浏览内容,既不投票也不评论。所以我们想要建立一个能够计算一个帖子浏览数的系统。这一数字会被展示给帖子的创作者和版主,以便他们更好...