4、集群

厨子大约 5 分钟数据库原创面试题Redis程序厨

4 Redis集群方案

https://www.cnblogs.com/51life/p/10233340.htmlopen in new window

4.0 主从复制

主从复制模式,主库和从库的数据一致,采取的是读写分离的方式,进而来降低Redis 服务器的压力

读操作:主和从都可

写操作:先写主,然后主同步给从(防止数据不一致)

主从复制过程

image-20211009212917390
image-20211009212917390

建立链接,使用RDB快照进行同步。

但是我们思考一下,同步过程中,主服务器继续执行写操作,那么从服务器则会漏掉这部分操作,所以主服务器在从服务器的同步过程中,会将新的写操作放到缓冲区里,从库同步完毕后,再执行缓冲区的文件,实现同步。

另外为了缓解主库同步压力,我们采取主-从-从的模式

如果主库和从库之间网络断开,则会导致不一致,主库这时会将其中断期间执行的操作,写入缓冲区,然后从库苏醒之后,会执行缓冲区的语句完成同步,不过缓冲区为环形数据结构,如果从库写入较慢,同样会有覆盖的风险,所以我们可以将该数据结构设置的大一些。

4.1 主从同步和故障切换存在哪些坑

主从数据不一致

用户从从库读到的数据和主库中的不一致,因为我们的写操作是落在主库上的,先操作主库,然后再同步到从库,所以有可能存在延迟的情况。

我们可以这样解决

  • 保证网络链接顺畅

  • 设定一个监视器,然后通过监视器来监控复制进度,当复制进度大于阈值时,则不让其从从库访问

读取过期数据

因为当有数据过期时,如果是在主库读取到,则会执行删除策略,然后同步到从库,但是如果在从库读到过期键时,则不会删除,3.2之前会返回原来的值,3.2之后会返回空值。

不合理配置

4.2 哨兵集群

哨兵模型算是主从复制模型的拓展,我们假设有四个节点,一主三从,当某个主节点挂掉之后,某个从节点顶替主节点。

我们可以通过哨兵节点来执行这个操作,我们的哨兵节点用来监控主节点,当发现主节点挂掉之后,选取某个从节点来替代主节点,

但是如果某天哨兵节点挂了之后,我们整个监控系统也就完蛋了,所以我们可以搭建哨兵集群,这样整个哨兵集群挂掉的概率就很小了,然后当其中一个哨兵判断主节点挂掉之后,询问其他节点该主节点是否挂掉,如果超过一定值的哨兵节点判断挂掉之后,则认定该节点已经挂掉。

https://zhuanlan.zhihu.com/p/65504905open in new window

https://www.cnblogs.com/flashsun/p/14692643.htmlopen in new window

4.3 Cluster

Redis集群是Redis 提供的分布式数据库方案,集群通过分片的来进行数据共享,并提供复制和故障转移功能。

一个Redis 集群通常由多个节点组成,下图为集群的创建过程。

img
img

集群的数据结构,clusterNode 结构保存了一个节点的当前状态,会保存自己的状态,还会保存其他节点的状态。

image-20211009213902204
image-20211009213902204

4.4 什么是槽指派?

Redis 集群通过分片的方式来保存数据库中的键值对,如果有槽没有得到处理,那么集群将处于下线状态。

集群中会通过slots数组进行来判断节点是否处理槽i,节点之间会告知其他节点自己负责什么槽。

在集群中执行命令

  • 如果键所在的槽并正好指派给了当前节点,那么节点立刻执行该命令

  • 如果键所在的槽没有指派给当前节点,那么节点会像客户端发送一个MOVED错误,指引客户端转向至正确节点。

Redis共有 16384个哈希槽,每个key通过CRC16的校验和对16383(含有0)做与运算,来计算key在哪个槽。

4.5 说说什么是 ASK 错误?

这个错误多发生于重新分片的过程中,我们将某节点的槽迁移到另一节点时,此时客户端传来命令,如果没有在对应的节点内查询到该槽中值,则说明已经发生了迁移,此时则返回 ASK 错误,然后开始去目标节点进行查询。

4.6 什么是 Moven 错误?

这是正常请求错误,告知该数据不在该服务器的槽里。

4.7 故障检测?

每隔一段时间,主节点之间会发送ping信息,如果没有一定时间内,得到回应,那么则被认为是疑似下线,当半数节点认为其疑似下线时,则认定其为已下线。

4.8 故障转移步骤?

  • 复制下线主节点的所有从节点里面,会有一个节点被选中。

  • 被选中的节点会执行SLAVEOF no one 命令,成为新的主节点,

  • 将下线节点的所有槽指派下线,然后指向新的主节点。

  • 向其他节点发送ping信息,告知别人自己变成了主节点。