redis有三种集群方式:主从复制,哨兵模式和集群。
一,主从复制
主从复制是指让一个服务器去复制另一个服务器的数据,使得双方的数据保存一致,其中被复制的服务器为主服务器,复制的服务器为从服务器。当主服务器的数据发生改变时,主服务器会通知从服务器,保存数据的一致性。
在Redis中,使用slaveof命令来执行主从复制。
(一)旧版的主从复制实现
在旧版中,Redis的复制功能分为两步:同步和命令传播。
同步操作用于将从服务器的数据状态更新为主服务器的数据状态。
命令传播操作用于在主服务器的数据被修改时,通知从服务修改对应的数据,从而达到数据一致。
从服务器向主服务器发送slaveof命令后:
1. 从服务器向主服务器发送sync命令,主服务器会执行bgsave命令,在后台生成一个RDB文件,并用一个缓冲区记录从现在开始的所有写命令。
2. 从服务器接收并载入RDB文件,更新自己的数据。更新完成之后,主服务器会发送缓冲区中的命令,从服务器执行这些命令,最终主从服务器的数据保存一致。
3. 主从服务器保存一致后,当主服务器的数据发生修改时,会对从服务器执行命令传播操作,即将修改命令发送给从服务器,使得数据继续保存一致。
缺陷:
旧版的主从复制的实现有个很大的缺陷:在从服务器发生断线并重连之后,主从服务器之间会重新执行同步操作,即将主服务器的所有数据重新传到从服务器中。但实际上,在重连之后,主从服务器之间可能只有少量数据不同,大部分保存一致。这就使得有很多数据是无效的,效率极低。
(二)新版的主从复制实现
为了解决主从复制效率底下的问题,Redis从2.8开始,使用psync命令替代sync。
psync命令有两种模式:完整重同步和部分重同步。
完整重同步用于初次复制情况,和同步操作一致。
部分重同步用于断线重连后复制情况。
部分重同步的实现:
部分重同步,当从服务器断线重连后,如果条件允许,主服务器可以将从服务器断线期间执行的写命令发送给从服务器,从服务器只要接收并执行命令,就可以更新数据,更主服务器实现数据一致。