十大SEO网站外链建设误区,城乡住房建设部网站保证金,房地产在线开盘,wordpress主题加密RDB快照
RDB是一种快照存储持久化方式#xff0c;具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中#xff0c;默认保存的文件名为dump.rdb#xff0c;而在Redis服务器启动时#xff0c;会重新加载dump.rdb文件的数据到内存当中恢复数据。
开启RDB持久化方式
开启…RDB快照
RDB是一种快照存储持久化方式具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中默认保存的文件名为dump.rdb而在Redis服务器启动时会重新加载dump.rdb文件的数据到内存当中恢复数据。
开启RDB持久化方式
开启RDB持久化方式很简单客户端可以通过向Redis服务器发送save或bgsave命令让服务器生成rdb文件或者通过服务器配置文件指定触发RDB条件。每次执行都会将所有redis内存快照到一个新的rdb文件里并覆盖原有rdb快照文件。
方式一save命令 当客户端向服务器发送save命令请求进行持久化时服务器会阻塞save命令之后的其他客户端的请求直到数据同步完成。 如果数据量太大同步数据会执行很久而这期间Redis服务器也无法接收其他请求所以最好不要在生产环境使用save命令。
方式二bgsave命令 当客户端发服务发出bgsave命令时Redis服务器主进程会forks一个子进程来解决数据同步问题在将数据保存到rdb文件之后子进程会退出。
所以与save命令相比Redis服务器在处理bgsave采用子线程进行IO写入而主进程仍然可以接收其他请求但forks子进程是同步的所以forks子进程时一样不能接收其他请求这意味着如果forks一个子进程花费的时间太久(一般是很快的)bgsave命令仍然有阻塞其他客户的请求的情况发生。
我们可以控制单个Redis实例的最大内存来尽可能降低Redis在fork时的事件消耗。以及上面提到的自动触发的频率减少fork次数或者使用手动触发根据自己的机制来完成持久化。
方式三通过配置文件自动触发
自动触发的场景主要是有以下几点
1.根据我们的 save m n 配置规则自动触发 2.从节点全量复制时主节点发送rdb文件给从节点完成复制操作主节点会触发 bgsave 3.执行 debug reload 时 4.执行shutdown时如果没有开启aof也会触发。
这里我们讲的是根据配置文件自动触发 save和bgsave对比 RDB文件
前面介绍了三种让服务器生成rdb文件的方式无论是由主进程生成还是子进程来生成其过程如下
生成临时rdb文件并写入数据。
完成数据写入用临时文件替代正式rdb文件。
删除原来的db文件。
COW写时复制copy-on-write
fork创建出的子进程与父进程共享内存空间。也就是说如果子进程不对内存空间进行写入操作的话Redis的子进程只做数据落盘的操作也不会去写数据内存空间中的数据并不会复制给子进程这样创建子进程的速度就很快了(不用复制直接引用父进程的物理空间玩的是指针)。 当Redis父进程修改数据时父进程会将原先的数据复制一份生成新的副本然后修改父进程的指针指向新的数据此时父进程修改的新的数据不会影响到子进程。此时子进程的指针仍然指向旧的数据子进程看到的数据还是bgsave时候的数据。当下一次执行bgsave时新fork出来的子进程指针才会指向这次新的数据。 AOFappend-only file
与RDB存储某个时刻的快照不同AOF持久化方式会记录客户端对服务器的每一次写操作命令并将这些写操作以追加的方式保存到以后缀为aof文件中在Redis服务器重启时会加载并运行aof文件的命令以达到恢复数据的目的。
开启AOF持久化的方式
方式一bgrewriteaof命令 方式二通过配置文件自动触发
Redis默认不开启AOF持久化方式我们可以在配置文件中开启并进行更加详细的配置 重写
AOF将客户端的每一个写操作都追加到aof文件末尾比如对一个key多次执行incr命令这时候aof保存每一次命令到aof文件中aof文件会变得非常大。 这是一种resp协议格式数据星号后面的数字代表命令有多少个参数$号后面的数字代表这个参数有几个字符 手动执行重写命令BGREWRITEAOF
重写后AOF文件里如下将多个incr命令进行了合并 重写配置参数
AOF重写redis会fork出一个子进程去做(与bgsave命令类似)不会对redis正常命令处理有太多影响
auto‐aof‐rewrite‐min‐size 64mb #aof文件至少要达到64M才会自动重写文件太小恢复速度本来就 很快重写的意义不大
auto‐aof‐rewrite‐percentage 100 #aof文件自上一次重写后文件大小增长了100%则再次触发重写例如上一次重写的大小是64M那么下一次达到128M再做重写AOF重写流程图 在重写期间由于主进程依然在响应命令为了保证最终备份的完整性因此它依然会写入旧的AOF file中如果重写失败能够保证数据不丢失。
为了把重写期间响应的写入信息也写入到新的文件中因此也会为子进程保留一个buf防止新写的file丢失数据。
重写是直接把当前内存的数据生成对应命令并不需要读取老的AOF文件进行分析、命令合并。
不管是RDB还是AOF都是先写入一个临时文件然后通过 rename 完成文件的替换工作。
混合持久化
重启 Redis 时我们很少使用 RDB来恢复内存状态因为会丢失大量数据。我们通常使用 AOF 日志重放但是重放 AOF 日志性能相对 RDB来说要慢很多这样在 Redis 实例很大的情况下启动需要花费很长的时间。Redis 4.0 为了解决这个问题带来了一个新的持久化选项——混合持久化。通过如下配置可以开启混合持久化(前提必须先开启aof):
aof‐use‐rdb‐preambleyes #开启混合持久化如果开启了混合持久化AOF在重写时不再是单纯将内存数据转换为RESP命令写入AOF文件而是将重写这一刻之前的内存做RDB快照处理并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起都写入新的AOF文件新的文件一开始不叫appendonly.aof等到重写完新的AOF文件才会进行改名覆盖原有的AOF文件完成新旧两个AOF文件的替换。于是在 Redis 重启的时候可以先加载 RDB 的内容然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放因此重启效率大幅得到提升。
127.0.0.1:6379 set k 1
OK
127.0.0.1:6379 set k 2
OK
127.0.0.1:6379 BGREWRITEAOF
Background append only file rewriting started查看此时的appendonly.aof文件此时存放的是RDB的内容
[rootredis 6379]# cat appendonly.aof
REDIS0009 redis-ver5.0.7
edis-bitsctime%y_used-memaof-preamblek readcount Ri9$[rootredis 6379]#如果新增加了数据
127.0.0.1:6379 set k 3
OK那么新的数据会以为RESP命令的方式追加在后面
[rootredis 6379]# cat appendonly.aof
REDIS0009 redis-ver5.0.7
edis-bitsctime%y_used-memaof-preamblek readcount Ri9$*2
$6
SELECT
$1
0
*3
$3
set
$1
k
$1
3混合持久化AOF文件结构如下
从持久化中恢复数据
数据的备份、持久化做完了我们如何从这些持久化文件中恢复数据呢如果一台服务器上有既有RDB文件又有AOF文件该加载谁呢
其实想要从这些文件中恢复数据只需要重新启动Redis即可。我们还是通过图来了解这个流程
启动时会先检查AOF文件是否存在如果不存在就尝试加载RDB。那么为什么会优先加载AOF呢因为AOF保存的数据更完整通过上面的分析我们知道AOF基本上最多损失1s的数据。
RDB和AOF对比:
另外RBD不支持拉链只有一个dump.rdb文件