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