Redis,技术开发者耳熟能详的内存数据库。作为数据库,存储数据的容量是有限的,不能超过主机内存的大小。一般来说,主机服务器的内存只有十几G,最大可达100G或200G。为了解决Redis的存储瓶颈问题,各大企业开始寻找在多个Redis实例中存储数据分片(sharding)的方案,每个分片就是一个Redis实例,进而实现多个Redis实例的协同运行。这就是Redis集群的原理。本文将重点介绍Redis集群解决方案。Redis集群实现方式:分区,将数据划分到多个Redis实例中,然后保证每个实例只保存key的一个子集;通过多台电脑的内存和数值构建更大的数据库;通过多台计算机扩展计算能力;通过多台计算机和网络适配来扩展网络带宽。集群实现:Client-sideshardingProxy-basedshardingroutingquery下面介绍三种实现方式:Client-sideshardingClient-sidesharding是在业务端实现分片工作,程序代码是基于Redis的路由客户端预先定义的规则直接对不同的Redis实例进行分布式访问,最后将结果汇集在一起??。这种方案的好处是所有的逻辑都是可控的,没有第三方中间件的介入,开发者非常清楚分片和路由规则如何实现,实现方式完全在自己的掌控之中。然而,客户端分片方案的缺点也让开发人员感到恼火。由于客户端分片方案是静态分片方案,无论是增加还是减少Redis实例数,都需要开发者手动调整分片方案,对开发者依赖性强;其次,在运维方面,解决方案运维性较差。一旦集群数据出现问题,需要开发人员和运维人员共同解决。在不同的客户端程序中,维护相同的分片逻辑成本很高,消耗巨大的开发成本。只有这样,两个业务系统的分片逻辑才能保持一致。因此,客户端分片方案不适合中小企业。Proxy-basedshardingProxy-basedsharding是指客户端向代理发送请求,代理解析客户端的数据,将请求转发给正确的节点,最后将结果回复给客户端。有两种常用的基于代理的分片方案,Twemproxy和codis。TwemproxyTwemproxy是Twitter开源的redis代理解决方案,在Twitter和Yahoo中都有使用。Twemproxy工作时,Redis客户端将请求发送给Twemproxy,Twemproxy根据路由规则使用一致性哈希算法发送正确的Redis实例,最后Twemproxy将结果返回给客户端实现Redis集群.由于Twemproxy是单线程方案,所以只能使用单核CPU。如果前端有keepalive或者haproxy相关代理,可以为Twemproxy做1+1的准备。当Twemproxy应用于多台Redis服务器时,所达到的性能只能达到单台Redis服务器的80%,其余20%的性能损失。Redis-Sentinel是Redis官方推荐的高可用方案。Redis作为主从高可用方案时,如果Master宕机,Twemproxy会订阅Sentinel完成主从切换。由于Redis-sentinel本身是一个独立运行的进程,它可以监控多个主从集群,发现master宕机后可以自动切换。Twemproxy优点:支持Redis和memcached两种集群代理;后端Redis和memcached不需要任何改动,只需要提供IP和端口给Twemproxy,操作简单;支持自动删除失效的Redis实例;支持状态监控......Twemproxy不足:无法动态扩展。如果需要扩展功能,研发人员必须手动迁移,比较繁琐;由于Redis客户端的请求需要经过Twemproxy到达Redis服务端,期间难免会出现性能损耗;无法平滑扩容/缩容容忍度,对于运维人员来说,如果业务需要增加Redis实例,工作量会非常大...CodisCodis于2014年11月由豌豆荚在GitHub上开源,基于Go和C语言,并支持平滑增加Redis实例的集群方案。在使用Codis时,设置从属的Redis实例,在需要连接Redis的地方更改与Codis的连接,然后Codis会作为代理接受请求,并使用一致性哈希算法将请求传递给具体的Redis,最后将结果返回给Codis。作为一个基于代理的分片,它的功能类似于Twemproxy。Codis主要包括四大组件:CodisProxy(codis代理)、CodisManager(codisconfig)、CodisRedis(codis-server)和ZooKeeper,每个组件都可以动态扩展。CodisProxy:客户端连接Redis代理服务,本身实现了Redis协议,Redis客户端连接CodisProxy后可以进行各种操作。CodisProxy是无状态的。一个业务可以通过Keepalived等负载均衡软件部署多个CodisProxies;Codisconfig:Codisconfig是一个Codis管理工具,支持添加/删除Redis节点、添加/删除Proxy节点、发起数据迁移等操作。另外,Codisconfig有自己的http服务器,里面集成了管理界面。运维人员可以在浏览器上观察Codis集群的运行状态,并进行相关操作;CodisRedis:CodisRedis基于redis-2.8.21分支开发,是Codis项目维护Redis的一个Redis分支,增加了slot支持和原子数据迁移指令;ZooKeeper:Codis使用ZooKeeper存储数据路由表和CodisProxy节点的原始信息,Codisconfig发起的命令会通过ZooKeeper同步到存活的CodisProxy节点。路由查询路由查询是指向任意节点发送任务请求,接收到请求的节点将查询请求发送给正确的节点以执行任务。Redis集群方案中使用的路由查询方案为Redis集群。RedisCluster是Redis官方推出的一种服务器分片技术,3.0版本正式上线,可以线性扩展到1000个节点。在RedisCluster中,Sharding将所有key映射到slots,slots总数为16384个。在Redis集群中,每个节点负责16384个slots中的一部分。动态增减节点时,需要重新分配16384个slot,同时迁移slot中对应的key。这项工作目前需要人工干预。使用RedisCluster时,需要保证16384槽对应的节点能够正常工作。如果一个节点发生故障,整个集群将无法工作。为了增加集群的可访问性,Redis官方建议节点配置为主从结构(一个master主节点挂多个slave从节点)。如果主节点出现故障,RedisCluster会根据选举算法选择其中一个从节点成为主节点,整个集群继续对外提供服务。在使用Redis集群时,由于官方没有提供图形化管理工具,运维比较复杂。此外,集群管理和数据存储之间存在耦合。一旦集群管理出现问题,就需要对整个Redis进行升级整合。RedisCluster自2015年发布以来,成功使用的公司并不多。
