redis - 集群知识

Redis主从同步与Cluster集群机制解析

主从同步

增量同步

主节点会把变更的指令记录在本地的buffer中,然后异步的同步到从节点。从节点同步后会告诉主节点同步的偏移量。

buffer是一个定长的环形数组,如果从节点的同步速度小于主节点的写入速度,buffer会覆盖前面的内容。

此时需要全量同步

快照同步(全量)

其实就是rdb文件。

从节点同步时会清除节点数据后再开始同步。全量同步期间,主节点的修改仍然在进行,如果再次期间,buffer再次被覆盖,会再次触发全量同步。

Cluster

分槽

Cluster 将所有数据划分为16384个槽位,每个节点负责一部分槽位。

client连接集群时,会得到集群的槽位配置信息,保存在本地,下次请求的时候就可以明确节点(对key进行hash运算,然后16384进行取模运算)。

重定向

当客户端向一个错误的节点发送指令后,会收到MOVED的返回指令,随后客户端会更新自己的槽位配置。

迁移

cluster 提供工具 redis-trib 可以手动的调整槽位的分配关系,迁移是以槽为单位的。

迁移的过程:从源节点获取内容-存到目标节点-从源节点删除

删除的过程是阻塞的,直到删除完成。所以,如果遇到大key,可能会导致节点阻塞

在迁移的过程中,客户端可以正常访问。客户端先尝试访问旧节点,如果数据还在,那就正常返回;如果数据不在,会返回**-ASK**(因为旧节点不知道是数据不存在还是已经迁移到新的节点上了)。此时,客户端先去目标节点发送不带任何参数的ASKING,然后再进行正常的请求。

原因是,在迁移完成之前,目标节点不会管理新的槽位,如果此时正常请求目标节点,会返回MOVED,然后客户端又要重新请求旧的节点。此时重定向循环,所以要实现告诉从节点要把这个槽位当成是自己的来处理。

容错

集群中的每个节点可以设置多个从节点,当主节点发生故障后,集群会自动升级某个从节点为主节点,如果没有从节点,集群将是不可以用的状态。

怎么确定节点故障??

如果一个节点发现某个节点失联了,会向整个集群进行广播,这样别的节点可以收到这条广播。如果大多数的节点都认为失联了,则可以对外公布进行主从切换了

感知(槽位迁移感知和集群变更感知)

槽位迁移:

上面说了,节点有两个特殊的error指令 MOVED和ASK,其中只有MOVED会更新客户端的槽位配置。ASK并不会影响后续的指令,如果迁移完成,再次访问后同样会收到MOVED的指令,然后在更新槽位配置即可。

集群变更感知
两种场景:

  1. 目标节点挂了:客户端会抛出连接异常,紧接着会随机挑算一个节点去重试,如果这个节点上没有数据,则返回MOVED 告知客户端正确的节点,客户端即可更新。
  2. 运维下掉某个节点:客户端访问后会收到clusterDown的错误,此时客户端会关闭所有的连接并清空槽位配置信息,然后向上层抛出异常,等下次请求到来的时候会重新初始化节点信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值