问题:
配置了多个客户端,那么调用setex()方法的时候,那么数据缓存到哪个服务器呢?
……
实际上Redis集群中内置了16384个哈希槽,搭建集群时,每台服务器都分配了固定数量的哈希槽。当需要存数据时,redis对key进行出crc16算法运算,然后对运算结果去余,把数据映射到不同的redis服务器。
一、Redis Cluster架构
Redis3.0以后就支持了redis-cluster,采用无中心结构,每个节点保存数据和整个集群的状态,每个节点都和其他节点连接。
架构图:
结构特点:
a、所有redis节点彼此互联(Ping-Pong机制),内部使用二进制协议优化传输速度和宽带;
b、节点的fail是通过集群中超过半数的节点检测失效时才生效;
c、客户端和redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可;
d、redis-cluster把所有物理节点映射到0-16383个slot上(不一定平均),cluster负责维护node-slot-value;
e、redis将16384个slot分配好后,当需要存储数据时,使用crc16(key) mod 16384的值,然后决定放到slot中。
d、取数据时,也是通过crc16(key) mod 16384来确定去哪台服务器取数据。
二、节点分配
三个主节点,可以在一台服务器,也可以多台,使用哈希槽(hash slot)来分配16384个slot,得到如下结果:
A节点:0-5460
B节点:5461-10922
C节点:10923-16383
新增一个节点,取各个节点前一部分的slot分配到新的节点上:
A节点:1365-5460
B节点:6827-10922
C节点:12288-16383
D节点:0-1364,5461-6826,10923-12287
三、主从模式
redis-cluster为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点备份主节点数据,当主节点挂掉后,从从节点中选取一个当做主节点,从而保证集群不会挂掉;