Redis集群方案目前主流的有三种,分别是Twemproxy、Codis和Redis Cluster。
Redis Cluster 集群是去中心化通过客户端分片的结构,集群元数据信息分布在每个节点上,主备切换依赖于多个节点协商选主。
Redis cluster有slots 16384个,槽跟节点的映射关系保存在每个节点上,节点之间通过gossip协议交换集群元数据信息。
客户端操作key的时候先通过分片算法算出所属的槽,然后随机找一个服务端请求。可能这个槽并不归随机找的这个节点管,节点如果发现不归自己管,
就会返回一个MOVED ERROR通知,引导客户端去正确的节点访问,这个时候客户端就会去正确的节点操作数据。
Twemproxy是一种代理分片机制,由Twitter开源。Twemproxy作为代理,可接受来自多个程序Client的访问,在 Twemproxy 也可以部署LVS或者 HAProxy等负载均衡设备。Twemproxy会按照路由规则,转发给后台的各个Redis/Memcache服务器,再原路返回。该方案很好的解决了单个Redis实例承载能力的问题。当然,Twemproxy本身也是单点,需要用Keepalived做高可用方案。通过Twemproxy可以使用多台服务器来水平扩张redis服务,Twemproxy减少后端资源的连接数以及为缓存横向扩展能力。 twemproxy 支持多种 hash 分片算法,同时具备失败节点自动剔除的功能,可以有效的避免单点故障问题。
Codis的架构如下:
作为codis的实现来讲,数据高可靠主要是redis本身的能力,通常存储层的数据高可靠,主要是单机数据高可靠+远程数据热备+定期冷备归档实现的。
codis的架构本身分成proxy集群+redis集群,proxy集群的高可用,可以基于zk或者l5来做故障转移,而redis集群的高可用是借助于redis开源的哨兵集群来实现。proxy 通过监听sentinle集群的+switch-master事件来感知redis 主从切换。
Codis | Tweproxy | Redis Cluster | |
---|---|---|---|
集群模式 | 中心化 | 中心化 | 无中心化 |
使用方式 | 通过Proxy访问 | 通过Proxy访问 | 使用Smart Client直连Redis,Smart Client内置路由规则 |
性能 | 有性能损耗 | 有性能损耗 | 高 |
支持的数据库数量 | 多个 | 多个 | 一个 |
Pipeline | 支持 | 支持 | 仅支持单个节点Pipeline,不支持跨节点 |
需升级客户端SDK? | 否 | 否 | 是 |
支持在线水平扩容? | 支持 | 不支持 | 支持 |
Redis版本 | 仅支持3.2.8,升级困难 | 支持最新版 | 支持最新版 |
可维护性 | 组件较多,部署复杂 | 只有Proxy组件,部署简单 | 运维简单,官方持续维护 |
故障自动恢复 | 需部署哨兵 | 需部署哨兵 | 内置哨兵逻辑,无需额外部署 |