🎈 持久化策略
RDB(内存快照)
AOF(追加文件)
🎈 RDB
-
内存快照(默认开启)
-
就是把某一时刻的数据和状态以文件的方式写到磁盘上,就是快照。这样一来即使故障宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。
-
这个快照文件称为 RDB 文件(dump.rdb),其中,RDB 就是 Redis DataBase 的缩写
分为自动触发和主动触发
-
自动触发:通过服务端的配置文件(redis.conf)指定触发 RDB 条件,本质是通过达到一定条件后自动触发持久化,这个条件规则就是 M 秒内 N 个 key 发生了变化。
-
主动触发:
save
和bgsave
命令让服务器生成 rdb 文件;
1、redis.conf 配置文件
#是否压缩rdb文件
rdbcompression yes
#rdb文件的名称
dbfilename redis-6379.rdb
#rdb文件保存目录,物理恢复,一定服务和备份分级隔离
dir ~/redis/
2、save
save 命令是同步操作,同步数据到磁盘上,阻塞
-
当客户端向服务器发送 save 命令请求进行持久化时,服务器会阻塞 save 命令之后的其他客户端的请求,直到数据同步完成
-
如果数据量太大,同步数据会执行很久,而这期间 Redis 服务器也无法接收其他请求,所以,最好不要在生产环境使用
save
命令。
3、bgsave
bgsave 命令是异步操作,异步将数据同步到磁盘上,不阻塞
-
当客户端发服务发出 bgsave 命令时,Redis 服务器主进程会 forks 一个子进程来数据同步,在将数据保存到 rdb 文件之后,子进程会退出。
-
所以,与 save 命令相比,Redis 服务器在处理 bgsave 采用子线程进行 IO 写入,而主进程仍然可以接收其他请求,但 forks 子进程是同步的,所以 forks 子进程时,一样不能接收其他请求,这意味着,如果 forks 一个子进程花费的时间太久(一般是很快的),bgsave 命令仍然有阻塞其他客户的请求的情况发生
fork:在 Linux 系统中,调用 fork() 时,会创建出一个新进程,称为子进程,子进程会拷贝父进程的 page table。如果进程占用的内存越大,进程的 page table 也会越大,那么 fork 也会占用更多的时间。如果 Redis 占用的内存很大,那么在 fork 子进程时,则会出现明显的停顿现象
4、哪些情况会触发 RDB 快照
-
配置文件中默认的快照配置(redis.conf);
-
手动
save
和bgsave
命令; -
执行
flushall/flushdb
命令也会产生 dump.rdb 文件,但是里面是空的,无意义; -
执行
shutdown
且没有设置开启 AOF 持久化; -
主从复制时,主节点自动;