Redis主从同步
数据存储在Redis中,如果Redis故障了就无法读取数据,就算有AOF和RDB,那也得Redis修复好了才有用,在修好之前的这段时间里要怎么办呢?主从同步就是解决了这个问题。
Redis主从同步,第一次同步的时候,会对数据进行全量同步,主库会把所有数据以RDB的形式发给从库,因为之后主库在更新数据后,都要把更新的数据发给从库,从库太多了的话就会让主线程频繁用fork,也会占用主库网络带宽,会减慢主库的速度,因此推出了主从从模式。如果主库从库间的网络断了,主库会记录这段时间的数据,并把它发送到环形的缓冲区。待网络恢复,如果从库发送的数据位置在缓冲区中,那么可以进行增量同步,否则就只能进行全量同步。
Redis哨兵
Redis如果主库发生故障了,不可以进行写操作了,就需要哨兵来解决。哨兵会监控,选主,通知。哨兵会发送ping命令给主库从库,如果没有ping到,就会认为该库主观下线。默认有哨兵数量/2+1的哨兵认为主库主观下线就会认为该库客观下线,就会开始选择从库了。首先会把从库中稳定性不好的,之前经常和主库断联的从库筛选掉,再根据用户给不同从库配置的优先级来选,
如果优先级一样,就会根据从主库那同步到的数据的多少来选,最后会从id小的从库当主库。
Redis哨兵机制
Redis的哨兵通过pub/sub的方式来发现其他哨兵和从库。在哨兵连接到主库后,会把自己的ip发布到主机上,其他哨兵再连接主库时就会订阅到这个ip,就可以进行连接了。哨兵会给主库发送命令,让主库把从库的ip发送给它,然后跟从库也建立连接。如果主库故障,那么哨兵会执行主从切换,但是在此之前会先选出执行此操作的哨兵,会进行投票,必须到哨兵数量/2+1才可以进行主从切换,否则会休息一会重新选举。
所以如果5个哨兵,故障了3个,客观下线数量设置为2,只能判定主库客观下线,不可以进行主从切换。
Redis集群
Redis存储大量数据时,可以增加内存,也可以增加实例。
增加内存会使得fork命令花费的时间变长。
增加实例也就是Redis集群,可以把数据分散给不同的实例,执行fork的时候也就可以更加迅速了。客户端在访问一个实例后就知道其他实例的消息了,因为实例在连接的时候,会把其他实例的信息和hash槽保存下来,但如果重新分配hash槽或者负载均衡的话客户端就不会知道,这个之后客户端向Redis发送数据,如果已经全部分布好了,就会告诉客户端重定向地址,让客户端再去访问,如果还没分布好,就会返回一个错误让客户端先进行等待。