Redis Sentinal 主要用于高可用,在 master 宕机时会自动将 slave 提升为 master,继续提供服务。
Redis Cluster 则侧重于扩展性,在单个 Redis 内存不足时,使用 Cluster 进行分片存储。
Redis Sentinal
Sentinel(哨岗、哨兵)是 Redis 的高可用性(high availability)解决方案:由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
初始状态下,Server1 为主服务器,其余为从服务器。
假设这时,主服务器 Server1 进入下线状态,那么从服务器 Server2、Server3、Server4 对主服务器的复制操作将被中止,并且 Sentinel 系统会察觉到 Server1 已下线。
当 Server1 的下线时长超过用户设定的下线时长上限时,Sentinel 系统就会对 Server1 执行故障转移操作:
- 首先,Sentinel 系统会挑选 Server1 属下的其中一个从服务器,并将这个被选中的从服务器升级为新的主服务器;
- 之后,Sentinel 系统会向 Server1 属下的所有从服务器发送新的复制指令,让它们成为新的主服务器的从服务器,当所有从服务器都开始复制新的主服务器时,故障转移操作执行完毕;
- 另外,Sentinel 还会继续监视已下线的 Server1,并在它重新上线时,将它设置为新的主服务器的从服务器;
Redis Cluster
Redis 集群是 Redis 提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。
Redis Cluser 采用虚拟槽分区,所有的键根据哈希函数映射到0~16383整数槽内,计算公式:slot=CRC16(key)&16383 。
每一个节点负责维护一部分槽以及槽所映射的键值数据。
Redis 虚拟槽分区解耦了数据与节点之间的关系,简化了节点扩容和收缩的难度,当然 Redis 集群也有很多功能上的限制:
- key 批量操作支持有限。如 mset、mget,目前只支持具有相同 slot 值的 key 执行批量操作。对于映射为不同 slot 值的 key 由于执行 mget、mget 等操作可能存在于多个节点上因此不被支持;
- key 事务操作支持有限。同理只支持多 key 在同一节点上的事务操作,当多个 key 分布在不同的节点上时无法使用事务功能;
- key 作为数据分区的最小粒度,因此不能将一个大的键值对象如 hash、list 等映射到不同的节点;
- 不支持多数据库空间。单机下的 Redis 可以支持16个数据库,集群模式下只能使用一个数据库空间,即db0;
- 复制结构只支持一层,从节点只能复制主节点,不支持嵌套树状复制结构;