[TOC]



0x02 数据持久化

描述:Redis是将数据存储在内存之中所以其读写效率非常高,但是往往事物都不是那么美好,当由于某些不可抗力导致机器宕机、redis服务停止此时您在内存中的数据将完全丢失;
为了使Redis在重启后仍能保证数据不丢失我们就需要对其进行设置持久化存储,使其将内存的数据通过某种方式存入磁盘中,当Redis服务端重启后便会从该磁盘中进行读取数据进而恢复Redis中的数据;

Redis支持两种持久化方式:

  • (1) RDB 持久化(默认支持):该机制是指在指定的时间间隔内将内存中数据集写入到磁盘;
  • (2) AOF 持久化:该机制将以日志的形式记录服务器所处理的每一个写操作,同时在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据完整;
  • (3) 无持久化: 将Redis作为一个临时缓存,并将数据存放到memcached之中;

TIPS:

  • Redis可以同时使用RDB和AOF方式来保证,重启后Redis服务器中的数据完整;
1.RDB 方式

优势

  • 1) 该方式会将内存中的数据保存一个文件中默认dump.rdb,这对于文件备份而言是非常完美的,通过备份策略来保证数据的完整性,同时可以通过定时任务打包该数据文件就可以转移到其它存储介质;
  • 2) 性能最大化,Redis的服务进程在做持久化的时候,它将fork出子线程然后由它完成持久化工作,它可以极大的避免服务进程执行IO操作了;
  • 3) 相比较于AOF机制下如果数据集很大,RDB的启动效率就会更高

劣势

  • 1) 它保证了数据的持久化但是没法一定保证数据的高可用性(即最大限度的避免数据丢失),比如当在持久化数据之前出现宕机,那么此时没有来得及写入的数据将会被丢失;
  • 2) 由于RDB是通过Fork子进程来协助完成数据持久化工作的,因此当数据集较大的时候会导致整个服务器停止服务几百毫秒到1秒钟之间(可通过集群方式解决);

配置说明:
$vim redis.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cat > redis.conf <<'EOF'
#密码认证
requirepass WeiyiGeek.top

#默认开启如果需要关闭把save ""取消注释即可
#save ""
#save 3600 1 #每3600秒至少有一个Key发生变化时候则dump内存快照
save 900 1 #900秒(15分钟)至少有1条key变化,其他同理
save 300 10
save 60 10000 #每60描述至少有1000个key发生变化时候则dump内存快照

#RDB 生成的文件名称
dbfilename dump.rdb
#保存存放路径
dir ./

#备份进程出错时,主进程停止接受写入操作,默认yes
stop-writes-on-bgsave-error yes
#是否压缩,会占用部分cpu资源,默认yes
rdbcompression yes
#RDB自动触发策略是否启用,默认为yes
rdb-save-incremental-fsync yes
EOF

实际案例:

1
2
3
4
5
6
7
8
9
10
#1.如上面配置所示,按配置情况触发
比如在Redis服务终止的时候执行

#2.手动保存数据连接redis后使用命令save、bgsave触发
127.0.0.1:6379> SAVE #save:会阻塞redis服务器,直到完成持久化
OK
127.0.0.1:6379> quit
[email protected]:/data# ls
dump.rdb
bgsave:会fork一个子进程,由子进程进行持久化。


2.AOF 方式

优势

  • 1) 该机制可以带来更高的数据安全性,即数据持久化; 常规三种同步策略即每秒同步(异步完成效率高)、每修改同步(同步插入修改删除操作效率最低)和不同步;
  • 2) 由于该机制对日志文件的写入操作采用的是append模式,即使过程中出现宕机也不会破坏日志文件中已经存在的内容,如果数据不完整在Redis下次启动之前可以通过redis-check-aof解决数据一致性问题;
  • 3) 如果日志文件体积过大可以启动rewrite机制,即redis以append模式不断的将修改数据写到老的磁盘文件中,同时创建新文件记录期间有哪些修改命令执行,此项极大的保证数据的安全性;
  • 4) AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作(可通过此文件完成数据的重构

劣势

  • 1) 对于相同数量的数据集而言AOF文件大于RDB文件;
  • 2) 根据同步策略的不同,AOF在运行效率上往往会慢于RDB,总的来说每秒同步策略的效率还是比较高的

配置说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cat > redis.conf <<'EOF'
#是否开启AOF,默认为否
appendonly no

#AOF文件名字及路径,若RDB路径已设置这里可不设置
appendfilename "appendonly.aof"
dir ./

#AOF的3种模式,no(使用系统缓存处理,快)、always(记录全部操作,慢但比较安全)、everysec(每秒同步,折中方案,默认使用)
appendfsync everysec

#重写期间是否同步数据,默认为no
no-appendfsync-on-rewrite no

#自动触发重写的配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

#AOF重写策略是否启用,默认为yes
aof-rewrite-incremental-fsync yes

#加载AOF时如果报错则会继续但写入log,如果为no则不会继续
aof-load-truncated yes

#Redis5.0有的功能AOF重写及恢复可以使用RDB文件及AOF文件,速度更快,默认yes
aof-use-rdb-preamble yes
EOF

实际案例AOF重写:
因为AOF为记录每次的操作,会导致实际记录不多但文件过大,所以需要做重写操作

  • 1)AOF自动重写:按配置文件条件自动触发重写
  • 2)AOF手动重写:连接redis使用命令bgrewriteaof,进行手动重写
    1
    2
    127.0.0.1:6379> BGREWRITEAOF
    Background append only file rewriting started