1、 Redis的主从模式

在之前的文档中,我们介绍了redis的集群主要有两种模式:哨兵模式和分片模式。而哨兵模式又是对主从模式的加强版,所以在分析哨兵模式前需要先分析主从模式。而主从模式最关键的地方在于将主服务器的数据同步到从服务器,保证集群内部数据的一致性。而数据同步又分为两部分:服务器中已经存在的数据和未来会执行产生的增量数据。对于已经存在的数据,redis为了保证数据的可靠性,会对其进行持久化操作。同步这部分数据只需要将持久化文件传给从服务器便可,所以在(3)到(10)中,分析了redis的持久化方式,并详细介绍了RDB和AOF的相关代码。

在了解了redis的持久化之后,再看主从服务器间的数据同步就非常简单了。只需要两步:首先在开始的时候主服务器更新一个持久化文件,然后将文件发送给从服务器,最后在执行新的命令的时候将命令同步给从服务器便可。示意如图:

redis cluster 集群数据不一致 redis集群 数据一致性_redis

上述这种方法,可以实现主从服务器的数据同步,但是存在一个问题。当从服务器因为故障造成主从数据不一致的时候,从服务器需要再进行一次数据同步,让主服务器再更新一个持久化文件再进行传播更新。在之前的持久化文件的分析过程中我们了解到持久化是比较耗时的,若从服务器故障的时间较短,两者之间的数据差别较小的时候,再进行这种操作就会很浪费服务器性能。

为了解决上述问题,redis引入了一个复制偏移量、复制缓冲区和服务器ID。

复制偏移量

主服务器在向从服务器传播命令的时候,会记录一个偏移量。这个偏移量实际是执行的命令的字节数的累加和,例如,在最开始的时候偏移量为0,然后服务器执行了一条命令,这条命令的字节长度为11,那么在传播命令的时候更新的复制偏移量为0+11=11,然后又有一条长度为12的命令,那么复制偏移量为11+12=23。从服务器在接收到命令的时候同样会记录一个偏移量,记录方式相同。若主从服务器的偏移量相同则代表了其数据一致。

复制缓冲区

主服务器在传播命令的时候,还会将命令记录在一个缓冲区中。这个缓冲区是一个固定长度的先进先出的队列。当主从数据不一致的时候,主服务器会先根据从服务器的复制偏移量在缓冲区中寻找数据,若有则直接发送给从服务器,若没有再执行最初的那种同步流程。

服务器ID

从服务器在复制主服务器数据的时候会记录主服务器的服务器ID,当再次从主服务器复制数据的时候会检查服务器ID,若ID不同则会直接执行最初的那种同步流程。这个在哨兵模式下比较重要。

这种新的数据同步模式入下图所示:

redis cluster 集群数据不一致 redis集群 数据一致性_服务器_02

从服务器在同步数据的时候,主服务器会先根据其偏移量在复制缓冲区中寻找数据,若存在需要的数据则直接将其发送给从服务器,若不存在则更新一个持久化文件,并将持久化文件发送给从服务器。