定义:
因为哨兵模式在主从节点切换的瞬间存在 访问瞬断 的情况,而且哨兵只有一个主节点对外提供服务,没办法支持很高的并发,所以redis提供了cluster
集群模式
redis内置cluster
集群模式,称为redis集群,具有 **高可用、分片**的特性,具有良好的水平扩展性。
Redis Cluster 将所有数据划分为16384个slots(槽位),集群中的每个节点负责其中一部分槽位,槽位的信息存储在每个节点中。
当客户端连接集群时,得到一份**集群槽位配置信息缓存在客户端本地**
当查找某个key时, key位置为:CRC16(key) mod 16384 【CRC16是一个hash算法】
由于客户端会缓存 槽位配置信息 在本地,当客户端计算出key的槽位,发到redis,节点会发现key所在槽位不归自己管理,这时候会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端从这个节点获取数据,同时会更新本地槽位配置信息。 【因为缓存信息过时了,节点让客户端重定位】
redis cluster节点间采用gossip协议进行通信
集中式:
优点:元数据的更新和读取,其他节点可以立即感知
缺点:所有元数据的更新压力全部集中在一个地方,导致元数据的存储压力
很多中间件使用zookeeper来集中式存储元数据
gossip:
优点:元数据的更新比较分散,降低压力
缺点:元数据的更新有延时可能导致 集群的一些操作会滞后
gossip通信的10000端口
每个节点都有一个专门用于节点间通信的端口,是它的端口号加上10000 【防火墙记得配置】
真实的网络世界会突然出现不可访问的情况
Redis Cluster 提供了一种选项cluster-node-timeout
,表示当某个节点持续 timeout 的时间失联时,才可以认定该节点出现故障,需要进行主从切换。
第二点的延迟计算公式
DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms
SLAVE_RANK —— slave从master中复制数据总量的排名rank,排名越前,代表数据越新,更有机会首先发起选举
问题:
出现 master 和 slave 连接丢失时,此时slave发起选举,就有两个master对外服务,【产生脑裂问题】当网络恢复后,其中一个master变为slave,丢失大量数据
解决:
# 写数据成功的最少同步slave数量 假设结点数为3 1主2从 min-replicas-to-write 1 ## 当主节点写入数据时,【根据配置】需要同步写入至少1个从节点的数据,才能写入成功
当redis.conf的配置cluster-require-full-coverage
为no时,表示当负责一个slot的master下线且没有相应的slave进行故障恢复时,【有一部分不能读写】 集群仍然可用,如果为yes则集群不可用。
因为新master的选举,需要得到 超过半数的master同意,slave才能变为master,如果只有两个master节点,选举无法进行。
奇数个master节点可以满足选举条件且节省一个节点,
比如3个master节点和4个master节点集群
奇数个节点是从 节省机器资源角度 考虑的
mset、mget
mset name summer age 18 # 报错,因为name和age落在不同的slot里,无法批量操作 # 解决 # key的前面加上{XX},这样参数数据分片hash计算的只会是大括号里的值,这样能确保不同的key能落到同一slot里去 mset {user1}:name summer {user1}:age 18