小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Redis 提供了主从库模式来提高可靠性,主从库之间一般采用读写分离的方式。其中,主库接收写操作并将数据的变化同步到从库,主从库都可以接收度操作请求。在一个主从架构中,主库有一个,从库可以有一个或者多个。
本文主要写主从库之间数据同步的原理。
建立主从关系非常简单,只要在即将作为从库的实例上使用 replicaof 命令,并指定主库的地址和端口号,即可。
replicaof 192.168.1.1 6379
复制代码
执行之后,主从库之间会进入建立连接的阶段。从库向会发送 psync ? -1
的命令,表示请求进行数据同步,主库收到后,会根据这个命令中提供的参数进行数据的复制。
这个命令一同有两个参数:
- 第一个参数是主库的 runID,runID 是随着 Redis 实例的启动随机产生的一个实例 ID。在从库第一次向主库请求数据同步的时候,并不知道主库的 runID,因此这个值为
?
。 - 第二个参数是复制进度 offset,第一次请求复制数据时,这个值是
-1
。
当主库收到 psync 命令的时候,都会用 FULLRESYNC
命令响应,这个命令代表全量复制当前的数据,响应时会带上主库的 runID 和目前的复制进度 offset,从库在收到这两个信息的时候,会记录下来。
主库通过 RDB 文件的形式,将当前数据全量复制给从库。RDB 文件通过执行 bgsave 命令生成,然后发送给从库。由于是全量同步,从库在接收到 RDB 文件后,会清空当前的数据,然后加载接受到的 RDB 文件。
从主库开始生成 RDB 文件,到完成第一次数据复制(全量复制),需要一定的时间。在这段时间内,主库也在不断进行数据操作,这些操作同样需要同步给从库,在这个时间段内,主库执行过的操作,会记录在内存中的 replication buffer 中,后续的所有主库数据操作,都会保存在 replication buffer 中。
在完成全量复制后,主从库之间会一直维持一个长连接,通过这个连接,主库不断地向从库同步命令操作,主从库之间的数据同步就实现了。