Redis 的主从同步机制用于在多个 Redis 实例之间复制数据,以实现数据冗余、读写分离和高可用性。下面为你详细介绍 Redis 主从同步的过程,它主要分为全量同步和增量同步。
全量同步
全量同步一般发生在从服务器初次连接主服务器或者从服务器数据与主服务器差距过大时,其具体步骤如下:
- 建立连接:从服务器向主服务器发送 SLAVEOF 命令,以此来声明自己要成为主服务器的从服务器,从而建立两者之间的网络连接。
- 主服务器确认并开始同步:主服务器收到 SLAVEOF 命令后,会执行 BGSAVE 命令,在后台创建一个 RDB 文件,该文件包含了主服务器当前的所有数据。在 BGSAVE 执行期间,主服务器会将新接收的写命令记录到一个缓冲区中。
- 发送 RDB 文件:当 BGSAVE 完成后,主服务器会将生成的 RDB 文件发送给从服务器。从服务器接收到 RDB 文件后,会先将自己当前的数据清空,然后再将 RDB 文件中的数据加载到内存中。
- 同步缓冲区命令:主服务器将在 BGSAVE 期间记录在缓冲区中的写命令发送给从服务器,从服务器执行这些命令,使得自身数据状态与主服务器在 BGSAVE 结束时的数据状态一致。
增量同步
增量同步主要在全量同步完成之后,用于同步主服务器新产生的写操作。其过程如下:
- 持续复制写命令:在全量同步完成后,主服务器会持续将新接收到的写命令发送给从服务器。这些写命令会按照执行顺序依次发送,从服务器接收到命令后会在本地执行,以此保证与主服务器的数据一致。
- 心跳检测与数据校验:主从服务器之间会定期发送心跳包,用于检测网络连接状态。同时,从服务器会向主服务器报告自己的复制偏移量,主服务器通过对比主从服务器的复制偏移量,来确保数据同步的正确性。如果发现偏移量不一致,主服务器会根据具体情况决定是继续进行增量同步,还是重新进行全量同步。
主从切换与故障恢复
- 从服务器故障:若从服务器发生故障,在其恢复后会重新向主服务器发起同步请求。若从服务器的数据与主服务器差距不大,通常会进行增量同步;若差距过大,则可能进行全量同步。
- 主服务器故障:当主服务器发生故障时,需要进行主从切换。可以通过手动方式或者使用 Redis Sentinel 或 Redis Cluster 等自动故障转移机制,选择一个从服务器升级为主服务器,其他从服务器再与新的主服务器进行同步。