概要
- Redis server 基于5.0.0的stable版本
- Client基于 Jedis 2.9.0
- Scala 基于 2.11.X
在系列的文章完成后,我们会了解redis的基本功能,实现scala语言对redis进行基本操作。
本文侧重理论是redis数据保存策略的重要环节。实战中,性能调优很多基于这些参数进行。
本文内容提要:
- redis 数据持久化策略
- redis持久化配置方式
数据持久化
redis是内存型数据库,也是作为缓存使用重要原因。数据存储在内存中,一个致命的缺陷是:如果服务器出现重启、宕机,数据不可恢复。持久化机制因数据恢复功能而存在。Redis服务重启后,从持久化的文件中加载数据。Redis支持2种数据持久化模式, RDB(Redis DataBase)
和AOF(append only file)
。持久化方式分别介绍配置、基本操作流程特点。
Redis服务支持2种持久化模式同时开启。同时开启时,重启服务默认加载AOF持久化的数据,原因后面会提到。
无论那种模式都使用fork函数开始子进程,进而开启持久化流程。另外,持久化过程中,若发生硬盘Io问题,都会导致阻塞。
1. RDB
-
RDB
配置# save <seconds> <changes>
save 900 1 #900秒内如果超过1个key被修改,则保存
save 300 10 #900秒内如果超过10个key被修改,则保存
save 60 10000 #60秒内如果超过10000 个key被修改,则保存stop-writes-on-bgsave-error yes #bgsave发生错误是否停止写入
rdbcompression yes #是否使用 LZF 压缩数据,减少文件大小
rdbchecksum yes #是否进行CRC64校验,开启会损失 10%性能
dbfilename dump.rdb #保存文件名称 dump.rdb
dir "/home/data/" #数据保存目录
-
RDB工作流程
RDB
通常指的是快照式数据存储,也支持手动触发数据存储。持久化实现逻辑:- 满足保存条件时, redis调用系统函数fork() ,创建一个子进程。
- 子进程将数据集写入到一个临时 RDB 文件中。
- 当子进程完成对临时RDB文件的写入时,redis 用新的临时RDB 文件替换原来的RDB 文件,并删除旧 RDB 文件。
RDB持久化数据保存的是fork时间点的服务的数据,在进行RDB操作时,Redis服务是阻塞状态的。对服务响应实时性要求很高,一般不使用RDB持久化。
持久化用临时替代旧文件,保证了即使在写入失败时,依然有一份完整的数据可供恢复。
-
RDB缺点
- RDB周期性持久化,不适合实时性要求,可能存在数据丢失。
2. AOF
-
AOF 配置
appendonly no #开启AOF模式
appendfilename "appendonly.aof" #保存的文件名
# 数据写的方式
# appendfsync always
appendfsync everysec
# appendfsync no
no-appendfsync-on-rewrite no #重写配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mbaof-load-truncated yes
aof-use-rdb-preamble yes
-
AOF 工作流程
AOF模式包括几个步骤: 命令写入、文件同步、文件重写、重启加载(在数据恢复时使用)。
- 所有写入命令会追加到缓冲区中
- AOF缓冲区根据对应的策略向硬盘做同步操作(见配置参数中同步策略)。
- 定期对AOF文件进行重写(重写也是通过fork子进程生成新的AOF文件)。
-
AOF 优缺点
- 更高的数据安全性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。
- 容灾。由于该机制对日志文件的写入操作采用的是append模式,因此写入时出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果写入了一半数据就出现了系统崩溃问题,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。
- 自动重写。如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。
- 持久化文件占用大存储空间。相同场景下,RDB重启恢复时间要快于AOF模式。
2种持久化模式都开启时,默认使用AOF数据是由其更高的数据安全性决定的。
往期传送门:
网友评论