【发布时间】:2017-08-21 14:48:55
【问题描述】:
redis.conf 说:
1) Disk-backed:Redis master 创建一个新的进程来写入RDB 磁盘上的文件。稍后文件由父级传输 增量处理到从站
我只是不知道“由父进程转移到从属”是什么意思?
谢谢
【问题讨论】:
标签: redis replication
redis.conf 说:
1) Disk-backed:Redis master 创建一个新的进程来写入RDB 磁盘上的文件。稍后文件由父级传输 增量处理到从站
我只是不知道“由父进程转移到从属”是什么意思?
谢谢
【问题讨论】:
标签: redis replication
这很简单。首先将RDB文件读入一个缓冲区,然后使用socket.write将这个发送到salve的正在监听这个的端口。
实现比我说的要复杂。但这就是redis所做的。您可以参考 redis/src 中的 replication.c 了解更多详细信息。
已编辑:
是的,无磁盘机制只是使用子进程直接通过线路将 RDB 发送到从站,而不使用磁盘作为中间存储。
实际上,如果使用磁盘保存RDB,redis master可以同时服务多个slave,无需排队。一旦无盘复制服务于从属服务器,如果另一个从属服务器来并想要进行完全同步,则需要排队等待第一个从属服务器完成。所以还有另一个设置 repl-diskless-sync-delay 来等待更多的slave来做这个并行。
而这两种方法只有在出现问题后才会出现。在正常情况下,redis master和salve通过一条连接良好的线复制redis命令slave在master和slave之间保持相同。如果断线或从机跌落,则需要进行部分重新同步操作以获取丢失的部分从机。如果 psync 无法实现,它会尝试做完全重新同步。我们讨论的是完全重新同步。
这是完全同步的详细工作方式:
master 启动后台保存过程以生成 RDB 文件。同时它开始缓冲从客户端接收到的所有新的写命令。后台保存完成后,master将数据库文件传输给slave,slave将其保存在磁盘上,然后加载到内存中。然后主设备将所有缓冲的命令发送到从设备。这是作为命令流完成的,并且与 Redis 协议本身的格式相同。
并且无盘复制只是一个新功能,在这种情况下支持完全重新同步以应对缓慢的磁盘压力。有关它的更多信息,请参阅https://redis.io/topics/replication。比如 psync 是怎么做的,为什么 psync 会失败,你可以从这篇文章中找到答案。
【讨论】: