1.主从复制原理
Redis的主从同步分为两种,分为全量同步和增量同步。
- 从机第一次连接上主机是全量同步。
- 断线重连很有可能触发全量同步也有可能是增量同步。
全量同步主要是借助RDB持久化快找我实现的。
增量同步就复杂一些:
主服务器和从服务器会分别维护一个复制偏移量,主服务器每次向从服务器传播N个字节的数据时,就将自己的复制偏移量的值加上N,从服务器每次收到主服务器传播来的N个字节的数据时,就将自己的复制偏移量值加上N。
复制积压缓冲区是由主服务器维护一个固定长度(fixed-size)先进先出(FIFO)队列,默认大小是1MB。它主要的作用就是当主服务器进行命令传播时,不仅将命令发送给所有从服务器,还会将命令入队到复制积压缓冲区。如果主服务器向从服务器传播数据时发生断线,主服务器会将复制积压缓冲区偏移量的所有数据都发送给从服务器(发送的是断线之后的的数据),如果在断线重连的过程中,复制积压缓冲区存储的数据量不够,那么就会从AOF日志中读取需要的数据。
2. 哨兵模式
当主节点宕机时,为了系统的可用性,就需要选取一个从节点晋升为主节点,哨兵机制的出现就是为了解决这个难度。
哨兵节点有以下作用:
-
监控(Monitoring): sentinel会不断检查Master和Slave是否运行正常。
-
提醒(Notification): 当被监控的某个Redis节点出现问题时, sentinel 可以通过 API向管理员或者其他应用程序发送通知。
-
自动故障转移(Automatic failover): 当Master不能正常操作时哨兵会开始一次故障转移。
具体的选举流程如下所示: