Redis实现服务高可用

1、主从复制:主服务器可进行读写操作,当发生写操作时自动将写操作同步给从,而从一般只读并接受主服务器同步过来写操作命令,然后执行这条命令。主从服务器间的命令复制异步进行。

2、哨兵模式:解决主从服务器宕机时需要手动恢复的问题,可以监控主从服务器,且提供主从节点故障转移的功能

3、切片集群模式:当Redis缓存数据量大到一台服务器无法缓存时就需要用Redis切片集群方案,将数据分在不同服务器上来降低系统对单主节点的依赖,提高Redis服务读写性能

主从复制实现

主从服务器第一次同步时采用全量复制,此时主服务器会两个耗时的地方分别是生成 RDB 文件和传输 RDB 文件。为避免过多从服务器和主服务器进行全量复制,可以把一部分从服务器升级为「经理角色」,让它也有自己的从服务器,通过这样可以分摊主服务器的压力。

第一次同步完成后,主从服务器都会维护着一个长连接,主服务器在接收到写操作命令后就会通过这个连接将写命令传播给从服务器,来保证主从服务器的数据一致性。

如果遇到网络断开,增量复制就可以上场了,不过这个还跟 repl_backlog_size 这个大小有关系。如果它配置过小,主从服务器网络恢复时,可能发生「从服务器」想读的数据已被覆盖,那么这时就会导致主服务器采用全量复制的方式。所以为避免这种情况的频繁发生,要调大这个参数的值,以降低主从服务器断开后全量同步的概率。

哨兵机制

实现主从节点故障转移。它会监测主节点是否存活,如果发现主节点挂了就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端。为减少误判的情况,哨兵在部署的时候不会只部署一个节点,而是用多个节点部署成哨兵集群最少三台),通过多个哨兵节点一起判断,就可以就可以避免单个哨兵因为自身网络状况不好,而误判主节点下线的情况

如何解决集群脑裂导致数据丢失(类raft)

当主节点发现从节点下线或通信超时总数量小于阈值时,禁止主节点写数据而直接把错误返给客户端。等新主库上线就只有新主库能接收和处理客户端请求,此时新写数据会被直接写到新主库中。而原主库会被哨兵降为从库,即使它的数据被清空了也不会有新数据丢失