面试题答案
一键面试主从复制方面
- 主库处理:
- 在AOF重写期间,主库依然正常接收写命令。为了确保从库能获取完整的数据,主库会将重写缓冲区(AOF重写过程中用于保存新写入命令的缓冲区)中的命令发送给从库。主库会在重写过程中,将新收到的写命令同时写入重写缓冲区和旧的AOF文件(用于保证旧AOF文件的完整性,直到新AOF文件重写完成并替换旧文件)。
- 当AOF重写完成后,主库会发送一个
BGREWRITEAOF
完成的信号给从库,告知从库可以进行相关的更新操作。
- 从库处理:
- 从库在接收到主库发送的重写缓冲区中的命令时,会按照顺序执行这些命令,以保证和主库数据的一致性。从库在主库AOF重写期间,依然保持和主库的正常同步,接收主库的命令并应用。
持久化机制方面
- 旧AOF文件的作用:
- 在AOF重写开始时,Redis会创建一个子进程来进行实际的重写操作。在子进程重写期间,主进程继续接收写命令,并将这些命令写入旧的AOF文件。这保证了即使在重写过程中出现故障,旧的AOF文件依然可以用于恢复数据,确保了数据的完整性。
- 新AOF文件的替换与验证:
- 当子进程完成AOF重写后,会生成一个新的AOF文件。此时,主进程会将重写缓冲区中的命令追加到新的AOF文件末尾,保证新AOF文件包含重写期间的所有写操作。
- 主进程会使用
rename
系统调用将新AOF文件原子性地替换旧AOF文件。rename
操作在大多数文件系统上是原子的,这确保了不会出现部分替换的情况,从而保证了新AOF文件能完整地替换旧AOF文件用于后续的数据恢复。 - 在替换完成后,Redis可以通过对新AOF文件进行校验(例如使用
redis - check - aof
工具),确保文件格式正确,进一步保证数据的完整性。