redis常用的使用模式是主从,主挂了启动从库,但是这个是单个实例的,如果处理数据量量级太大,(具体不好说没碰到过,几亿,几十亿条记录?),单个redis会遭遇读写性能的瓶颈。
redis cluster试图解决这个问题,来看下它的设计目标:
1,高性能,线性分布到1000+机器上
2,写入的安全度是可接受的:大部分写请求直接落到master节点,这样会保证写入是安全的
3,可用性:redis server机器down掉后,服务是可用的
对于3,如何保证可用性的?
每台redis server都有至少一个从节点,如果主节点down掉,自动启用从节点,从节点来保证服务是可用的(数据的同步可想象成msyql的binlog追加)。
如果主server,和对应的从server同时down掉,是会影响服务的。
细节1:redis实现了对于某些key强制写入相同的节点的能力。是hash tags技术
Redis Cluster implements a concept called hash tags that can be used in order to force certain keys to be stored in the same node.
细节2:在手工reshard的时候,multi操作在cluster模式中有时候会不可用,但是单个key操作总是可用的
However during manual reshardings, multi-key operations may become unavailable for some time while single keys operations are always available.
细节3:cluster不保证key能够放到不同的数据库上(因为redis支持选择database,类似于mysql),只会放在0号数据库上。cluster模式不支持select操作
Redis Cluster does not support multiple databases like the stand alone version of Redis, there is just database 0, and the SELECT command is not allowed.
细节4:如果检查redis的节点是否坏掉?
redis cluster bus就是解决这个问题的,redis的每个server节点都会主动探测其它所有节点的状态,如果down掉,可能会自动执行slave升级到master的动作。
redis的server状态和key的map是server端来管理维护的,redis的client理论上不用知道key是分布在哪个server node上的,但是如果client能缓存对应关系,性能提升是明显的
细节5:write safety未完成
细节6:fail的几种情况
fail1:大多数节点fail,整个系统fail
recovery:如果master节点fail,从节点升为master
fail2:如果所有的从节点被升为master,这个时候再有一个master fail,整个系统fail
参考:
http://www.redis.io/topics/cluster-spec
http://redis.io/topics/cluster-tutorial