Redis主从同步是怎么实现的?redis主从复制的过程?
2 个回答
倾城倩影销魂态,如此佳人何处寻。韩立Redis 的主从同步(Replication)允许一个 Redis 实例(主节点,Master)将数据同步到一个或多个从节点(Slave),实现数据的高可用性、读写分离,以及数据冗余。下面详细讲解 Redis 主从同步的机制和过程。 ## **Redis 主从同步的类型** 1. **全量同步(Full Synchronization)** - 当从节点首次连接主节点,或者从节点的数据不一致时,会触发全量同步。 - 主节点将**整个数据快照(RDB)**发送给从节点,并将接下来的写入操作进行缓存,等待同步结束后应用到从节点。 2. **增量同步(Partial Synchronization)** - 增量同步是在全量同步完成后执行的。 - 主节点会把**从上次断开到现在的所有写操作(命令流)**发送给从节点,确保数据一致性。 - 使用**复制积压缓冲区(Replication Backlog Buffer)**记录这些命令,保证同步的高效性。 ## **主从同步的详细流程** ### **1. 从节点连接主节点** - 从节点通过 `SYNC` 或 `PSYNC` 命令向主节点发起同步请求: - **`SYNC`**:用于 Redis 2.x 及以前版本,触发全量同步。 - **`PSYNC`**:Redis 3.0 及以后版本支持,用于增量同步和断点续传。 ### **2. 判断同步类型** - 主节点会根据从节点的请求,决定执行全量同步还是增量同步: 1. **全量同步**:如果从节点初次连接或数据不一致。 2. **增量同步**:如果从节点和主节点的复制 ID 和偏移量匹配。 ### **3. 全量同步过程** 1. **主节点生成 RDB 快照**: 主节点在后台执行 RDB 快照,并将其发送给从节点。 2. **发送期间的写操作缓存**: 主节点在生成快照的过程中,新的写操作会存入复制缓冲区。 3. **从节点加载 RDB 文件**: 从节点收到 RDB 文件后会清空现有数据,并加载新的快照。 4. **应用复制缓冲区中的写操作**: 从节点加载 RDB 文件后,主节点会将缓存的写命令发送给从节点以保持同步。 ### **4. 增量同步过程** 1. **主节点通过复制积压缓冲区发送数据**: 主节点在复制积压缓冲区中记录最近的写命令,并根据偏移量发送给从节点。 2. **从节点按顺序应用命令**: 从节点根据接收到的写命令更新自己的数据。 ## **复制积压缓冲区(Replication Backlog Buffer)** - **定义**:主节点维护的一个**固定大小**的循环缓冲区,用于记录最近的写操作。 - **作用**:确保从节点断开后能快速恢复同步,避免再次触发全量同步。 - **恢复场景**:如果从节点短暂断开,重连时主节点会从复制积压缓冲区找到对应的偏移量,从而实现增量同步。 ## **主从同步的触发条件** 1. **初次启动从节点**:从节点连接主节点时会触发全量同步。 2. **主节点数据丢失或从节点数据不一致**:会触发全量同步。 3. **断线重连**:如果从节点断开后重连,且主节点的积压缓冲区中有完整的偏移量数据,则触发增量同步。 ## **主从同步的网络通信流程** 1. **心跳检测**: 主从节点之间会定期发送 **PING/PONG** 消息,用于检测网络连接是否正常。 2. **复制延迟**: 从节点会周期性向主节点汇报自己的同步状态(偏移量)。主节点根据偏移量判断是否需要发送增量数据。 3. **网络故障处理**: - 如果从节点长时间未能与主节点同步(复制积压缓冲区的偏移量被覆盖),从节点会重新进行全量同步。 ## **Redis 主从同步配置示例** 1. **主节点配置**: 在 `redis.conf` 中配置主节点(无需特别设置,只需启动 Redis 服务): ```bash redis-server /path/to/redis.conf ``` 2. **从节点配置**: 在 `redis.conf` 中指定主节点的 IP 和端口: ```bash replicaof 192.168.1.100 6379 ``` 或在命令行执行: ```bash redis-cli replicaof 192.168.1.100 6379 ``` ## **主从同步的优缺点** ### **优点** - **读写分离**:主节点负责写,从节点提供读服务,提升性能。 - **高可用性**:主节点故障时,可以切换到从节点继续提供服务(配合哨兵模式实现)。 - **数据冗余**:保证数据不会因为单点故障而丢失。 ### **缺点** - **同步延迟**:从节点的数据与主节点之间可能存在一定的延迟。 - **一致性问题**:在主节点宕机的情况下,可能会丢失未同步到从节点的数据。 ## **总结** Redis 主从同步通过 **全量同步** 和 **增量同步** 实现数据一致性。在同步过程中,主节点会根据从节点的状态选择合适的同步方式。使用 **复制积压缓冲区** 保证断点续传,避免频繁触发全量同步。通过配置读写分离,Redis 可以提升性能和系统的高可用性。结合哨兵模式,还能实现自动故障转移。编辑于 2024-10-28 02:42 •IP属地 美国举报评论收藏
有些东西不需要答案,态度就是答案。路飞主从节点建立连接后,从节点会进行判断: 1.如果这是从节点之前没有同步过数据 属于初次复制,会进行全量重同步,那么从节点会向主节点发送PSYNC?-1 命令,请求主节点进行全量重同步。 2.如果从节点不是初次复制(例如出现掉线后重连) 这个时候从节点会将之前进行同步的Replication ID(一个随机字符串,标识主节点上的特定数据集)和offset(从服务器当前的复制偏移量)通过PSYNC id offset命令发送给主节点,主节点会进行判断, 如果Replication ID跟当前的Replication ID不一致(可能主节点进行了变化),或者是当前buffer缓冲区中不存在对应的offset,那么会跟上面的初次复制一样,进行全量重同步。 如果Replication ID跟当前的Replication ID一致并且当前buffer缓冲区中存在对应的offset,那么会进行部分重同步。(部分重同步是Redis 2.8之后的版本支持的,主要基于性能考虑,为了断线期间的小部分数据修改进行全量重同步效率比较低) **全量重同步** 主节点会执行BGSAVE命令,fork出一个子进程,在后台生成一个RDB持久化文件,完成后,发送给从服务器,从节点接受并载入RDB文件,使得从节点的数据库状态更新至主节点执行BGSAVE命令时的状态。并且在生成RDB文件期间,主节点也会使用一个缓冲区来记录这个期间执行的所有写命令,将这些命令发送给从节点,从节点执行命令将自己数据库状态更新至与主节点完全一致。 **部分重同步** 因为此时从节点只是落后主节点一小段时间的数据修改,并且偏移量在复制缓冲区buffer中可以找到,所以主节点把从节点落后的这部分数据修改命令发送给从节点,完成同步。 **命令传播** 在执行全量重同步或者部分重同步以后,主从节点的数据库状态达到一致后,会进入到命令传播阶段。主节点执行修改命令后,会将修改命令添加到内存中的buffer缓冲区(是一个定长的环形数组,满了时就会覆盖前面的数据),然后异步地将buffer缓冲区的命令发送给从节点。发布于 2022-02-13 18:21 •IP属地 广西举报评论收藏
公众号进入网站体验更佳

