典型的代理分区方案有Twitter 开源的Twemproxy 和国内的豌豆荚开源的Codis。
Twemproxy
two-em-proxy
https://github.com/twitter/twemproxy
Twemproxy 的优点:比较稳定,可用性高。
不足:
1、出现故障不能自动转移,架构复杂,需要借助其他组件(LVS/HAProxy + Keepalived)实现HA
2、扩缩容需要修改配置,不能实现平滑地扩缩容(需要重新分布数据)。
Codis
https://github.com/CodisLabs/codis
Codis 是一个代理中间件,用Go 语言开发的。
功能:客户端连接Codis 跟连接Redis 没有区别。
Codis | Tewmproxy | Redis Cluster | |
---|---|---|---|
重新分片不需要重启 | Yes | No | Yes |
pipeline | Yes | Yes | |
多key 操作的hash tags {} | Yes | Yes | Yes |
重新分片时的多key 操作 | Yes | - | No |
客户端支持 | 所有 | 所有 | 支持cluster 协议的客户 端 |
分片原理:Codis 把所有的key 分成了N 个槽(例如1024),每个槽对应一个分组,一个分组对应于一个或者一组Redis 实例。Codis 对key 进行CRC32 运算,得到一个32 位的数字,然后模以N(槽的个数),得到余数,这个就是key 对应的槽,槽后面就
是Redis 的实例。比如4 个槽:
Codis 的槽位映射关系是保存在Proxy 中的,如果要解决单点的问题,Codis 也要做集群部署,多个Codis 节点怎么同步槽和实例的关系呢?需要运行一个Zookeepe(r 或者etcd/本地文件)。
在新增节点的时候,可以为节点指定特定的槽位。Codis 也提供了自动均衡策略。
Codis 不支持事务,其他的一些命令也不支持。
不支持的命令
https://github.com/CodisLabs/codis/blob/release3.2/doc/unsupported_cmds.md
获取数据原理(mget):在Redis 中的各个实例里获取到符合的key,然后再汇总到Codis 中。
Codis 是第三方提供的分布式解决方案,在官方的集群功能稳定之前,Codis 也得到了大量的应用。