4、集群
4 Redis集群方案
https://www.cnblogs.com/51life/p/10233340.html
4.0 主从复制
主从复制模式,主库和从库的数据一致,采取的是读写分离的方式,进而来降低Redis 服务器的压力
读操作:主和从都可
写操作:先写主,然后主同步给从(防止数据不一致)
主从复制过程

建立链接,
使用RDB快照进行同步。
但是我们思考一下,同步过程中,主服务器继续执行写操作,那么从服务器则会漏掉这部分操作,所以主服务器在从服务器的同步过程中,会将新的写操作放到缓冲区里,从库同步完毕后,再执行缓冲区的文件,实现同步。
另外为了缓解主库同步压力,我们采取主-从-从的模式
如果主库和从库之间网络断开,则会导致不一致,主库这时会将其中断期间执行的操作,写入缓冲区,然后从库苏醒之后,会执行缓冲区的语句完成同步,不过缓冲区为环形数据结构,如果从库写入较慢,同样会有覆盖的风险,所以我们可以将该数据结构设置的大一些。
4.1 主从同步和故障切换存在哪些坑
主从数据不一致
用户从从库读到的数据和主库中的不一致,因为我们的写操作是落在主库上的,先操作主库,然后再同步到从库,所以有可能存在延迟的情况。
我们可以这样解决
保证网络链接顺畅
设定一个监视器,然后通过监视器来监控复制进度,当复制进度大于阈值时,则不让其从从库访问
读取过期数据
因为当有数据过期时,如果是在主库读取到,则会执行删除策略,然后同步到从库,但是如果在从库读到过期键时,则不会删除,3.2之前会返回原来的值,3.2之后会返回空值。
不合理配置
4.2 哨兵集群
哨兵模型算是主从复制模型的拓展,我们假设有四个节点,一主三从,当某个主节点挂掉之后,某个从节点顶替主节点。
我们可以通过哨兵节点来执行这个操作,我们的哨兵节点用来监控主节点,当发现主节点挂掉之后,选取某个从节点来替代主节点,
但是如果某天哨兵节点挂了之后,我们整个监控系统也就完蛋了,所以我们可以搭建哨兵集群,这样整个哨兵集群挂掉的概率就很小了,然后当其中一个哨兵判断主节点挂掉之后,询问其他节点该主节点是否挂掉,如果超过一定值的哨兵节点判断挂掉之后,则认定该节点已经挂掉。
https://zhuanlan.zhihu.com/p/65504905
https://www.cnblogs.com/flashsun/p/14692643.html
4.3 Cluster
Redis集群是Redis 提供的分布式数据库方案,集群通过分片的来进行数据共享,并提供复制和故障转移功能。
一个Redis 集群通常由多个节点组成,下图为集群的创建过程。

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

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信息,告知别人自己变成了主节点。
