Redis安全高效持久化

Redis持久化

Redis 为了内部数据安全考虑,会把本身的数据以文件的形式保存硬盘中一份,在服务器重启后会自动硬盘的数据恢复内存(Redis)里面

Redis持久化分为:

  • RDB 持久化方式
  • AOF 持久化方式

两种持久化可以同时开启

持久化的两种方式介绍

RBD介绍

RDB持久化把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,有手动触发和自动触发手动触发有save和bgsave两命令。

save命令:阻塞当前Redis,直到RDB持久化过程完成为止,若内存实例比较大会造成长时间阻塞,线上环境不建议用它
bgsave命令:redis进程执行fork操作创建子线程,由子线程完成持久化,阻塞时间很短(微秒级),是save的优化,在执行redis-cli shutdown关闭redis服务时,如果没有开启AOF持久化,自动执行bgsave;
显然bgsave是对save的优化。
bgsave运行流程

RDB 持久化优缺点
可以在指定的时间间隔内生成数据集的 时间点快照(point-in-time snapshot)。
优点:速度快,适合于用做备份,主从复制也是基于RDB持久化功能实现的。
缺点:会有数据丢失
rdb持久化核心配置参数:

1
2
3
4
5
6
vim /opt/redis_cluster/redis_6379/conf/redis_6379.co
dir /opt/redis_cluster/redis_6379/
dbfilename dump.rdb
save 900 1 #900秒(15分钟)内有1个更改
save 300 10 #300秒(5分钟)内有10个更改
save 60 10000 #60秒内有10000个更改

AOF介绍

AOF持久化流程:命令写入(append),文件同步(sync),文件重写(rewrite),重启加载(load);
流程说明:

  1. 所有的写入命令(set hset)会append追加到aof_buf缓冲区中
  2. AOF缓冲区向硬盘做sync同步
  3. 随着AOF文件越来越大,需定期对AOF文件rewrite重写,达到压缩
  4. 当redis服务重启,可load加载AOF文件进行恢复

AOF 持久化(append-only log file)优缺点:
记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。
优点:可以最大程度保证数据不丢
缺点:日志记录量级比较大

AOF持久化配置

1
2
3
4
5
6
7
8
appendonly yes          #是否打开aof日志功能
appendfsync always #每1个命令,都立即同步到aof
appendfsync everysec #每秒写1次
appendfsync no #写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.

no-appendfsync-on-rewrite yes #正在导出rdb快照的过程中,要不要停止同步
aofauto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写

面试题

redis 持久化方式有哪些?有什么区别?
rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能
aof:以追加(重写机制)的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog。
redis重启恢复加载rdb和aof同时存在时,优先加载aof。

Redis安全认证

redis默认开启了保护模式,只允许本地回环地址登录并访问数据库。
禁止protected-mode
protected-mode yes/no (保护模式,是否只允许本地访问)
添加密码requirepass {password}

由于redis并发能力极强,仅仅搞密码,攻击者可能在短期内发送大量猜密码的请求,很容易暴力破解,所以建议密码越长越好,比如20位。(密码在 conf文件里是明文,所以不用担心自己会忘记)

1
2
vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
requirepass 123456

验证:

1
2
3
4
5
6
7
8
9
10
11
### 方法一
redis-cli -a 123456
127.0.0.1:6379> set k1 v1
OK

### 方法二
redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> set k2 v2
OK