快捷搜索:

Redis集群方案

Redis集群方案

  前段时间搞了搞Redis集群,想用做推荐系统的线上存储,说来挺有趣,这边基础架构不太完善,因此需要我们做推荐系统的自己来搭这个存储环境,就自己折腾了折腾。公司所给机器的单机性能其实挺给力,已经可以满足目前的业务需求,想做redis集群主要有以下几点考虑:

  1、扩展性,scale-out,以后数据量变得很大之后,不至于推到重来,redis虽然可以开启虚拟内存功能,单机也能提供超过物理内存上限的容量,但频繁在内存和硬盘间swap页会大大降低其性能,有点儿违背redis的设计初衷。

  2、redis是一个单线程io复用的结构,无法有效利用服务器的多核结构,如果能在一台多核机器起多个redis进程,共同提供服务,效率会更高一些。

  由于这边想做生产环境部署,unstable branch目前还是不敢用,在官方目前的版本上做提前开发又没有资源和时间,因此就放弃了。

  舍弃了官方的方案后,就想能不能自己搭一个,当时初步的想法是:用lvs做读请求的负载均衡,在客户端代码里自己写一个一致性hash算法做数据切片,配置redis主从,并且配置keepalived做主从自动切换。这个方案应该可以施行的,但当时自己遇到一些细节方面的问题,就在stackoverflow上问了一下,问题如下:

  这位网友的两个建议挺启发的,我在看redis的官方doc的时候,对twemproxy有一些印象,但当时没有太在意,至于后者用redis sentinel做master failover,redis sentinel也是一个redis正在开发中的模块,我不太敢用。

  1、自己在写客户端data sharding和均衡服务的时候,发现实际需要考虑的问题比开始想的要复杂一些,如果写完,其实相当于将twemproxy的功能做了一遍,造轮子的事情还是少干。

  2、功能做得有些冗余,一次读请求要经过客户端的sharding、然后还有经过lvs再到实际的服务器,不做优化的话,会增加不少延迟。

  twemproxy是twitter开源的一个数据库代理服务,可以用于memcached和redis的sharding,兼容二者的标准接口,但是对于redis的keys,dbsize等命令不支持,这个其实想一下也就明白了,这种pool内跨机做统计的命令proxy一般不会支持的。另外,twemproxy在自身与后台redis之间使用pipeline发送命令,因此性能损失比较小。但是,twemproxy对于每一个客户端连接开启的mbuf有限,最大可以设置为64k,如果在客户端代理层与twemproxy之间也使用pipeline,这个pipeline不能太深,而且不支持pipeline的原子性(transaction),其实,这个时候,相当于客户端连接与redis数据库之间存在两层pipeline,分别是客户端到twemproxy的pipeline,和twemproy到后台redis服务器的pipeline,由于二者buffer深度不一致,因此不支持pipeline的transaction也就好理解了。。在引入了twemproxy,插入大规模数据的时候,有时候确实挺耗时,而且pipeline不保证原子性,丢数据时的恢复问题在客户端需要进行额外关注。对于非transaction的pipeline总丢数据,或者对于数据量比较大的key一次性取数据失败等问题,后来经查是twemproxy端timeou值设置过小,按照官方示例设置400ms,会在一次性操作大数据量的时候返回timeout失败,这个数值需要慎重根据业务(具体的,就是客户端单次命令操作的数据量)进行设置,一般2000ms差不多就够用了(可以支持一次操作接近百万的数据)。

  上面的结构,将读操作的负载均衡放到了客户端代码来做,写操作控制也在客户端层的代码里,另外,对于twemproy单点、主从之间可以引入keepalived来消除单点和故障恢复。

  可能你已经听说过Redis 中嵌入了脚本语言,但是你还没有亲自去尝试吧? 这个入门教程会让你学会在你的Redis 服务器上使用强大的lua语言。Hello, Lua!我们的第一个Redis Lua 脚本仅仅返回一个字符串,而不会去与redis 以任何有意义...查看详情

  从mysql搬一个大表到redis中,你会发现在提取、转换或是载入一行数据时,速度慢的让你难以忍受。这里我就要告诉一个让你解脱的小技巧。使用“管道输出”的方式把mysql命令行产生的内容直接传递给redis-cli,以绕过“中间件”的方式使两者在进行数据操作时达到最佳...查看详情

  概述装了redis有一段时间了,每次运行的时候都需要手动在命令行里启动redis,而且窗口不能关闭,感觉很麻烦,所以就想把redis设置为开机启动。由于google打不开(伟大的GFW啊),所以百度了几篇文章,照着教程一步一步做还是没有成功,怪自己太笨了。这两天自己搭建了一个VP...查看详情

  本文介绍redis排序命令redis支持对list,set,sorted set元素的排序sort 排序命令格式: sort key [BY pattern] [LIMIT start count] [GET pattern] [ASCDESC] [ALPHA] [STORE ...查看详情

  Redis中双链表实现的基本结构:1.节点结构typedef struct listNode { struct listNode *prev; //前向节点 struct listNode *next; //后向节点 void *value; //该节点的值} ...查看详情

  sds 的用途Sds 在 Redis 中的主要作用有以下两个:实现字符串对象(StringObject);在 Redis 程序内部用作 char* 类型的替代品;以下两个小节分别对这两种用途进行介绍。实现字符串对象Redis 是一个键值对数据库(key-value DB), 数据...查看详情

  这篇文章主要介绍了利用Redis实现SQL伸缩的方法,包括讲到了锁和时间序列等方面来提升传统数据库的性能,需要的朋友可以参考下。缓解行竞争我们在Sentry开发的早起采用的是sentry.buffers。 这是一个简单的系统,它允许我们以简单的Last Write Wins策略来...查看详情

  Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add...查看详情

  下面列出11种Web应用场景,在这些场景下可以充分的利用Redis的特性,大大提高效率。1.在主页中显示最新的项目列表Redis使用的是常驻内存的缓存,速度非常快。LPUSH用来插入一个内容ID,作为关键字存储在列表头部。LTRIM用来限制列表中的项目数最多为5000。如果用户需...查看详情

  关注关系产生的四种关系状态 关注 粉丝 双向关注(互粉) 无关系需求分析在微博中,每一个用户都会有一个关注列表,一个粉丝列表。用户可以查看自己的关注,粉丝列表,也可以查看别人的关注asp技术,粉丝列表。并且,要展示列表里每个人与当前查看者的关注状态。状态的可能性就是上面讲到得四种关...查看详情asp代码加密解密工具在哪找到密码asp代码加密软件安全吗可靠吗知乎文章免费

您可能还会对下面的文章感兴趣: