Redis核心技术与实战课程复习二
RDB
RDB和AOF一样,也是Redis的一种持久化方式,不过是使用快照的方式,即将Redis某一时刻的数据状态以文件的形式写入磁盘。
Redis有save和bgsave两个指令生成RDB文件
save和bgsave
- save:在主线程中执行,会阻塞主线程
- bgsave:由主线程fork出子进程执行,避免阻塞
生成RDB文件时写操作的问题
如果Redis没有其他任何操作。在生成RDB时执行写操作,会导致复制出的数据与生成RDB时的数据不一致,这是无法接受的,所以在这种情况下Redis只能执行读操作。
但是Redis可以借助操作系统的写时复制技术,即fork时子进程只拷贝主进程的内存页表,并不拷贝数据,只有在拷贝后主进程数据修改时才将对应的数据在子进程修改。fork出去以后,这段时间的写操作就开辟一块的新的内存记录这段时间的操作,RDB完之后再写入。
RDB的问题
当redis指令较多时,RDB相对于AOF来说持久化文件会小很多,但是RDB无法像AOF那样以较快的频率持久化,这就导致了如果使用RDB进行持久化发生宕机的话丢失的数据较多
RDB和AOF结合
Redis4.0提供了RDB和AOF结合持久化的功能,即在两次RDB之间的指令使用AOF进行持久化
主从模式(master-slave)
为了保证Redis的高可用性,Redis提供了主从模式,多个redis实例保存同一份数据,
写操作在主节点进行,写完之后由主节点同步给其他节点(从节点),读操作在所有节点都可以执行。
主从数据同步方式
第一次同步
- 从节点向主节点发送psync(?, -1)指令请求第一次数据同步,其中?表示主库的runID,因为第一次同步不知道主库的runID所以是?。-1是同步数据的偏移量,第一次为-1。
- 主节点收到从节点的同步需求后,fork出子进程生成RDB文件发送给从节点
- 在生成RDB文件过程中的指令主节点同样也会记录,在过程2执行完之后发送给从节点。
从节点过多如何解决
主-从-从模式,即主节点的从节点作为其他节点的主节点
主从节点连接断开如何解决
- 在Redis2.8之前,主从节点连接断开,进行全量复制
- 在Redis2.8及以后使用增量的方式进行同步。通过repl_backlog_buffer和偏移量完成增量同步,但是repl_backlog_buffer是一个环形buffer,所以在偏移量大于repl_backlog_buffer大小后,只能进行全量同步
- 默认配置repl-backlog-size 1mb