redis主从架构,一主多从,可以满足高可用和高并发,出现实例宕机进行主备切换,配置读写分离缓解Master读写压力。
使用官方推荐的哨兵(sentinel)机制就能实现,当主节点出现故障时,由Sentinel自动完成故障发现和转移,并通知应用方,实现高可用性,
它有四个主要功能:
通过sentinel模式启动Redis后,自动监控master/slave的运行状态,基本原理是,心跳机制+投票裁决。
每个sentinel会向其他sentinel,master,slave定时发消息,以确认对方是否活着,如果发现对方在指定时间未回应,则暂时认为对方宕机。
若哨兵群中多数sentinel都反应某一master没响应,系统才认为该master真正宕机,通过Raft投票算法,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置。
哨兵至少需要3个实例 ,来保证自己的健壮性,…有待补充。
有两种数据丢失的情况:
1)异步复制导致的数据丢失:因为master->slave的复制是异步的,所以可能有部分数据还没复制到slave,master就宕机了。此时这些数据就丢失了
2)脑裂导致的数据丢失:某个master所在机器突然脱离了正常的网络,跟其他slave机器不能连接,但是实际上master还活着,此时哨兵可能会认为master宕机了,然后开启选举将其他的slave切换成了master。这个时候,集群就会有两个master,也就是所谓的脑裂,此时虽然某个slave被切换成master,但是client可能还没来得及切换新的master,继续写向旧的master的数据可能也丢失了。因此旧的master再次恢复的时候,会被作为一个slave挂到新的master,自己的数据将被清空,重新从新的master复制数据。
1)一个slave实例,无论是第一次连接还是重新连接到master,都会发出一个SYNC命令。
2)当master收到SYNC命令之后,会做两件事,master在后台保存数据到磁盘(rdb快照文件)和master将新收到的写入和修改数据集的命令存入缓冲区(非查询类)。
3)当master在后台把数据保存到快照文件之后,master会把这个快照文件传输给slave,而slave把内存清空以后,加载该文件到内存中。
4)master也会把此前收集到缓冲区的命令,通过redis命令协议形式转发给slave,slave执行这些命令,实现和master同步。
5)master/slave此后会不断通过异步方式进行命令的同步,达到最终的数据一致。
1)通过scan命令扫库,当redis的key被扫到的时候,相当于访问了该key,同样也会做过期检测,充分发挥redis惰性删除的策略,这个方法大大降低脏数据的读取概率,但缺点是会给数据库造成一定的压力,否则影响线上业务的压力。
2)redis加入了一个新特性解决主从不一致导致数据过期,增加了key是否过期以及对主从库的判断,如果key已经过期,当前访问的master则返回null,当前访问的是从库,执行的只读命令也返回null。
1)惰性删除:当读或写到一个过期key,会触发惰性删除策略,直接删除这个过期key,这是被动的。
2)定期删除:由于惰性删除无法保证冷数据被及时清理,所以redis会定期淘汰一批过期key。
3)主动删除:当前已用内存超过maxMemory限定时,触发主动清理策略。主动设置的前提是设置了maxMemory的值。