通过部署redis的主从复制和哨兵机制,可以提高redis的读的并发,但是单个master的容量是有限的(其他从节点完全复制master的数据,终究还是只有一台redis在存储数据),如果数据量达到一定的程度是会遇到瓶颈的,我们可以通过对主从复制进行水平扩展的方式,扩展为一个多主多从。

 

一、redis 集群(cluster)

可以支撑多个master和多个slave,也可以支撑海量数据的存储,实现高并发与高可用,哨兵机制也是一种集群,可以提高读请求的并发,但是不能提高写并发,而且数据容量依然是一个Redis的容量,同时容错方面有一些问题:比如,master在同步数据给slave的时候,这个时候数据是异步复制的,假设在复制的过程中,master挂掉了,那么slave中的数据就不是最新的,数据同步的时候是有时间延迟的,可以是几百毫秒、1秒、2秒,那么这段时间内的数据就可能丢失,即使老的master重新启动为slave后,那些新的数据依旧是丢失的,这便是主从复制(哨兵模式)的一个弊端。

redis 多个集群节点提示fail redis集群并发量_redis 多个集群节点提示fail

集群中一个master挂掉以后,它对应的slave就会顶替成为新的master,

Redis集群中各节点之间可以相互进行通信。

Redis集群中各节点之间都相互知道对方的全部信息,客户端与集群进行通信的时候,只需要与集群中的某一个结点建立连接即可。

redis集群中有多台redis服务器不可避免会有服务器挂掉。redis集群服务器之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了(客观下线),如果挂的是主节点,会进行主节点切换。

上面就是我们常说的为了容错而生的redis集群投票机制

redis 多个集群节点提示fail redis集群并发量_redis 多个集群节点提示fail_02

 

 二、槽点(slots)

Redis 集群中有 16384 个散列槽,槽点会被主节点平均分配,从节点不会有槽点,所有的数据都需要存在slots中。

redis 多个集群节点提示fail redis集群并发量_redis_03

redis 多个集群节点提示fail redis集群并发量_redis_04

 当我们使用set命令写的时候,Redis会对key使用hash进行运算,然后用hash值对16384进行求模,模值就是槽点的下标。

槽遵循一致性hash原则。

 

集群模式下没有选择数据库这个概念,只有一个数据库。

Redis集群中如果一个master和其对应的slave都挂掉了,那么存在上面的数据就无法get到了。