Redis集群方案_Redis

来源:脚本之家  责任编辑:小易  

1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。2、节点的fail是通过集群中超过半数的节点检测失效时才生效。3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value。5、Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key)mod 16384的值,决定将一个key放到哪个桶中www.zgxue.com防采集请勿采集本网。

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

使用方法和普通redis无任何区别,设置好它下属的多个redis实例后,使用时在本需要连接redis的地方改为连接twemproxy,它会以一个代理的身份接收请求 并使用一致性hash算法,将请求转接到具体redis,将结果

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

可以用sentinel去做 比如通过sentinel做节点切换 并且通知一些协调服务(例如zookeeper)告诉所有使用者切换节点之类的 很容易 至于 sharding 分两类 一类是proxy 有一些成熟实现 比如codis、

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

Redis-Sentinel,master挂了可以用slave顶上,备用master再挂了,仍然能自动用slave顶上,就是有个问题,master的地址一致在变的说,客户端会很困惑的。twemproxy对redis性能影响有些大了,接近

    3、主从,数据备份和容灾。。

Redis Sharding采用客户端Sharding方式,服务端Redis还是一个个相对独立的Redis实例节点,没有做任何变动。同时,我们也不需要增加额外的中间处理组件,这是一种非常轻量、灵活的Redis多实例集群

因此计划做的redis集群希望可以实现以下功能:

在客户端做分片是自定义能力最高的,优势当然劣势也很明显,用户需要自己对付 Redis 节点宕机的情况,需要采用更复杂的策略来做 replica,以及需要保证每个客户端看到的集群“视图”是一致的。

    1、data sharding,支持数据切片。

    2、主从备份,主节点写数据,主和从都提供读请求服务,并且支持主从自动切换。

    3、读请求做负载均衡。

    4、更好地,支持节点failover,数据自动迁移。

下面是前后经历的一个过程:

【第一步】尝试官方方案

   肯定想去查看一下redis的官方集群方案,但是很遗憾,官方对cluster的声明如下:

Unfortunately Redis Cluster is currently not production ready, however you can get more information about it reading the specification or checking the partial implementation in the unstable branch of the Redis GitHub repositoriy.

Once Redis Cluster will be available, and if a Redis Cluster complaint client is available for your language, Redis Cluster will be the de facto standard for Redis partitioning.

Redis Cluster is a mix between query routing and client side partitioning.

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

【第二步】初步设想的方案

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

Since the redis cluster is still a work in progress, I want to build a simplied one by myselfin the current stage. The system should support data sharding,load balance and master-slave backup. A preliminary plan is as follows:

    Master-slave: use multiple master-slave pairs in different locations to enhance the data security. Matsters are responsible for the write operation, while both masters and slaves can provide the read service. Datas are sent to all the masters during one write operation. Use Keepalived between the master and the slave to detect failures and switch master-slave automatically.

    Data sharding: write a consistant hash on the client side to support data sharding during write/read in case the memory is not enougth in single machine.

    Load balance: use LVS to redirect the read request to the corresponding server for the load balance.

My question is how to combine the LVS and the data sharding together?

For example, because of data sharding, all keys are splited and stored in server A,B and C without overlap. Considering the slave backup and other master-slave pairs, the system will contain 1(A,B,C), 2(A,B,C) , 3(A,B,C) and so on, where each one has three servers. How to configure the LVS to support the redirection in such a situation when a read request comes? Or is there other approachs in redis to achieve the same goal?

Thanks:)

有个网友给了两个建议:

You can really close to what you need by using:

twemproxy shard data across multiple redis nodes (it also supports node ejection and connection pooling)

redis slave master/slave replication

redis sentinel to handle master failover

depending on your needs you probably need some script listening to fail overs (see sentinel docs) and clean things up when a master goes down

这位网友的两个建议挺启发的,我在看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来消除单点和故障恢复。

以2113Java语言为例,简单说一下,除了一些公司自5261主开发的集群外。4102常用的解决高并发问题的集群一般有三种:1653使用redis-trib.rb,这个是安装redis时就自带的一种集群,采用了服务端分片的方式,支持主备,此集群既解决了高并发的问题,也解决了高可用的问题。Jedis使用JedisCluster类来访问。使用Jedis带的客户端分片ShardedJedisPool类。使用代理进行分片twemproxy,连接代理可以使用Jedis类(单链接)和JedisPool类(多链接)。通过Redis的sentinel机制还可以配置高可用集群,一主多从,主down掉后,sentinel负责选拔一个从机作为新的主机。如果有什么疑问,可以留言内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • redis集群搭建_动力节点java学院整理
  • linux下安装redis并设置相关服务
  • 一篇文章揭秘redis的磁盘持久化机制
  • redis 5.05 单独模式安装及配置方法
  • redis实战记录之限制操作频率
  • python的flask框架使用redis做数据缓存的配置方法
  • windows环境下redis+spring缓存实例讲解
  • 利用redis如何实现自动补全功能
  • redis基本类型和使用方法详解
  • 详解redis数据结构之sds
  • Redis集群方案应该怎么做
  • Redis集群方案应该怎么做
  • Redis集群方案应该怎么做
  • Redis集群方案应该怎么做
  • Redis集群方案应该怎么做
  • Redis集群方案应该怎么做
  • Redis集群方案应该怎么做
  • Redis集群方案应该怎么做
  • Redis集群方案应该怎么做
  • Redis集群方案应该怎么做
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页redisredis集群搭建_动力节点java学院整理linux下安装redis并设置相关服务一篇文章揭秘redis的磁盘持久化机制redis 5.05 单独模式安装及配置方法redis实战记录之限制操作频率python的flask框架使用redis做数据缓存的配置方法windows环境下redis+spring缓存实例讲解利用redis如何实现自动补全功能redis基本类型和使用方法详解详解redis数据结构之sds超强、超详细redis数据库入门教程redis常用命令、常见错误、配置技redis操作命令总结redis中5种数据结构的使用场景介64位windows下安装redis教程redis中使用redis-dump导出、导入redis中统计各种数据大小的方法redis常用命令小结让redis在你的系统中发挥更大作用centos 6.6下redis安装配置记录redis template实现分布式锁的实例代码redis执行lua脚本的好处与示例代码redis的lru机制介绍redis高并发问题的解决方法redis中3种特殊的数据类型(bitmap、geo和redis如何存储对象与集合示例详解一起raid数据恢复及回迁成功的案例redis3.2开启远程访问详细步骤利用控制台如何对redis执行增删改查命令redis数据库的使用场景介绍(避免误用red
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved