Redis Database(RDB)
断电或者宕机,那么内存数据库中的数据将会全部丢失。为了解决这个缺点,Redis提供了将内存数据持久化到硬盘,以及用持久化文件来恢复数据库数据的功能。Redis 支持两种形式的持久化,一种是RDB快照(snapshotting),另外一种是AOF(append-only-file)。
触发方式
image
在指定时间间隔将内存中的数据写入磁盘,也就是SNAPSHOTTING,恢复时直接将文件写入到内存中
步骤: Redis fork一个子进程来持久化,先将数据写入到临时文件中。待持久化过程结束了,再用这个临时文件替换上次持久化好的RDB文件。整个过程主进程是不进行任何IO操作的,确保了极高的性能。如果进行大规模数据恢复,且对数据恢复的完整性不是非常敏感,那RDB比AOF更加高效。RDB缺点是最后一次持久化的数据可能会丢失。
存储文件:
The filename where to dump the DB
dbfilename dump.rdb # 生产环境一般会进行额外备份
默认策略
save 900 1
save 300 10
save 60 10000
恢复RDB文件,放到redis启动目录就好了,会自动检测dump.rdb文件
127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/var/db/redis"
cp dump1.rdb dump.rdb
redis-server /usr/local/etc/redis.conf --daemonize yes
dump.rdb
(ENV) ☁ redis redis-cli
127.0.0.1:6379> keys *
1) "key2"
2) "key4"
3) "key3"
4) "key5"
5) "key1"
优点:
适合大规模数据恢复
对数据完整性要求不高 缺点:
需要一定时间间隔操作,如果redis意外宕机了,最后一次修改的数据就没有了
fork进程的时候,会占用一定的内存空间
APPEND ONLY MODE
image
image
默认不开启,需要手动进行配置
appendfsync always
appendfsync everysec
appendfsync no
如果文件出错:
(ENV) ☁ redis redis-server /usr/local/etc/redis.conf
22781:C 15 Oct 2021 22:51:39.072 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
22781:C 15 Oct 2021 22:51:39.072 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=22781, just started
22781:C 15 Oct 2021 22:51:39.072 # Configuration loaded
22781:M 15 Oct 2021 22:51:39.073 Increased maximum number of open files to 10032 (it was originally set to 256).
22781:M 15 Oct 2021 22:51:39.073 monotonic clock: POSIX clockgettime..-__ ''-._ _.-`
\/ ., ''-._
. `_. ''-._ Redis 6.2.5 (00000000/0) 64 bit .-` .-
`.
( ' , .- |
, ) Running in standalone mode
|-._
-...- __...-.
MARKDOWN_HASH03e3ff8a561e5bf969b7404f553cedd1MARKDOWNHASH
.-'| Port: 6379
| MARKDOWN_HASHaae926b3a25f971333c83dba766cfa9cMARKDOWNHASH
. / _.-' | PID: 22781MARKDOWN_HASHa423258d47e2c251989f3f9996ca7731MARKDOWNHASH
-. -./ _.-' _.-' |
-..-' .-'.-'|-._
-._
| MARKDOWN_HASH096aca4c4d9ff508d06757325c853259MARKDOWNHASH
-. .-'.-' | https://redis.ioMARKDOWN_HASHa423258d47e2c251989f3f9996ca7731MARKDOWNHASH
-.`-..-'.-' .-'
|MARKDOWN_HASH096aca4c4d9ff508d06757325c853259MARKDOWNHASH
-. -.__.-' _.-'_.-'| |
-..-'.-' .-'-._
-._ _.-'_.-' | -._
-._-._
-..-' .-'
`-. _.-'
`-.__.-'
22781:M 15 Oct 2021 22:51:39.075 # Server initialized
22781:M 15 Oct 2021 22:51:39.075 # Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix
(ENV) ☁ bin ls|grep redis
redis-benchmark
redis-check-aof
redis-check-rdb
redis-cli
redis-sentinel
redis-server
文件修复
(ENV) ☁ bin redis-check-aof /usr/local/var/db/redis/appendonly.aof --fix
Invalid argument: /usr/local/var/db/redis/appendonly.aof
(ENV) ☁ bin redis-check-aof /usr/local/var/db/redis/appendonly.aof --fix
(ENV) ☁ bin redis-check-aof --fix /usr/local/var/db/redis/appendonly.aof
0x 8a: Expected prefix '*', got: '6'
AOF analyzed: size=143, ok_up_to=138, ok_up_to_line=27, diff=5
This will shrink the AOF from 143 bytes, with 5 bytes, to 138 bytes
Continue? [y/N]: y
Successfully truncated AOF
image
如果文件太大,fork一个新的进程进行重写
优点缺点 优点:
每次修改都同步,文件完整性更好!
最多丢失1s的数据
从不同步,效率更高
缺点:
aof数据文件远远大雨rdb文件,修复速度相对于rdb也慢很多
image image