深入Redis(十九)Codis

Codis

在大数据高并发场景下,单个Redis实例往往会捉襟见肘。

首先体现在内存上,单个实例内存不宜过大,过大会导致快照文件过大,进一步导致主从同步时全量同步时间过长,实例重启恢复时也会消耗很长的数据加载时间,特别是在云环境下,单个Redis实例的内存都是受限的。

其次体现在CPU利用率上,单个Redis实例只能利用单个核心,让单个核心完成海量数据的存取和管理,压力会很大。

正是在这样的大数据高并发的需求下,Redis集群方案出现了。

它将众多小内存的Redis实例综合起来,将分布在多台机器上的众多CPU核心的计算能力聚集到一起,完成海量数据存储和高并发读写操作。

Codis是Redis集群方案之一,由中国人开发并开源,很靠谱。Codis使用Go语言开发,是一个代理中间件,和Redis一样使用Redis协议对外提供服务,客户端向Codis发送指令,Codis将指令转发到Redis实例执行,将返回结果转回客户端。

Codis分片原理

Codis如何将特定的key转发到特定的Redis实例呢?

Codis将所有key默认划分为1024个槽,对客户端传过来的key进行crc32运算计算hash值,然后将hash值对1024取模获得余数,这个余数就是对应key的槽。

每个槽会映射到唯一的Redis实例中,这种映射关系由Codis维护。

若集群节点较多,可以将1024配置更大的数,如2048、4096。

不同的Codis实例之间槽关系如何同步?

Codis将槽关系存储在zookeeper中,并提供Dashboard用来观察和修改槽关系,槽关系变化时,Codis Proxy会监听到变化并重新同步槽关系。

扩容

Codis在扩容过程中接收到正在迁移槽中的key后,会强制让该key进行迁移,然后再将请求转发到新的Redis实例。

自动均衡

集群中新增实例时手工均衡slots太繁琐,所以Codis提供自动均衡功能。

自动均衡会在系统空闲时观察每个Redis实例对应的槽数量,如果不平衡,就会自动进行迁移。

Codis的代价

Codis的key分散在不同实例中,因此就不支持事务了。

同样rename的两个key如果在不同的实例中,rename的操作就无法进行,Codis官方文档中给出了不支持的指令。

为了支持扩容,单个key对应的value不宜过大。

Codis集群配置中心使用zk实现,意味着部署上增加了zk的代价。

Codis的优点

设计上比官方Cluster方案简单很多,其将分布式问题交给第三方zk/etcd去负责。

Codis的后台管理

Codis提供服务器集群管理功能,可以增加分组、增加节点、执行自动均衡等指令。

猜你喜欢

转载自www.cnblogs.com/ikct2017/p/9503531.html