Redis 集群

2021-02-28  本文已影响0人  Oliver_Li
节点
  1. Redis集群提供分片部署,是最常见的线上部署方式,集群和单机节点不一样,集群只有一个库,集群常见最少6节点,3主3从,3个从节点分别复制3个主节点,达到故障转移的效果。
  2. 开始时需要在配置中开启cluster-enabled,可以自动分配redis-cli --cluster create --cluster-replicas 1 ip:port ...(5.0后redis-trib已不可用)代表各主节点一个从节点并且槽平均分,也可以手动加入,手动加入后默认都是master,需要手动分配从节点和槽。
  3. 结构方面每个节点都保存一个clusterStatus+clusterNode字典,clusterStatus负责标记当前节点的状态等信息,clusterNode代表集群里每个节点的信息,包括每个节点的名字、ip端口、tcp套接字、槽信息等。
  4. 新节点加入集群后通过gossip协议传播给其他节点,每个节点都维护着集群里各个节点信息。
  1. 集群一共16384个槽,分布在每个主节点上,每个数据都会通过crc(16) & 16383的方式确定槽的位置,进而确定节点把具体数据放入该节点的槽里。
  2. 集群初始化时节点是未分配的,所有节点必须都分配下去才可以正常运行,手动分配后会在每个节点的clusterNode字典内标识,使用时就可以知道数据是否在当前节点,如果当前节点不存在会返回MOVED错误并夹带需要跳转节点信息。
  3. 加入新节点时,为了槽能够平均分布在主节点,一般都会重新分配,Redis提供在线迁移,因为是在线迁移,所以必然会出现查询到正在迁移的数据,会出现ASK错误,和MOVED错误类似,当前节点知道数据正在迁移ASK也会引导用户到新节点进而完成查找。
集群复制
  1. 集群的主从复制流程和复制部署模式类似,看之前文章即可。
主从切换
  1. 从节点会复制主节点数据已达到灾备转移的目的,所有节点会向随机集群内三个节点定时发送Ping消息,cluster-node-timeout默认15秒,某主节点宕机后未在超时时间内返回响应会被探测的节点认定为PFAIL即疑似下线,并通知其他节点,集群节点间会通过gossip发送下线节点信息,当集群内大部分节点都认为某节点PFAIL时,会整体群发让其他节点都让这个节点标记为FAIL正式下线,所以一般为了可用性cluster-node-timeout会设置更短超时如5秒,保证快速启动故障转移。
  2. 如果宕机为主节点,会发生故障转移,从节点提升为主节点,并向集群内其他节点发送消息,声明代替之前宕机的主节点工作。从节点会通过raft算法进行选举,需要注意的是这个参与投票的是活着的所有master节点,具体raft机制后续会写,真正线上使用时一个从节点保证正常工作即可,所以一般不会有选举冲突。

上一篇下一篇

猜你喜欢

热点阅读