redis - "Disk-backed"复制如何在redis集群中工作

标签 redis replication

redis.conf 说:

1)Disk-backed:Redis master创建一个新进程写入RDB 磁盘上的文件。稍后文件由父级传输 递增地处理从站

就是不知道“父进程转给从进程”是什么意思?

谢谢

最佳答案

很简单。首先将 RDB 文件读入缓冲区,然后使用 socket.write 将其发送到正在监听的 salve 端口。

实现比我说的复杂。但这就是redis所做的。您可以引用 redis/src 中的 replication.c 以获取更多详细信息。

编辑:

是的,无磁盘机制只是使用子进程直接通过网络将 RDB 发送给从属,而不使用磁盘作为中间存储。
其实如果用磁盘来保存RDB,redis master可以同时服务很多slave,不用排队。一旦无盘复制服务于slave,如果另一个slave来了想要做一个full sync,它需要排队等待第一个slave完成。所以还有另一个设置 repl-diskless-sync-delay 来等待更多的从机来并行执行此操作。

而这两种方法只有在发生错误后才会发生。在正常情况下,redis master 和 salve 通过一根连接良好的线来复制 redis 命令 slave 以保持主从之间的相同。如果断线或从站掉下来,则需要执行部分重新同步操作以获取丢失的部分从站。如果无法实现 psync,它将尝试进行完全重新同步。完全重新同步就是我们所说的。

This is how a full synchronization works in more details:

The master starts a background saving process in order to produce an RDB file. At the same time it starts to buffer all new write commands received from the clients. When the background saving is complete, the master transfers the database file to the slave, which saves it on disk, and then loads it into memory. The master will then send all buffered commands to the slave. This is done as a stream of commands and is in the same format of the Redis protocol itself.

无盘复制只是一个新特性,在这种情况下支持完全重新同步以应对缓慢的磁盘压力。更多信息请引用https://redis.io/topics/replication。 .比如psync是怎么做的,为什么psync会失败,都可以从这篇文章中找到答案。

关于redis - "Disk-backed"复制如何在redis集群中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45800092/

相关文章:

node.js - 如何使用 NodeJs 在 Redis 中插入数据?

sql-server - 在具有不同名称且具有不同列名的两个表之间进行复制。是否有可能创建这样的复制

Mysql 数据库同步选项

asp.net - 使用 Booksleeve 维护一个开放的 Redis PubSub 订阅

MYsql 复制问题。 “错误表 xxx.xxx 不存在..甚至无法启动复制

php - MySQL 查询委托(delegate)/传输

PostgreSQL 可用性和合并

python-3.x - redis-py 在退出时不关闭线程

azure - 应用服务交换槽期间出现多个 Redis 连接异常(无可用连接)

java - 用于插入多个值的 Redis java api