本文专注于从程序角度看如何使用Redis集群,以及相关的方案。
概要
为何要做集群?主要原因就是为了做Sharding/Partitioning,所以Redis集群方案等价为Redis Sharding/Partitioning方案。
Partitioning: how to split data among multiple Redis instances 对Redis做集群的利弊和考量做了详细说明。因此,在确定方案之前,要先确定你的Redis是用来做什么的?做Cache还是数据持久化,不同方案对此的支持程度是不同的。不言自明的是,如果Redis用途是Cache,整个集群方案会更简单。
需要注意的是,无论采取何种方案,因为Sharding的存在,天然会导致有些命令在集群环境下是无法(正常)工作的,因此对于程序的改造是不可避免的。
Redis集群的方案基本上由以下组件构成:
- Client
- Proxy
- Redis实例
集群管理组件和Redis Sentinel不在本文的探讨范围之内。
而这些组件又可以做出以下细分:
组件 | 类型 | 说明 |
---|---|---|
Redis | simple | 最简单的standalone Redis实例 |
cluster | Redis Cluster | |
Proxy | sharding | 连接多个Redis Simple实例,内置Sharding逻辑 |
cluster | 支持Redis Cluster | |
Client | simple | 傻瓜式客户端,只能连接单个Redis Simple实例 |
sharding | 连接多个Redis Simple实例,内置Sharding逻辑 | |
cluster | 支持Redis Cluster |
组件
具体讲讲集群的各个组件,以及可用的开源项目。
Proxy
不管何种Proxy,其目的都是伪装成一个Simple Redis实例,使得程序无需改造就能够利用Redis集群。
sharding类型
这种类型的Proxy连接多个simple redis实例,根据自己的Sharding/LB算法,把请求分配到各个redis实例上。
这类Proxy 需要配合 Dashboard(管理组件)才能够更新节点列表。更复杂的运维任务也需要Dashboard配合。
cluster类型
这种类型的Proxy直接连接在Redis Cluster上,集群的管理工作全部交给Redis Cluster,Proxy能够感知到集群节点变化,并且路由命令到正确的Slot上,避免MOVED/ASK重定向,提升执行效率。
开源项目
项目 | sharding | cluster | 维护 | 说明 |
---|---|---|---|---|
twemproxy | Y | 不活跃 | ||
corvus | Y | 停止 | 改进twemproxy,饿了么 | |
Codis | Y | 停止 | 改进twemproxy,自带Dashboard,豌豆荚 | |
samaritan | ? | Y | 停止 | corvus的继任项目,sidecar形式的proxy,只支持Redis <= 5.0,配套Dashboard sash |
Redis Cluster Proxy | Y | 停止 | 官方搞的,处于alpha状态,不推荐生产使用 | |
envoy | ? | Y | 活跃 | sidecar形式的proxy, redis只是其中一项功能 |
camellia-redis-proxy | Y | Y | 活跃 | 网易 |
bilibili-overlord | Y | Y | 不活跃 | B站 |
Client
Client方案和Proxy方案类似,可以类比为把Proxy的基本功能以类库的形式集成到Client里。
simple (傻瓜式)client没什么好谈的,就是最简单的客户端,只能连接一个Redis实例。
随着技术的发展,有些simple client也渐渐支持sharding和cluster特性。
不过需要注意的是,某些Client的实现不是太好,不同模式的API形式不一致,这意味着一定的改造成本。
sharding类型
这种类型的Client连接多个simple redis实例,根据自己的Sharding/LB算法,把请求分配到各个redis实例上。
这类Client 需要配合 Dashboard(管理组件)才能够更新节点列表。更复杂的运维任务也需要Dashboard配合。
cluster类型
这种类型的 Client 直接支持 Redis Cluster 协议,能够感知到集群中节点的变化。
开源项目
项目 | sharding | cluster | API一致 | 维护 | 说明 |
---|---|---|---|---|---|
jedis | ShardedJedis | N | |||
lettuce | Y | Y | 活跃 | ||
camellia-redis | Y | Y | Y | 活跃 | 网易 |
结论
根据上面的信息,可以组合出以下几种方案(方案顺序最便利->最麻烦):
Client | Proxy | Redis | 便利性 |
---|---|---|---|
simple | cluster | cluster | 无改动 |
simple | sharding | simple | 无改动,另外需要Dashboard来管理集群 |
cluster | – | cluster | 可能有改动 |
sharding | – | simple | 可能有改动,无改动,另外需要Dashboard来管理集群 |
注意:这里的程序改动指的是建立连接或者API的改动,不包括Redis命令的改动,这部分改动是不可避免的。
评论