数据库持久化
任何一种数据库都存在两种持久化或备份方式:
1、数据快照;
2、修改日志。
RDB简介
RDB文件本质上是一份内存快照,是把当前redis内存中的数据集快照写入磁盘,恢复时将快照文件直接读到内存里。
RDB优势:
1、RDB是一个非常紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集。这种文件非常适合用于进行备份和灾难恢复;
2、生成RDB时,redis主进程会fork()一个子进程处理所有工作,主进程不存在任何IO操作,同时能对外提供服务。
RDB缺陷:
1、在redis主线程fock()后的数据无法备份,做不到实时持久化,存在数据丢失风险。
RDB底层原理:
1、在触发RDB时,redis主线程首先判断当前是否有在执行save或bigsave或bgrewriteaof的子进程,有则直接返回;
2、如果没有,bgsave指令则调用fock()创建子线程,基于copy-on-write原理从主线程复制一个子线程,在这个复制过程中,redis是阻塞的,redis不能执行任何请求指令;
3、主进程完成fock()后,bgsave命令将返回"Background saving started"信息并不在阻塞主线程,主线程可以继续对外提供服务;
4、子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有RDB文件进行替换;
5、子进程完成后发送信号给主进程,父进程更新RDB状态信息。
RDB问题概述:
1 、RDB的过程中是否会停止对外提供服务?
2、RDB的过程中数据修改了,备份的是修改前的还是修改后的?
3、RDB时是不是先把内容中的所有KV复制一份,保证数据不会被修改?如果是复制一份,那redis的使用内存大小是否最大只能设置成系统内存大小的50%?
4、RDB快照是精确到某一个时刻的内存数据,还是一段时间内的内存数据?
5、同一时刻能否同时进行多哥RDB子进程?